gperf-3.0.4/0000775000000000000000000000000011141541070011313 5ustar rootrootgperf-3.0.4/doc/0000775000000000000000000000000011141541070012060 5ustar rootrootgperf-3.0.4/doc/gperf_10.html0000664000000000000000000001132011141312111014336 0ustar rootroot 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 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
  • 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.0.4/doc/gperf.dvi0000664000000000000000000040613411141312111013667 0ustar rootroot÷ƒ’À;è TeX output 2009.02.01:1220‹ÿÿÿÿŸòŽ ƒ33 þšà‘GóGÂÖN ¼j cmbx12ëGUser's–ƧGuide“to“óJ߆µT¼j cmtt12ëJgperf“ëG3.0.4Ž‘GŸ ›¥‰±ž¸Ÿ šª’ßpÍó2Kñ`y ó3 cmr10ÝThe–¦fGNU“P²!erfect“Hash“F‘ÿeunction“GeneratorŽŸ ’Edition–¦f3.0.4,“1“F‘ÿeebruary“2009Ž ‘.ÑóYÂÖN ff cmbx12ëYDouglas–ffC.“ScŒÌhmidtŽŸBruno‘ffHaibleŽŸ‰±ž¸ŽŒ‹*ŸòŽ ƒ33 ÿpÞñ‘GÝCop•²!yrigh“t‘±ž«‚cŽŽŽ‘¦fó;!",š ó3 cmsy10æ ŽŽŽŽ‘@Ý1989-2009–¦fF›ÿeree“Soft•²!w“are–¦fF˜oundation,“Inc.ޤ33‘GP•²!ermission›Þ²is‘Þ±gran“ted˜to‘Þ±mak“e˜and˜distribute‘Þ±v“erbatim˜copies˜of‘Þ±this˜man“ual‘Þ±pro“vided˜theŽ© 33‘Gcop•²!yrigh“t–¦fnotice“and“this“pMÞermission“notice“are“preserv²!ed“on“all“copies.Ž¡‘GP•²!ermission›—.is‘—-gran“ted˜to‘—-cop“y˜and˜distribute‘—-moMÞdi ed˜v“ersions˜of‘—-this˜man“ual‘—-under˜theަ‘Gconditions–8for“vš²!erbatim“cop˜ying,‘pro˜vided“also“that“the“section“en˜titled‘8\GNU‘8)Generalަ‘GPublic–7ÌLicense"“is“included›7Ëexactly“as“in“the“original,‘Mëand“pro²!vided˜that“the“en²!tire“resultingަ‘Gderiv•²!ed›¦fw“ork˜is˜distributed˜under˜the˜terms˜of˜a˜pMÞermission˜notice˜iden“tical˜to˜this˜one.Ž¡‘GPš²!ermission–ûris“gran˜ted“to‘ûqcop˜y“and“distribute“translations“of“this‘ûqman˜ual“in˜to“another“lan-ަ‘Gguage,‘³under–}Mthe“abšMÞo•²!v“e–}Mconditions“for‘}Nmo˜di ed“vš²!ersions,‘³except“that‘}Nthe“section“en˜titledަ‘G\GNU‘=ÊGeneral–=ñPublic›=òLicense"“ma²!y“bMÞe“included“in“a“translation˜appro•²!v“ed›=ñb“y˜the˜authorަ‘Ginstead–¦fof“in“the“original“English.ŽŽŒ‹¬Ÿò‘GÝGNU–¦fGENERAL“PUBLIC“LICENSE’÷QV1ŽŽŽ ƒ33 ý ÌÍ‘GóPÂÖN G® cmbx12ëPGNU–z³GENERAL“PUBLIC“LICENSEŽŽŸÌÎ’±àjÝV‘ÿeersion–¦f3,“29“June“2007Ž©‘.ùœCop•²!yrigh“t‘±ž«‚cŽŽŽ‘¦fæ ŽŽŽŽ‘@Ý2007–¦fF›ÿeree“Soft•²!w“are–¦fF˜oundation,“Inc.“ó3ßêto˜the“whole“of˜the“w²!ork,‘ý=and“all˜its“parts,Ž¡‘=nregardless– of› €ho²!w“they“are˜pac²!k‘ÿdDaged.‘-This“License˜giv²!es“no“pMÞermission˜to“licenseŽ¡‘=nthe–¿œwš²!ork“in“an˜y“other‘¿w˜a˜y‘ÿe,‘Åébut“it“doMÞes“not“in˜v‘ÿdDalidate‘¿suc˜h“pMÞermission“if“y˜ou“ha˜v˜eŽ¡‘=nseparately–¦freceiv²!ed“it.ަ‘-Õd.Ž‘=nIf–n°the›n±w²!ork“has˜in•²!teractiv“e‘n°user˜in“terfaces,‘ Âeac“h˜m“ust‘n°displa“y˜Appropriate‘n°LegalŽ¡‘=nNotices;‘™Èho•²!w“ev“er,‘FŒif–óRthe“Program“has“in•²!teractiv“e›óRin“terfaces˜that˜do˜not˜displa“yŽ¡‘=nAppropriate–¦fLegal“Notices,“yš²!our“w˜ork“need“not“mak˜e“them“do“so.ŽŸJÖ‘'¿«A‘‡Scompilation–‡of“a“co•²!v“ered›‡w“ork˜with˜other˜separate˜and‘‡ŽindepMÞenden“t˜w“orks,‘¿Öwhic“hŽ¡‘'¿«are–Lnot“bš²!y“their“nature“extensions“of“the“co˜v˜ered“w˜ork,‘u|and“whic˜h“are“not“com˜binedŽ¡‘'¿«with–Uüit›Uýsuc²!h“as˜to“form“a˜larger“program,‘fin“or“on˜a“v²!olume“of˜a“storage˜or“distributionŽ¡‘'¿«medium,‘N is–ùPcalled“an“\aggregate"“if‘ùOthe“compilation“and“its“resulting“cop•²!yrigh“t‘ùPareŽ¡‘'¿«not–®Ìused“to›®Ílimit“the“access“or“legal˜righ²!ts“of“the“compilation's“users˜bMÞey²!ond“what“theŽ¡‘'¿«individual–2§wš²!orks“pMÞermit.‘‚ Inclusion“of“a“co˜v˜ered“w˜ork“in“an“aggregate“doMÞes“not“causeŽ¡‘'¿«this–¦fLicense“to“apply“to“the“other“parts“of“the“aggregate.ŽŸ?‘-6.Ž‘'¿«Con•²!v“eying–¦fNon-Source“F‘ÿeorms.ަ‘'¿«Y‘ÿeou–vËmaš²!y“con˜v˜ey‘vÌa“co˜v˜ered“w˜ork“in›vÌob‘›»ject“coMÞde“form“under˜the“terms“of“sections˜4“andŽ¡‘'¿«5,‘õÆpro•²!vided‘²´that›²³y“ou˜also˜con“v“ey‘²´the˜mac“hine-readable˜CorrespMÞonding‘²´Source˜underŽ¡‘'¿«the–¦fterms“of“this“License,“in“one“of“these“w•²!a“ys:ŽŽŒ‹8sŸò‘GÝGNU–¦fGENERAL“PUBLIC“LICENSE’÷QV5ŽŽŽ ƒ33 ý ÌÍ‘-¯‘a.Ž‘=nCon•²!v“ey–´uthe“ob‘›»ject“cošMÞde“in,‘·ùor“em²!b˜o˜died“in,‘·ùa“ph²!ysical“pro˜duct“(including“a“ph²!ys-ޤ 33‘=nical–@#distribution›@"medium),‘f‘accompanied“b²!y˜the“CorrespMÞonding˜Source“ xed˜on“aŽ¡‘=ndurable–¦fphš²!ysical“medium“customarily“used“for“soft˜w˜are“in˜terc˜hange.Ž©€‘-Õb.Ž‘=nCon•²!v“ey–wªthe›w©ob‘›»ject“co•MÞde˜in,‘or˜emš²!b“o“died–wªin,‘a“ph˜ysical›w©proMÞduct“(including˜a“ph²!ysi-Ž¡‘=ncal–ÒÜdistribution›ÒÛmedium),‘Ýùaccompanied“b²!y˜a“written“o er,‘Ýùv‘ÿdDalid˜for“at˜least“threeŽ¡‘=nyš²!ears–!Ÿand“v‘ÿdDalid“for‘! as“long“as“y˜ou“o er“spare“parts“or‘! customer“suppMÞort“for“thatŽ¡‘=npro•MÞduct›ÀÕmo“del,‘Çqto˜giv•²!e˜an“y“one˜who˜p•MÞossesses˜the˜ob‘›»ject˜co“de˜either˜(1)˜a˜cop²!y˜ofŽ¡‘=nthe–á)CorrespMÞonding›á(Source“for“all˜the“soft•²!w“are˜in–á)the“proMÞduct˜that“is“co•²!v“ered˜b“y‘á)thisŽ¡‘=nLicense,‘6on–†êa›†édurable“ph²!ysical“medium“customarily“used˜for“soft•²!w“are‘†êin“terc“hange,Ž¡‘=nfor–9_a“price“no“more“than“yš²!our‘9^reasonable“cost“of“ph˜ysically“pMÞerforming“this“con-Ž¡‘=nvš²!eying–ðof“source,‘or“(2)‘ðaccess“to“cop˜y“the“CorrespMÞonding“Source‘ðfrom“a“net˜w˜orkŽ¡‘=nservš²!er–¦fat“no“c˜harge.ަ‘.KMc.Ž‘=nCon•²!v“ey–©Ëindividual›©Êcopies“of˜the“ob‘›»ject˜coMÞde“with˜a“cop²!y˜of“the˜written“o er˜toŽ¡‘=nproš²!vide–j¿the‘j¾CorrespMÞonding“Source.‘*çThis“alternativ˜e“is“allo˜w˜ed‘j¾only“oMÞccasionallyŽ¡‘=nand–…+noncommercially‘ÿe,‘‹Ðand“only“if“yš²!ou“receiv˜ed“the“ob‘›»ject‘…*coMÞde“with“suc˜h“an“o er,Ž¡‘=nin–¦faccord“with“subsection“6b.ަ‘-Õd.Ž‘=nCon•²!v“ey–R‡the›Rˆob‘›»ject“coMÞde“b²!y˜o ering“access“from“a˜designated“place“(gratis˜or“forŽ¡‘=na–¯´cš²!harge),‘òand“o er‘¯³equiv‘ÿdDalen˜t“access›¯³to“the“CorrespMÞonding˜Source“in˜the“sameŽ¡‘=nw•²!a“y–†pthrough“the“same›†oplace“at“no“further“c²!harge.‘Ó6Y‘ÿeou˜need“not“require“recipien²!tsŽ¡‘=nto–þcop²!y“the›ÿCorrespMÞonding“Source“along“with“the˜ob‘›»ject“coMÞde.‘ù¥If˜the“place“toŽ¡‘=ncop²!y–¢%the›¢$ob‘›»ject“coMÞde“is˜a“net•²!w“ork‘¢%serv“er,‘áthe˜CorrespMÞonding–¢%Source“ma²!y˜bMÞe“onŽ¡‘=na–VÍdi erenš²!t“serv˜er“(opMÞerated“b˜y“y˜ou“or‘VÌa“third“part˜y)“that“suppMÞorts“equiv‘ÿdDalen˜tŽ¡‘=ncop•²!ying›Žfacilities,‘+pro“vided˜y“ou˜main“tain˜clear˜directions‘next˜to˜the˜ob‘›»ject˜coMÞdeŽ¡‘=nsa²!ying–8Æwhere›8Åto“ nd“the˜CorrespMÞonding“Source.‘”üRegardless“of“what˜serv²!er“hostsŽ¡‘=nthe–ñ¤CorrespMÞonding“Source,‘ty²!ou“remain›ñ¥obligated“to“ensure“that“it˜is“a²!v‘ÿdDailable“forŽ¡‘=nas–¦flong“as“needed“to“satisfy“these“requiremen²!ts.ަ‘.KMe.Ž‘=nCon•²!v“ey–Ìüthe›Ìýob‘›»ject“coMÞde“using˜p•MÞeer-to-p“eer–Ìütransmission,‘øxproš²!vided“y˜ou‘Ìýinform“otherŽ¡‘=npšMÞeers–íwhere‘îthe“ob‘›»ject“co˜de‘îand“Corresp˜onding“Source“of›îthe“w²!ork“are˜bMÞeing“o eredŽ¡‘=nto–¦fthe“general“public“at“no“c²!harge“under“subsection“6d.ŽŸÌΑ'¿«A‘$separable–$0pMÞortion›$/of“the“ob‘›»ject˜coMÞde,‘C¢whose“source˜coMÞde“is˜excluded“from˜the“Cor-Ž¡‘'¿«respšMÞonding–åùSource“as“a“System“Library‘ÿe,‘õÝneed“not“b˜e“included“in“con•²!v“eying–åùthe“ob‘›»jectŽ¡‘'¿«coMÞde‘¦fw²!ork.ަ‘'¿«A‘Ì\User–ÌProMÞduct"“is“either›Ì(1)“a“\consumer˜proMÞduct",‘ÕŒwhicš²!h“means“an˜y‘Ìtangible“pMÞer-Ž¡‘'¿«sonal–öƒpropMÞertš²!y“whic˜h“is›ö„normally“used“for“pMÞersonal,– Šfamily‘ÿe,“or˜household‘öƒpurpMÞoses,“orŽ¡‘'¿«(2)–õòan²!ything›õódesigned“or˜sold“for˜incorpMÞoration“in²!to˜a“dw²!elling.‘£ In˜determining“whetherŽ¡‘'¿«a–‡xproMÞduct›‡wis“a˜consumer“proMÞduct,‘§doubtful˜cases“shall˜bMÞe“resolv²!ed˜in“fa•²!v“or˜of‘‡xco“v“erage.Ž¡‘'¿«F‘ÿeor–Òa›Ñparticular“proMÞduct“receiv•²!ed˜b“y–Òa“particular˜user,‘X¬\normally“used"“refers˜to“aŽ¡‘'¿«t²!ypical–·'or“common›·&use“of“that“class“of“proMÞduct,‘ûVregardless“of“the“status˜of“the“par-Ž¡‘'¿«ticular–7­user“or›7®of“the“w•²!a“y‘7­in˜whic“h–7­the“particular“user“actually˜uses,‘[þor˜expMÞects“or“isŽ¡‘'¿«expšMÞected‘ÍLto–ÍMuse,‘×the“pro˜duct.‘RA‘ÍBpro˜duct›ÍLis“a˜consumer˜proMÞduct˜regardless“of˜whetherŽ¡‘'¿«the–ö proMÞduct›öŸhas“substan²!tial˜commercial,‘ ®industrial“or˜non-consumer“uses,‘ ­unless“suc²!hŽ¡‘'¿«uses–¦frepresenš²!t“the“only“signi can˜t“mošMÞde“of“use“of“the“pro˜duct.ަ‘'¿«\Installation–w€Information"›wfor“a“User˜ProMÞduct“means“an²!y˜metho•MÞds,›€ápro“cedures,˜autho-Ž¡‘'¿«rization–Ð`k²!eys,‘û-or“other›Ð_information“required˜to“install˜and“execute˜moMÞdi ed“v²!ersions˜of“aŽ¡‘'¿«co•²!v“ered›É|w“ork˜in˜that˜User˜Pro•MÞduct˜from˜a˜mo“di ed˜v²!ersion˜of˜its˜Corresp“onding˜Source.ŽŽŒ‹I]Ÿò‘GÝGNU–¦fGENERAL“PUBLIC“LICENSE’÷QV6ŽŽŽ ƒ33 ý ÌÍ‘'¿«The–©Âinformation›©Ãm²!ust“suce“to“ensure˜that“the“con•²!tin“ued–©Âfunctioning˜of“the“moMÞdi edޤ 33‘'¿«ob‘›»ject–óÆcoMÞde›óÇis“in“no˜case“prev•²!en“ted–óÆor“in²!terfered˜with“solely“b•MÞecause˜mo“di cation‘óÆhasŽ¡‘'¿«bMÞeen‘¦fmade.Ž©× ‘'¿«If›¬¹y•²!ou‘¬ºcon“v“ey˜an–¬ºob‘›»ject˜coMÞde“w²!ork˜under“this˜section“in,–îNor˜with,“or‘¬ºspMÞeci cally˜forŽ¡‘'¿«use–²@in,›õ6a‘²AUser“ProMÞduct,˜and“the›²Acon•²!v“eying–²@oMÞccurs“as“part“of“a˜transaction“in“whic²!hŽ¡‘'¿«the–Jrigh²!t“of›JpMÞossession“and“use“of“the˜User“ProMÞduct“is“transferred“to˜the“recipien²!t“inŽ¡‘'¿«p•MÞerp“etuitš²!y–6;or“for“a“ xed“term“(regardless“of“ho˜w“the“transaction“is“c˜haracterized),Ž¡‘'¿«the–­&CorrespšMÞonding“Source‘­'con•²!v“ey“ed–­&under“this“section“m²!ust“b˜e‘­'accompanied“b²!y“theŽ¡‘'¿«Installation–1Information.‘H=But“this“requiremenš²!t“doMÞes“not“apply“if‘0neither“y˜ou“nor“an˜yŽ¡‘'¿«third–}Wpartš²!y“retains“the‘}Vabilit˜y“to“install“mošMÞdi ed“ob‘›»ject“co˜de“on‘}Vthe“User“Pro˜duct“(forŽ¡‘'¿«example,–¦fthe“wš²!ork“has“bMÞeen“installed“in“R˜OM).ަ‘'¿«The–šCrequiremenš²!t“to“pro˜vide“Installation“Information‘šBdoMÞes“not“include“a“requiremen˜tŽ¡‘'¿«to›Êzcon•²!tin“ue‘Êyto˜pro“vide˜suppMÞort˜service,‘Ó~w“arran“t“y‘ÿe,‘Óor˜upMÞdates‘Êyfor˜a˜w“ork˜that‘Êyhas˜bMÞeenŽ¡‘'¿«moMÞdi ed–™Šor›™‰installed“b²!y˜the“recipien²!t,‘ÖQor“for˜the“User˜ProMÞduct“in˜whic²!h“it˜has“bMÞeenŽ¡‘'¿«moMÞdi ed–¢or›¢installed.‘ÜnAccess“to˜a“net•²!w“ork‘¢ma“y˜bMÞe–¢denied“when“the˜moMÞdi cation“itselfŽ¡‘'¿«materially–¥èand“advš²!ersely“a ects“the“opMÞeration“of‘¥çthe“net˜w˜ork“or“violates“the“rules“andŽ¡‘'¿«protoMÞcols–¦ffor“commš²!unication“across“the“net˜w˜ork.ަ‘'¿«CorrespMÞonding–N¼Source“con•²!v“ey“ed,›`Dand–N¼Installation‘N»Information“pro²!vided,˜in“accord“withŽ¡‘'¿«this– ýsection“m²!ust› þbMÞe“in“a“format“that˜is“publicly“doMÞcumen²!ted“(and˜with“an“implemen²!ta-Ž¡‘'¿«tion–Esaš²!v‘ÿdDailable“to“the“public“in“source“coMÞde“form),‘X×and“m˜ust“require“no“spMÞecial“passw˜ordŽ¡‘'¿«or–¦fkš²!ey“for“unpac˜king,“reading“or“cop˜ying.ަ‘-7.Ž‘'¿«Additional‘¦fT‘ÿeerms.ŽŸ× ‘'¿«\Additional–PÜpMÞermissions"›PÝare“terms“that˜supplemen²!t“the“terms˜of“this“License˜b²!y“mak-Ž¡‘'¿«ing–æÝexceptions“from“one“or“more“of‘æÞits“conditions.‘ŸBAdditional“pMÞermissions“that“areŽ¡‘'¿«applicable–”%to“the“en²!tire›”$Program“shall“bMÞe“treated“as“though“they˜w²!ere“included“in“thisŽ¡‘'¿«License,‘-/to–:the“extenš²!t“that“they“are“v‘ÿdDalid“under“applicable“la˜w.‘!YIf“additional“pMÞermis-Ž¡‘'¿«sions–Napply“only›Nto“part“of“the˜Program,‘_Âthat˜part“ma²!y“bMÞe“used˜separately“under“thoseŽ¡‘'¿«pMÞermissions,‘Ýbut–Ò!the“enš²!tire“Program‘Ò remains“go˜v˜erned“b˜y“this‘Ò License“without“regardŽ¡‘'¿«to–¦fthe“additional“pMÞermissions.ަ‘'¿«When›gOy•²!ou‘gPcon“v“ey˜a‘gPcop“y˜of‘gPa˜co“v“ered›gPw“ork,‘׉y“ou˜ma“y‘gOat˜y“our‘gOoption˜remo“v“e‘gOan“yŽ¡‘'¿«additional–‡ pMÞermissions›‡ from“that“cop²!y‘ÿe,‘Ror˜from“an²!y“part“of˜it.‘Ój(Additional“pMÞermissionsŽ¡‘'¿«ma²!y–ÚbMÞe›Úwritten“to˜require“their˜oš²!wn“remo˜v‘ÿdDal›Úin“certain˜cases“when˜y²!ou“moMÞdify˜theŽ¡‘'¿«w•²!ork.)‘©ßY‘ÿeou›êfma“y–êgplace“additional˜pMÞermissions“on˜material,‘ûgadded“b•²!y˜y“ou–êgto˜a“co•²!v“eredŽ¡‘'¿«wš²!ork,–¦ffor“whic˜h“y˜ou“ha˜v˜e“or“can“giv˜e“appropriate“cop˜yrigh˜t“pMÞermission.ަ‘'¿«Not•²!withstanding›f¢an“y˜other˜pro“vision˜of˜this˜License,‘sbfor˜material˜y“ou˜add˜to˜a˜co“v“eredŽ¡‘'¿«w•²!ork,‘¿Ðy“ou›‡ˆma“y˜(if˜authorized˜b“y˜the‘‡‡cop“yrigh“t˜holders˜of˜that˜material)˜supplemen“tŽ¡‘'¿«the–¦fterms“of“this“License“with“terms:ަ‘-¯‘a.Ž‘=nDisclaiming›ƒúw•²!arran“t“y˜or‘ƒùlimiting˜liabilit“y˜di eren“tly˜from˜the˜terms‘ƒùof˜sections˜15Ž¡‘=nand–¦f16“of“this“License;“orަ‘-Õb.Ž‘=nRequiring–­¤preserv‘ÿdDation“of›­¥spMÞeci ed“reasonable“legal“notices˜or“author“attributionsŽ¡‘=nin–ú that“material“or›ú in“the“Appropriate“Legal“Notices“displa•²!y“ed˜b“y›ú w“orks˜con“tainingŽ¡‘=nit;‘¦forަ‘.KMc.Ž‘=nProhibiting–Јmisrepresen²!tation›Љof“the“origin˜of“that˜material,‘ûNor“requiring˜that“moMÞd-Ž¡‘=ni ed–§Òvš²!ersions“of‘§Ósuc˜h“material“bMÞe“mark˜ed‘§Óin“reasonable“w˜a˜ys“as‘§Ódi eren˜t“from“theŽ¡‘=noriginal–¦fv²!ersion;“orŽŽŒ‹\Ÿò‘GÝGNU–¦fGENERAL“PUBLIC“LICENSE’÷QV7ŽŽŽ ƒ33 ý ÌÍ‘-Õd.Ž‘=nLimiting–ó§the“use“for›ó¦publicit²!y“purpMÞoses“of“names“of“licensors˜or“authors“of“theޤ 33‘=nmaterial;‘¦forŽ©?‘.KMe.Ž‘=nDeclining–D¯to“granš²!t“righ˜ts‘D°under“trademark“la˜w“for“use“of‘D°some“trade“names,‘X:trade-Ž¡‘=nmarks,–¦for“service“marks;“orŽŸ?‘/Тf.Ž‘=nRequiring–#´indemni cation›#µof“licensors“and˜authors“of˜that“material“b•²!y˜an“y“one‘#´whoŽ¡‘=ncon•²!v“eys–/#the“material“(or“moMÞdi ed“vš²!ersions‘/"of“it)“with“con˜tractual“assumptionsŽ¡‘=nof–ºÓliabilitš²!y“to‘ºÒthe“recipien˜t,‘ÿífor“an˜y“liabilit˜y“that‘ºÒthese“con˜tractual“assumptionsŽ¡‘=ndirectly–¦fimpMÞose“on“those“licensors“and“authors.ŽŸJÖ‘'¿«All–Ó‹other›ÓŠnon-pMÞermissiv²!e“additional“terms˜are“considered“\further˜restrictions"“withinŽ¡‘'¿«the–AÎmeaning“of“section›AÏ10.‘°If“the“Program“as“y•²!ou˜receiv“ed–AÎit,›h¨or“an²!y“part“of“it,˜con-Ž¡‘'¿«tains–H a›H¡notice“stating˜that“it˜is“go•²!v“erned˜b“y–H this˜License“along˜with“a˜term“that˜is“aŽ¡‘'¿«further–Erestriction,‘/äyš²!ou“ma˜y‘Dremo˜v˜e“that–Dterm.‘¬}If“a‘Elicense“doMÞcumen˜t‘Econ˜tains“a‘EfurtherŽ¡‘'¿«restriction–èSbut›èRpMÞermits“relicensing“or˜con•²!v“eying–èSunder“this˜License,‘øÎyš²!ou“ma˜y“add‘èRto“aŽ¡‘'¿«co•²!v“ered›ÛFw“ork‘ÛEmaterial˜go“v“erned‘ÛEb“y˜the–ÛEterms˜of“that˜license“doMÞcumen•²!t,‘è}pro“vided˜thatŽ¡‘'¿«the–¦ffurther“restriction“doMÞes“not“survivš²!e“suc˜h“relicensing“or“con˜v˜eying.ަ‘'¿«If–¢Cyš²!ou“add“terms“to“a‘¢Dco˜v˜ered“w˜ork“in“accord“with“this“section,‘£y˜ou“m˜ust“place,‘£in“theŽ¡‘'¿«relev‘ÿdDanš²!t–source‘ les,‘”!a“statemen˜t›of“the˜additional“terms˜that“apply˜to“those˜ les,‘”!or“aŽ¡‘'¿«notice–¦findicating“where“to“ nd“the“applicable“terms.ަ‘'¿«Additional–abterms,‘ pšMÞermissiv²!e“or“non-p˜ermissiv•²!e,‘!ma“y–abb˜e“stated“in‘aathe“form“of“a“sep-Ž¡‘'¿«arately–…Øwritten›…Ùlicense,‘½µor“stated“as˜exceptions;‘õ‘the˜abMÞo•²!v“e‘…Ørequiremen“ts˜apply‘…ØeitherŽ¡‘'¿«w•²!a“y‘ÿe.ŽŸ?‘-8.Ž‘'¿«T‘ÿeermination.ަ‘'¿«Y‘ÿeou–º¢maš²!y“not“propagate‘º£or“moMÞdify“a“co˜v˜ered“w˜ork“except‘º£as“expressly“pro˜vided“un-Ž¡‘'¿«der–rthis›ržLicense.‘BƒAn²!y“attempt“otherwise˜to“propagate“or˜moMÞdify“it“is˜v²!oid,‘¥«and“willŽ¡‘'¿«automatically–áterminate“y•²!our›àrigh“ts–áunder“this“License“(including˜anš²!y“paten˜t“licensesŽ¡‘'¿«gran²!ted–¦funder“the“third“paragraph“of“section“11).ަ‘'¿«Ho•²!w“ev“er,‘ó·if›äAy“ou–ä@cease˜all“violation˜of“this“License,‘ó¸then“y²!our˜license“from˜a“particularŽ¡‘'¿«cop•²!yrigh“t–Jholder“is‘Jreinstated“(a)“proš²!visionally‘ÿe,‘sšunless“and“un˜til‘Jthe“cop˜yrigh˜t“holderŽ¡‘'¿«explicitly–á_and“ nally“terminates“yš²!our“license,‘0and“(b)“pMÞermanen˜tly‘ÿe,‘0if“the“cop˜yrigh˜tŽ¡‘'¿«holder–"fails“to“notify“yš²!ou“of“the“violation‘"b˜y“some“reasonable“means“prior“to“60“da˜ysŽ¡‘'¿«after–¦fthe“cessation.ŽŸ?‘'¿«Moreo•²!v“er,‘Ï8y“our–Ç license›Çfrom“a˜particular˜cop•²!yrigh“t–Ç holder˜is˜reinstated“pMÞermanen²!tly˜ifŽ¡‘'¿«the›V`cop•²!yrigh“t˜holder‘Vanoti es˜y“ou˜of˜the˜violation‘Vab“y˜some˜reasonable˜means,‘fbthis˜is˜theŽ¡‘'¿« rst–Wtime“y•²!ou‘Wha“v“e›Wreceiv“ed˜notice˜of˜violation‘Wof˜this˜License˜(for˜an“y‘Ww“ork)˜from˜thatŽ¡‘'¿«cop•²!yrigh“t–Õúholder,‘áÞand“yš²!ou“cure“the“violation“prior‘Õùto“30“da˜ys“after“y˜our‘Õùreceipt“of“theŽ¡‘'¿«notice.ަ‘'¿«T‘ÿeermination–Nuof“yš²!our“righ˜ts“under“this“section‘NtdoMÞes“not“terminate“the“licenses“of“partiesŽ¡‘'¿«who›•qha•²!v“e˜receiv“ed˜copies˜or˜righ“ts˜from˜y“ou‘•punder˜this˜License.‘ªþIf˜y“our˜righ“ts˜ha“v“eŽ¡‘'¿«bšMÞeen–œ‚terminated“and‘œnot“p˜ermanenš²!tly“reinstated,‘Úy˜ou“do“not“qualify‘œto“receiv˜e“newŽ¡‘'¿«licenses–¦ffor“the“same“material“under“section“10.ŽŸ?‘-9.Ž‘'¿«Acceptance–¦fNot“Required“for“Ha²!ving“Copies.ަ‘'¿«Y‘ÿeou–…are“not›…required“to“accept“this“License“in˜order“to“receiv²!e“or“run“a˜cop²!y“of“theŽ¡‘'¿«Program.‘µ™Ancillary–-špropagation›-™of“a“co•²!v“ered˜w“ork–-šoMÞccurring˜solely“as“a˜consequence“ofŽ¡‘'¿«using›˜p•MÞeer-to-p“eer˜transmission˜to˜receiv•²!e˜a‘—cop“y˜lik“ewise˜doMÞes˜not˜require˜acceptance.ŽŽŒ‹mŸò‘GÝGNU–¦fGENERAL“PUBLIC“LICENSE’÷QV8ŽŽŽ ƒ33 ý ÌÍ‘'¿«Ho•²!w“ev“er,‘ -nothing–áßother›áÞthan“this“License“gran•²!ts˜y“ou–áßpMÞermission“to“propagate˜or“moMÞdifyޤ 33‘'¿«an•²!y‘üªco“v“ered›ü«w“ork.‘à©These˜actions–üªinfringe“cop•²!yrigh“t‘üªif˜y“ou–üªdo“not“accept˜this“License.Ž¡‘'¿«Therefore,‘Í|b²!y›ŪmoMÞdifying–Å«or“propagating˜a“co•²!v“ered˜w“ork,‘Í|y“ou‘Å«indicate˜y“our‘Å«acceptanceŽ¡‘'¿«of–¦fthis“License“to“do“so.ޤ× ‘‡“10.Ž‘'¿«Automatic–¦fLicensing“of“Doš²!wnstream“Recipien˜ts.Ž¡‘'¿«Eac•²!h›žktime‘žjy“ou˜con“v“ey‘žja˜co“v“ered˜w“ork,‘Ükthe˜recipien“t‘žjautomatically˜receiv“es‘žja˜licenseޤ 33‘'¿«from–ˆtthe›ˆuoriginal“licensors,‘Àøto“run,‘À÷moMÞdify˜and“propagate“that˜w²!ork,‘À÷sub‘›»ject˜to“thisŽ¡‘'¿«License.‘)€Y‘ÿeou–jGare“not“respMÞonsible‘jHfor“enforcing“compliance“b²!y“third“parties“with“thisŽ¡‘'¿«License.Ž©× ‘'¿«An›5ä\en•²!tit“y–5åtransaction"˜is˜a“transaction˜transferring“con²!trol˜of˜an“organization,‘™ÃorŽ¡‘'¿«substan²!tially–· all›·assets“of“one,‘æìor“subMÞdividing“an˜organization,‘æëor˜merging“organizations.Ž¡‘'¿«If–y\propagation“of“a‘y]co•²!v“ered›y\w“ork˜results˜from˜an˜en“tit“y˜transaction,‘‚_eac“h˜part“y˜to˜thatŽ¡‘'¿«transaction–Jºwho‘J»receivš²!es“a“cop˜y‘J»of“the“w˜ork‘J»also“receiv˜es‘J»whatev˜er“licenses“to‘J»the“w˜orkŽ¡‘'¿«the–ýdpartš²!y's“predecessor“in“in˜terest“had“or“could“giv˜e“under“the“previous“paragraph,‘1plusŽ¡‘'¿«a–².righ²!t“to‘²-pšMÞossession“of“the“Corresp˜onding“Source›²-of“the“w²!ork“from˜the“predecessor“inŽ¡‘'¿«in²!terest,–¦fif“the“predecessor“has“it“or“can“get“it“with“reasonable“e orts.ަ‘'¿«Y‘ÿeou–Emaš²!y‘Enot“impMÞose“an˜y›Efurther“restrictions˜on“the“exercise˜of“the“righ•²!ts˜gran“ted‘EorŽ¡‘'¿«armed–JÈunder“this“License.‘¿SF‘ÿeor“example,‘]yš²!ou“ma˜y“not“impMÞose“a“license“fee,–]ro˜y˜alt˜y‘ÿe,“orŽ¡‘'¿«other–Mêc²!harge›Méfor“exercise˜of“righš²!ts“gran˜ted›Méunder“this˜License,‘_and˜yš²!ou“ma˜y‘Ménot“initiateŽ¡‘'¿«litigation–æq(including›æra“cross-claim˜or“coun²!terclaim˜in“a˜la²!wsuit)“alleging˜that“an•²!y˜paten“tŽ¡‘'¿«claim–H°is›H±infringed“b²!y˜making,–[nusing,“selling,›[oo ering–H°for“sale,˜or“impMÞorting‘H±the“ProgramŽ¡‘'¿«or–¦fan²!y“pMÞortion“of“it.ŽŸ× ‘‡“11.Ž‘'¿«P•²!aten“ts.ަ‘'¿«A‘êÚ\conš²!tributor"–ë-is“a“cop˜yrigh˜t“holder“who“authorizes“use“under“this“License“of“theŽ¡‘'¿«Program–$çor‘$æa“wš²!ork“on“whic˜h›$æthe“Program“is˜based.‘Y_The“wš²!ork“th˜us“licensed‘$æis“calledŽ¡‘'¿«the–¦fconš²!tributor's“\con˜tributor“v˜ersion".ަ‘'¿«A‘Ìcon•²!tributor's›Ì(\essen“tial‘Ì'paten“t˜claims"˜are˜all‘Ì'paten“t˜claims˜o“wned˜or‘Ì'con“trolled˜b“yŽ¡‘'¿«the–Š>con²!tributor,›Ãwhether“already“acquired“or‘Š?hereafter“acquired,˜that“w²!ould“bMÞe“infringedŽ¡‘'¿«bš²!y–MÌsome‘MËmanner,‘_„pMÞermitted“b˜y›MËthis“License,–_„of˜making,“using,“or–MÌselling˜its“con²!tributorŽ¡‘'¿«v²!ersion,‘²õbut›}>do–}?not“include“claims“that˜w²!ould“bMÞe“infringed“only“as˜a“consequence“ofŽ¡‘'¿«further– moMÞdi cation“of‘ the“conš²!tributor“v˜ersion.‘ ÐF‘ÿeor“purpMÞoses“of“this“de nition,‘,ö\con-Ž¡‘'¿«trol"–²@includes›²?the“righ²!t˜to“gran•²!t˜paten“t–²@sublicenses˜in“a˜manner“consisten²!t˜with“theŽ¡‘'¿«requiremen²!ts–¦fof“this“License.ަ‘'¿«Eac•²!h›EJcon“tributor‘EKgran“ts˜y“ou‘EKa˜non-exclusiv“e,›­w“orldwide,˜ro“y“alt“y-free‘EKpaten“t‘EJlicenseŽ¡‘'¿«under–@¤the‘@£conš²!tributor's“essen˜tial“paten˜t“claims,–Tþto‘@£mak˜e,“use,“sell,“o er‘@£for‘@¤sale,“impMÞortŽ¡‘'¿«and–¦fotherwise“run,“moMÞdify“and“propagate“the“con•²!ten“ts–¦fof“its“conš²!tributor“v˜ersion.ަ‘'¿«In–mïthe“folloš²!wing“three“paragraphs,‘y:a“\paten˜t‘mðlicense"“is“an˜y“express“agreemen˜t“or“com-Ž¡‘'¿«mitmen•²!t,›>Úho“w“ev“er–$÷denominated,˜not‘$øto“enforce“a“patenš²!t“(suc˜h“as‘$øan“express“pMÞermissionŽ¡‘'¿«to–Ê€practice“a‘Êpatenš²!t“or“co˜v˜enan˜t“not“to‘Êsue“for“paten˜t“infringemen˜t).‘J,T‘ÿeo“\gran˜t"“suc˜hŽ¡‘'¿«a–*Ypatenš²!t“license‘*Xto“a“part˜y“means“to‘*Xmak˜e“suc˜h“an“agreemen˜t“or‘*Xcommitmen˜t“not“toŽ¡‘'¿«enforce–¦fa“patenš²!t“against“the“part˜y‘ÿe.ަ‘'¿«If–e¬yš²!ou“con˜v˜ey“a“co˜v˜ered‘e­w˜ork,‘•}kno˜wingly“relying“on“a“paten˜t“license,‘•~and“the“Corre-Ž¡‘'¿«spMÞonding–¶{Source“of‘¶|the“wš²!ork“is“not“a˜v‘ÿdDailable‘¶|for“an˜y˜one“to“cop˜y‘ÿe,‘æwfree“of‘¶|c˜harge“and“underŽ¡‘'¿«the–Êðterms›Êñof“this˜License,‘Ôthrough“a“publicly˜aš²!v‘ÿdDailable“net˜w˜ork‘Êñserv˜er“or‘Êñother“readilyŽ¡‘'¿«accessible–_Ÿmeans,‘íthen“y•²!ou›_ m“ust–_Ÿeither“(1)“cause“the“CorrespMÞonding˜Source“to“bMÞe“soŽŽŒ‹ ~IŸò‘GÝGNU–¦fGENERAL“PUBLIC“LICENSE’÷QV9ŽŽŽ ƒ33 ý ÌÍ‘'¿«aš²!v‘ÿdDailable,‘‘Úor–Œ¶(2)“arrange‘Œ·to“depriv˜e‘Œ·y˜ourself“of›Œ·the“bMÞene t˜of“the˜paten²!t“license˜for“thisޤ 33‘'¿«particular–Rw²!ork,›; or“(3)‘Sarrange,˜in“a“manner“consistenš²!t“with“the‘Srequiremen˜ts“of“thisŽ¡‘'¿«License,‘bÚto–=)extend“the“patenš²!t“license“to“do˜wnstream“recipien˜ts.‘¢&\Kno˜wingly“relying"Ž¡‘'¿«means›Áy•²!ou‘Áœha“v“e˜actual‘Áœkno“wledge˜that,‘Èjbut–Áœfor˜the“paten•²!t˜license,‘Èjy“our‘Áœcon“v“eying˜theŽ¡‘'¿«co•²!v“ered›–zw“ork‘–yin˜a˜coun“try‘ÿe,‘Ò~or‘–yy“our˜recipien“t's˜use––yof˜the“co•²!v“ered˜w“ork˜in‘–ya˜coun“try‘ÿe,Ž¡‘'¿«wš²!ould–8¨infringe“one“or“more“iden˜ti able“paten˜ts“in“that“coun˜try“that“y˜ou“ha˜v˜e“reasonŽ¡‘'¿«to–¦fbMÞeliev²!e“are“v‘ÿdDalid.Ž©ÌΑ'¿«If,‘µ«pursuan²!t–²žto›²or“in˜connection“with˜a“single˜transaction“or˜arrangemen•²!t,‘µ¬y“ou˜con“v“ey‘ÿe,Ž¡‘'¿«or–-ypropagate“bš²!y“proMÞcuring“con˜v˜ey˜ance“of,‘O>a‘-xco˜v˜ered“w˜ork,‘O>and“gran˜t“a“paten˜t“licenseŽ¡‘'¿«to–¾™some“of›¾šthe“parties“receiving“the“co•²!v“ered‘¾™w“ork˜authorizing–¾™them“to“use,‘Ħpropagate,Ž¡‘'¿«moMÞdify›:£or‘:¤con•²!v“ey˜a˜spMÞeci c‘:¤cop“y˜of˜the˜co“v“ered›:¤w“ork,‘P0then˜the›:£paten“t˜license‘:¤y“ou˜gran“tŽ¡‘'¿«is–¦fautomatically“extended“to“all“recipienš²!ts“of“the“co˜v˜ered“w˜ork“and“w˜orks“based“on“it.ŽŸÌÍ‘'¿«A‘Mpaten²!t–M6license“is“\discriminatory"“if“it“došMÞes“not“include“within“the“scop˜e“of“its“co•²!v“er-Ž¡‘'¿«age,›Xprohibits–ÞUthe“exercise‘ÞTof,˜or“is“conditioned›ÞTon“the“non-exercise“of˜one“or“more˜of“theŽ¡‘'¿«righš²!ts–Ímthat“are“spMÞeci cally“gran˜ted“under“this“License.‘RóY‘ÿeou“ma˜y“not“con˜v˜ey“a“co˜v˜eredŽ¡‘'¿«wš²!ork–zZif“y˜ou“are“a“part˜y“to“an“arrangemen˜t“with‘z[a“third“part˜y“that“is“in“the“business“ofŽ¡‘'¿«distributing›§®soft•²!w“are,‘¨under˜whic“h˜y“ou˜mak“e˜pa“ymen“t‘§­to˜the˜third˜part“y˜based˜on˜theŽ¡‘'¿«extenš²!t–|.of“y˜our‘|/activit˜y“of“con˜v˜eying“the“w˜ork,‘„ and“under“whic˜h“the‘|/third“part˜y“gran˜ts,Ž¡‘'¿«to–Îanš²!y“of“the‘Ïparties“who“w˜ould“receiv˜e“the“co˜v˜ered‘Ïw˜ork“from“y˜ou,‘>(a“discriminatoryŽ¡‘'¿«patenš²!t–£license“(a)“in“connection“with“copies“of“the“co˜v˜ered“w˜ork“con˜v˜ey˜ed“b˜y“y˜ou“(orŽ¡‘'¿«copies–‹²made“from›‹³those“copies),‘Åor“(b)“primarily“for“and“in˜connection“with“spMÞeci cŽ¡‘'¿«proMÞducts– 7or› 8compilations“that˜conš²!tain“the“co˜v˜ered– 8w˜ork,‘%«unless“y˜ou‘ 7en˜tered“in˜to‘ 7thatŽ¡‘'¿«arrangemenš²!t,–¦for“that“paten˜t“license“w˜as“gran˜ted,“prior“to“28“Marc˜h“2007.ަ‘'¿«Nothing–¢Âin›¢Áthis“License“shall“bMÞe˜construed“as“excluding˜or“limiting“an²!y“implied˜license“orŽ¡‘'¿«other–-,defenses“to“infringemenš²!t“that“ma˜y“otherwise‘--bMÞe“a˜v‘ÿdDailable“to“y˜ou“under“applicableŽ¡‘'¿«paten•²!t‘¦fla“w.ަ‘‡“12.Ž‘'¿«No–¦fSurrender“of“Others'“F‘ÿereedom.ŽŸÌÍ‘'¿«If–éQconditions“are›éPimpMÞosed“on“y²!ou“(whether˜bš²!y“court“order,‘"agreemen˜t‘éPor“otherwise)“thatŽ¡‘'¿«conš²!tradict– ïthe“conditions“of“this“License,‘'Ñthey“do“not“excuse“y˜ou“from“the“conditionsŽ¡‘'¿«of›_lthis–_kLicense.‘îIf“y•²!ou˜cannot˜con“v“ey‘_ka˜co“v“ered‘_kw“ork˜so–_kas˜to“satisfy˜sim²!ultaneouslyŽ¡‘'¿«yš²!our–L•obligations“under“this“License“and‘L”an˜y“other“pMÞertinen˜t“obligations,‘¶ then“as“aŽ¡‘'¿«consequence›¬¿y•²!ou‘¬¾ma“y˜not‘¬¾con“v“ey˜it‘¬¾at˜all.‘ðæF‘ÿeor˜example,‘îTif˜y“ou–¬¾agree˜to“terms˜thatŽ¡‘'¿«obligate–™&y²!ou›™'to“collect“a˜ro•²!y“alt“y–™&for“further˜con•²!v“eying–™&from˜those“to“whom˜yš²!ou“con˜v˜eyŽ¡‘'¿«the–»CProgram,‘Àzthe‘»Bonly“w•²!a“y›»Cy“ou˜could˜satisfy–»BbMÞoth˜those˜terms˜and“this˜License˜w²!ouldŽ¡‘'¿«bMÞe–¦fto“refrain“enš²!tirely“from“con˜v˜eying“the“Program.ަ‘‡“13.Ž‘'¿«Use–¦fwith“the“GNU“A ero“General“Public“License.ŽŸÌÍ‘'¿«Not•²!withstanding›™Tan“y‘™Uother˜pro“vision˜of‘™Uthis˜License,‘Öy“ou‘™Uha“v“e˜pMÞermission˜to‘™Ulink˜orŽ¡‘'¿«com•²!bine›¦¥an“y˜co“v“ered˜w“ork‘¦¤with˜a˜w“ork˜licensed˜under˜v“ersion‘¦¤3˜of˜the˜GNU‘¦cA eroŽ¡‘'¿«General–iûPublic›iúLicense“in²!to“a˜single“comš²!bined“w˜ork,‘vand‘iúto“con˜v˜ey“the‘iúresulting“w˜ork.Ž¡‘'¿«The–eFterms“of“this“License“will“con•²!tin“ue–eFto“apply“to“the“part“whicš²!h“is“the“co˜v˜ered“w˜ork,Ž¡‘'¿«but–¢@the“spMÞecial“requiremen²!ts“of“the“GNU‘¡ÿA ero“General“Public“License,‘á6section“13,Ž¡‘'¿«concerning–¦finš²!teraction“through“a“net˜w˜ork“will“apply“to“the“com˜bination“as“suc˜h.ަ‘‡“14.Ž‘'¿«Revised–¦fV‘ÿeersions“of“this“License.ŽŽŒ‹ “Ÿò‘GÝGNU–¦fGENERAL“PUBLIC“LICENSE’ñ×¼10ŽŽŽ ƒ33 ý ÌÍ‘'¿«The›:#F‘ÿeree‘:$Soft•²!w“are˜F‘ÿeoundation˜ma“y–:$publish˜revised˜and/or“new˜v²!ersions˜of“the˜GNUޤ 33‘'¿«General–÷Public›÷License“from˜time“to˜time.‘ÏÂSuc²!h“new˜v²!ersions“will˜bMÞe“similar˜in“spiritŽ¡‘'¿«to–¦fthe“presenš²!t“v˜ersion,“but“ma˜y“di er“in“detail“to“address“new“problems“or“concerns.Ž©] ‘'¿«Eac•²!h›Zµv“ersion‘Z´is˜giv“en–Z´a˜distinguishing“v•²!ersion˜n“um“bMÞer.‘úÉIf–Z´the˜Program“spMÞeci es˜thatŽ¡‘'¿«a–¯~certain“n•²!um“bMÞered›¯~v“ersion˜of˜the˜GNU‘¯{General˜Public˜License˜\or˜an“y˜later˜v“ersion"Ž¡‘'¿«applies‘æQto–æPit,‘öLyš²!ou“ha˜v˜e–æQthe“option‘æPof“follo˜wing“the“terms›æPand“conditions“either˜of“thatŽ¡‘'¿«n•²!um“bMÞered›Ôv“ersion˜or˜of‘Óan“y˜later˜v“ersion˜published˜b“y˜the‘ÓF‘ÿeree˜Soft“w“are˜F‘ÿeoundation.Ž¡‘'¿«If–trthe“Program“došMÞes“not“sp˜ecify“a“vš²!ersion“n˜um˜bMÞer“of“the“GNU‘teGeneral“Public“License,Ž¡‘'¿«y•²!ou›¦fma“y˜c“hoMÞose˜an“y˜v“ersion˜ev“er˜published˜b“y˜the˜F‘ÿeree˜Soft“w“are˜F‘ÿeoundation.ަ‘'¿«If–ÃŒthe“Program“spMÞeci es“that“a“proš²!xy‘Ëcan“decide“whic˜h“future“v˜ersions“of“the“GNUŽ¡‘'¿«General–ó2Public“License“can“bMÞe“used,‘ethat“proš²!xy's“public“statemen˜t“of“acceptance“of“aŽ¡‘'¿«v•²!ersion›¦fpMÞermanen“tly˜authorizes˜y“ou˜to˜c“hoMÞose˜that˜v“ersion˜for˜the˜Program.ŽŸ] ‘'¿«Later–VÏlicense‘VÎvš²!ersions“ma˜y“giv˜e‘VÎy˜ou“additional‘VÎor“di eren˜t“pMÞermissions.‘ïHo˜w˜ev˜er,‘‚ènoŽ¡‘'¿«additional–óhobligations›ógare“impMÞosed˜on“an²!y˜author“or“cop•²!yrigh“t˜holder–óhas˜a“result˜of“y²!ourŽ¡‘'¿«cš²!hoMÞosing–¦fto“follo˜w“a“later“v˜ersion.ަ‘‡“15.Ž‘'¿«Disclaimer–¦fof“W›ÿearran•²!t“y˜.ަ‘'¿«THERE–¬±IS“NO“W‘þȈARRANTY‘¬°Fš²!OR“THE“PR˜OGRAM,‘­6TO“THE“EXTENT“PER-Ž¡‘'¿«MITTED–ž³BY‘ž´APPLICABLE“LA›þȈW.‘Ÿ5EX²!CEPT“WHEN“OTHER˜WISE‘ž´ST–ÿeA“TED‘ž³INŽ¡‘'¿«WRITING– THE›COPYRIGHT“HOLDERS“AND/OR“OTHER˜P–ÿeAR“TIES‘ PR•²!O“VIDEŽ¡‘'¿«THE–®·PR²!OGRAM“\AS“IS"“WITHOUT‘®¶W‘þȈARRANTY“OF“ANY“KIND,‘®¹EITHER“EX-Ž¡‘'¿«PRESSED‘5²OR›5±IMPLIED,–5×INCLUDING,“BUT˜NOT–5²LIMITED“TO,‘5ÖTHE“IMPLIEDŽ¡‘'¿«W‘þȈARRANTIES–™OF‘™MERš²!CHANT‘ÿeABILITY“AND“FITNESS“F˜OR‘™A“P–ÿeAR“TICULARŽ¡‘'¿«PURPOSE.‘Ï”THE–ÏHENTIRE›ÏGRISK“AS˜TO“THE“QUALITY˜AND“PERF²!ORMANCEŽ¡‘'¿«OF–…ÕTHE“PR²!OGRAM›…ÔIS“WITH“YOU.‘…ÝSHOULD“THE˜PRš²!OGRAM“PR˜O˜VE“DEFEC-Ž¡‘'¿«TIVE,‘äjYOU‘ä:ASSUME–ä9THE“COST“OF“ALL“NECESSAR›ÿeY“SER‘þȈVICING,‘äkREP˜AIR“ORŽ¡‘'¿«CORRECTION.ަ‘‡“16.Ž‘'¿«Limitation–¦fof“Liabilit²!y‘ÿe.ŽŸ] ‘'¿«IN–'vNO“EVENT›'wUNLESS“REQUIRED“BY“APPLICABLE“LA‘þȈW“OR˜A²!GREED“TO“INŽ¡‘'¿«WRITING–kËWILL›kÌANY“COPYRIGHT“HOLDER,‘kÿOR“ANY“OTHER˜P–ÿeAR“TY‘kËWHOŽ¡‘'¿«MODIFIES–ùÈAND/OR“CONVEYS“THE“PRš²!OGRAM“AS“PERMITTED“ABO˜VE,‘ùÞBEŽ¡‘'¿«LIABLE–¯£TO‘¯¢YOU“Fš²!OR“D˜AMA˜GES,›¯¥INCLUDING‘¯¢ANY“GENERAL,˜SPECIAL,˜IN-Ž¡‘'¿«CIDENT‘ÿeAL–ÐOR“CONSEQUENTIAL“D•²!AMA“GES–ÐARISING‘ÐOUT“OF“THE“USE“ORŽ¡‘'¿«INABILITY–žõTO“USE“THE“PR²!OGRAM‘žô(INCLUDING“BUT“NOT“LIMITED“TOŽ¡‘'¿«LOSS–ƒäOF“Dš²!A–ÿeT“A–ƒäOR“D˜A–ÿeT“A‘ƒãBEING–ƒäRENDERED“INA˜CCURA‘ÿeTE“OR“LOSSES“SUS-Ž¡‘'¿«T‘ÿeAINED–…BY›„YOU“OR˜THIRD“P–ÿeAR“TIES˜OR–…A˜F‘þȈAILURE“OF˜THE“PR²!OGRAMŽ¡‘'¿«TO–£ OPERA‘ÿeTE›£WITH“ANY˜OTHER“PR²!OGRAMS),‘£ EVEN˜IF“SUCH˜HOLDER“ORŽ¡‘'¿«OTHER›g¦P–ÿeAR“TY˜HAS–g§BEEN˜AD²!VISED˜OF˜THE˜POSSIBILITY“OF˜SUCH˜D²!AM-Ž¡‘'¿«A²!GES.ަ‘‡“17.Ž‘'¿«In²!terpretation–¦fof“Sections“15“and“16.ަ‘'¿«If–JÝthe“disclaimer“of“w•²!arran“t“y–JÝand“limitation‘JÜof“liabilitš²!y“pro˜vided“abMÞo˜v˜e“cannot“bMÞe“giv˜enŽ¡‘'¿«loMÞcal–Vlegal“e ect›Waccording“to“their“terms,‘3“reviewing“courts“shall“apply˜loMÞcal“la²!w“thatŽ¡‘'¿«most–qžclosely“approš²!ximates“an‘qabsolute“w˜aiv˜er“of“all“civil“liabilit˜y‘qin“connection“withŽ¡‘'¿«the–5OProgram,‘Y unless›5Pa“w•²!arran“t“y–5Oor“assumption“of“liabilit²!y“accompanies˜a“cop²!y“of“theŽ¡‘'¿«Program–¦fin“return“for“a“fee.ŽŽŒ‹ ¢xŸò‘GÝGNU–¦fGENERAL“PUBLIC“LICENSE’ñ×¼11ŽŽŽ ƒ33 ý ÌÍ‘GëYEND–f@OF“TERMS“AND“CONDITIONSŽŽŸ‘GHoŒÌw–f@to“Apply“These“T›þ¦ferms“to“Y˜our“New“ProgramsŽŽŸ33‘!GÝIf›¶y•²!ou‘¶dev“elop˜a˜new–¶program,‘ùýand“y•²!ou˜w“an“t˜it–¶to˜bMÞe˜of“the˜greatest˜pMÞossible“use˜toޤ 33‘Gthe–î¢public,‘@°the“bMÞest“w•²!a“y‘î¡to›î¢ac“hiev“e˜this˜is‘î¡to˜mak“e˜it˜free˜soft“w“are‘î¡whic“h˜ev“ery“one˜canŽ¡‘Gredistribute–¦fand“c²!hange“under“these“terms.ŽŸ33‘!GT‘ÿeo–‰Ødo“so,‘Žattacš²!h“the“follo˜wing›‰Ùnotices“to“the“program.‘ÔXIt“is“safest˜to“attac²!h“them“to“theŽ¡‘Gstart–jof“eacš²!h“source“ le“to“most‘ke ectiv˜ely“state“the“exclusion“of“w˜arran˜t˜y;‘ëìand“eac˜h“ leŽ¡‘Gshould›¦fha•²!v“e˜at˜least˜the˜\cop“yrigh“t"˜line˜and˜a˜pMÞoin“ter˜to˜where˜the˜full˜notice˜is˜found.ŽŸ €‘.ùœóBßêÝ.Ž©33‘ ØæŽ‘'¿«ÝSpMÞecial–û·thanks›û¸is“extended“to“Mic²!hael˜Tiemann“and“Doug˜Lea,‘ for“pro²!viding˜a“usefulŽ¡‘'¿«compiler,–¦fand“for“giving“me“a“forum“to“exhibit“m²!y“creation.ަ‘'¿«In–¶±addition,‘æ¢Adam“de“BoMÞor“and“Nels“Olson‘¶²proš²!vided“man˜y“tips“and“insigh˜ts“that“greatlyŽ¡‘'¿«helpMÞed›¦fimpro•²!v“e˜the˜qualit“y˜and˜functionalit“y˜of˜ÞgperfÝ.ަ‘ ØæŽ‘'¿«ÝBruno–>ÆHaible›>Çenhanced“and˜optimized“the˜searc²!h“algorithm.‘»SHe˜also“rewrote˜the“inputŽ¡‘'¿«routines–¦fand“the“output“routines“for“bMÞetter“reliabilit²!y‘ÿe,“and“added“a“testsuite.ŽŽŒ‹ ¿°Ÿò‘GÝChapter‘¦f1:‘ÝÝIn²!troMÞduction’2¸¶13ŽŽŽ ƒ33 ý ÌÍ‘GëP1‘ ¸QIn‘ÿuÂtro‘Š=ductionŽŽŸ33‘!GÞgperf–ÙÝis›Øa“pMÞerfect“hash˜function“generator“written“in˜CÞ++Ý.‘í5It“transforms“an˜ó6p®0J ó3 cmsl10án“Ýelemen²!tޤ 33‘Guser-spMÞeci ed›|Ûk•²!eyw“ord˜set˜áW‘âÕÝin“to˜a˜pMÞerfect˜hash˜function˜áFÝ.˜áF‘GÝuniquely˜maps˜k“eyw“ordsŽ¡‘Gin–4OáW‘š[Ýon²!to“the“range“0..ákÝ,‘WÈwhere“ák›ÞSÞ>Ý=“án-1Ý.‘‡—If“ák˜Ý=“án-1‘ˆÝthen›4NáF‘þ¡Ýis“a˜ó5ý': ó3 cmti10àminimal‘UùÝpMÞerfect“hashŽ¡‘Gfunction.‘=Þgperf›ÆÝgenerates–Æa“0..ák‘p!Ýelemen²!t“static“loMÞokup˜table“and˜a“pair“of˜C‘ÅÔfunctions.Ž¡‘GThese–!gfunctions“determine‘!fwhether“a“givš²!en“c˜haracter“string›!fás‘”éÝoMÞccurs“in“áWÝ,˜using“at“mostŽ¡‘Gone–¦fprobšMÞe“in²!to“the“lo˜okup“table.ŽŸ33‘!GÞgperf–ØLÝcurrenš²!tly“generates“the“reserv˜ed“k˜eyw˜ord‘ØMrecognizer“for“lexical“analyzers“in“sev˜eralŽ¡‘GproMÞduction–±wand›±vresearc²!h“compilers“and˜language“prošMÞcessing“to˜ols,‘´;including‘±vGNU‘±tC,“GNUŽ¡‘GCÞ++Ý,–ìGNU›½BJa²!v‘ÿdDa,“GNU˜P²!ascal,“GNU˜MošMÞdula–½~3,‘ìand“GNU‘½Cinden²!t.‘:Complete“CÞ++‘½}Ýsource“co˜deŽ¡‘Gfor–ZÞgperf›YÝis“a²!v‘ÿdDailable˜from“Þhttp://ftp.gnu.org/pub/gnu/gperf/Ý.‘ ·A‘üpapMÞer“describingŽ¡‘GÞgperfÝ's–Édesign›Éand“implemen²!tation˜in“greater˜detail“is“a²!v‘ÿdDailable˜in“the˜Second“USENIXŽ¡‘GCÞ++–¼ÝConference“proMÞceedings“or“from“Þhttp://www.cs.wustl.edu/~schmidt/resume.htmlÝ.ŽŽŒ‹ÅNŸò‘GÝChapter–¦f2:‘ÝÝStatic“searc²!h“structures“and“GNU“Þgperf’«ÏÝ14ŽŽŽ ƒ33 ý ÌÍ‘GëP2‘ ¸QStatic–z³searc‘ÿuÂh“structures“and“GNU“ëSgperfŽŽŸ33‘!GÝA‘ðTástatic›ðƒsearc²!h–ð‚structure‘ŠÝis“an“Abstract˜Data“T²!ypMÞe˜with“certain˜fundamen²!tal“opMÞerations,ޤ 33‘Ge.g.,–²íàinitializeÝ,‘²ìàinsertÝ,“and›°kàr‘ÿp¹etrieveÝ.‘ûìConceptually‘ÿe,“all˜insertions˜o•MÞccur‘°lb“efore˜an²!y˜retriev‘ÿdDals.Ž¡‘GIn–†4practice,‘¿ØÞgperf‘†5Ýgenerates“a“àstatic‘$ªÝarraš²!y“con˜taining“searc˜h‘†5set“k˜eyw˜ords“and‘†5an˜y“assoMÞciatedŽ¡‘Gattributes–faspMÞeci ed‘f`bš²!y“the“user.‘ÍTh˜us,‘–^there“is“essen˜tially›f`no“execution-time“cost˜for“theŽ¡‘Ginsertions.›»ÕIt–@Lis“a“useful“data‘@Mstructure“for“represen²!ting“àstatic‘Œüse–ÿp¹ar“ch‘ŒûsetsÝ.˜Static–@Lsearc²!h“setsŽ¡‘GoMÞccur–íÅfrequenš²!tly“in“soft˜w˜are“system–íÄapplications.‘ ST˜ypical“static–íÅsearc˜h“sets“include“compilerŽ¡‘Greserv•²!ed›¬w“ords,‘k=assem“bler‘­instruction˜op•MÞco“des,‘k=and˜built-in‘­shell˜in²!terpreter˜commands.Ž¡‘GSearc•²!h›úset‘úmem“bMÞers,‘Ošcalled˜ák“eyw“ordsÝ,‘O™are˜inserted˜in“to–úthe˜structure˜only“once,‘OšusuallyŽ¡‘Gduring–¦fprogram“initialization,“and“are“not“generally“moMÞdi ed“at“run-time.Ž©33‘!GNumerous–Xdstatic“searcš²!h“structure“implemen˜tations‘Xeexist,–gþe.g.,“arra˜ys,“link˜ed‘Xdlists,“binaryŽ¡‘Gsearcš²!h–I¸trees,‘²Œdigital“searc˜h“tries,‘²Œand“hash“tables.‘ ÇÓDi eren˜t“approac˜hes“o er“trade-o sŽ¡‘GbMÞet•²!w“een–4space“utilization›3and“searc²!h“time“eciency–ÿe.‘úFF“or–4example,‘\çan˜án“Ýelemen²!t“sortedŽ¡‘Garraš²!y–ÉÉis‘ÉÈspace“ecien˜t,‘ though“the‘ÉÈa˜v˜erage-case“time‘ÉÈcomplexit˜y“for‘ÉÈretriev‘ÿdDal“opMÞerationsŽ¡‘Gusing–»´binary›»³searc²!h“is˜propMÞortional“to“log˜ánÝ.‘ÆCon•²!v“ersely‘ÿe,‘Áhash‘»´table˜implemen“tations‘»´oftenŽ¡‘GloMÞcate– ²a› ³table“en²!try“in˜constanš²!t“time,‘,=but“t˜ypically› ³impMÞose“additional“memory˜o•²!v“erhead‘ ²andŽ¡‘Gexhibit›¦fp•MÞo“or˜w²!orst˜case˜p“erformance.ަ‘!GàMinimal›+p–ÿp¹erfe“ct˜hash‘+functions‘»ýÝpro²!vide–Õåan‘Õäoptimal“solution“for“a“particular“class“of“staticŽ¡‘Gsearcš²!h–¦fsets.‘ÝÝA“minimal“pMÞerfect“hash“function“is“de ned“b˜y“t˜w˜o“propMÞerties:ަ‘ ØæŽ‘'¿«ÝIt›"allo•²!ws‘"k“eyw“ord˜recognition–"in˜a“static˜searc²!h“set˜using“at˜most“àone‘ô¦ÝprobMÞe“in²!to˜theŽ¡‘'¿«hash–¦ftable.‘ÝÝThis“represen²!ts“the“\pšMÞerfect"“prop˜ert²!y‘ÿe.ަ‘ ØæŽ‘'¿«ÝThe–Sœactual“memory“alloMÞcated“to“store“the“k•²!eyw“ords–Sœis“precisely“large“enough“for“theŽ¡‘'¿«k•²!eyw“ord–¦fset,“and“àno‘êêlar‘ÿp¹gerÝ.‘ÝÝThis“is“the“\minimal"“propMÞert²!y‘ÿe.ŽŸ33‘!GF‘ÿeor–†\most“applications›†[it“is“far“easier˜to“generate“àp–ÿp¹erfe“ct‘FÝhash˜functions–†\than“àminimalŽ¡‘Gp–ÿp¹erfe“ct‘{ÖÝhash›qìfunctions.‘@nMoreo•²!v“er,‘¤Înon-minimal‘qëpMÞerfect˜hash˜functions˜frequen“tly˜executeŽ¡‘Gfaster–DÁthan“minimal“ones“in“practice.‘ ¸íThis“phenomena“oMÞccurs“since“searc²!hing“a“sparseŽ¡‘Gk•²!eyw“ord–Itable›Jincreases“the˜probabilit²!y“of˜loMÞcating“a˜\nš²!ull"“en˜try‘ÿe,‘thereb˜y‘Jreducing“stringŽ¡‘Gcomparisons.‘¥ ÞgperfÝ's–>Qdefault›>RbMÞeha²!vior“generates˜àne‘ÿp¹ar-minimal‘_ûÝpMÞerfect˜hash“functions˜forŽ¡‘Gk•²!eyw“ord›¿Dsets.‘(vHo“w“ev“er,‘{Þgperf˜Ýpro“vides‘¿Cman“y˜options˜that˜pMÞermit˜user‘¿Ccon“trol˜o“v“er˜theŽ¡‘Gdegree–¦fof“minimalit²!y“and“pMÞerfection.ަ‘!GStatic–K=searcš²!h“sets‘K>often“exhibit“relativ˜e“stabilit˜y‘K>o˜v˜er“time.‘ÌcF‘ÿeor“example,‘tsAda's“63“re-Ž¡‘Gserv•²!ed›°Aw“ords‘°Bha“v“e˜remained‘°Bconstan“t˜for–°Bnearly˜a“decade.‘ûoIt“is˜therefore“frequen•²!tly˜w“orth-Ž¡‘Gwhile–©4to›©5expMÞend“concerted“e ort˜building“an“optimal˜searc²!h“structure“àonc‘ÿp¹eÝ,‘ÛØif˜it“subsequen²!tlyŽ¡‘Greceiv•²!es›Å×hea“vy‘ÅÖuse˜m“ultiple‘ÅÖtimes.‘“Þgperf˜Ýremo“v“es˜the–ÅÖdrudgery˜assoMÞciated“with˜constructingŽ¡‘Gtime-–z¶and‘zµspace-ecienš²!t“searc˜h‘zµstructures“b˜y–zµhand.‘ZÌIt“has‘z¶pro˜v˜en“a›z¶useful“and˜practicalŽ¡‘GtoMÞol–`Qfor“serious“programming“pro‘›»jects.‘Æ€Output“from“Þgperf“Ýis“currenš²!tly“used“in“sev˜eral“pro-Ž¡‘Gduction–and“researc²!h‘compilers,‘0{including“GNU›ÜC,“GNU˜CÞ++Ý,‘0|GNU˜Ja•²!v‘ÿdDa,‘0{GNU˜P“ascal,‘0|andŽ¡‘GGNU‘~eMoMÞdula–~3.‘fThe“latter“t•²!w“o–~compilers›~œare“not“y²!et“part˜of“the“ocial“GNU‘~edistribu-Ž¡‘Gtion.‘ÿ)Eac²!h–Õcompiler“utilizes“Þgperf›ÔÝto“automatically“generate“static˜searc²!h“structures“thatŽ¡‘Gecien•²!tly›¦fiden“tify˜their˜respMÞectiv“e˜reserv“ed˜k“eyw“ords.ŽŽŒ‹ËTŸò‘GÝChapter–¦f3:‘ÝÝHigh-Lev²!el“Description“of“GNU“Þgperf’·>ÌÝ15ŽŽŽ ƒ33 ý ÌÍ‘GëP3‘ ¸QHigh-Lev‘ÿuÂel–z³Description“of“GNU“ëSgperfŽŽŸÕ¶‘!GÝThe–¢úpMÞerfect“hash“function“generator“Þgperf“Ýreads‘¢ùa“set“of“\k•²!eyw“ords"–¢úfrom“an“input“ leޤ 33‘G(or–äfrom“the“standard“input“bš²!y“default).‘&VIt“attempts“to“deriv˜e“a“pMÞerfect“hashing“functionŽ¡‘Gthat–krecognizes“a“memš²!bMÞer‘kof“the“ástatic“k˜eyw˜ord“set‘¨Ýwith“at“most‘ka“single“probMÞe“in˜to“theŽ¡‘GlošMÞokup–5)table.‘¸If“Þgperf“Ýsucceeds“in“generating“suc²!h‘5(a“function“it“pro˜duces“a“pair“of“C‘5 sourceŽ¡‘GcošMÞde–¯¶routines“that‘¯·p˜erform“hashing“and“table‘¯·lo˜okup“recognition.‘ùÍAll‘¯·generated“C‘¯rco˜deŽ¡‘Gis–‡¦directed“to“the›‡¥standard“output.‘Command-line“options“describ•MÞed˜b“elo•²!w›‡¦allo“w˜y“ou˜toŽ¡‘GmoMÞdify–¦fthe“input“and“output“format“to“ÞgperfÝ.ŽŸ ‘!GBy–Êdefault,‘ö-Þgperf“Ýattempts‘Êto“prošMÞduce“time-ecien²!t“co˜de,‘ö-with“less‘Êemphasis“on“ecien²!tŽ¡‘Gspace›¨'utilization.‘ã Ho•²!w“ev“er,‘¨—sev“eral˜options˜exist˜that˜pMÞermit˜trading-o ˜execution˜time˜forŽ¡‘Gstorage–Ï=space›Ï>and“vice“v²!ersa.‘XcIn“particular,‘Ùsexpanding˜the“generated“table“size˜proMÞduces“aŽ¡‘Gsparse–searcš²!h“structure,‘9Hgenerally“yielding“faster“searc˜hes.‘°eCon˜v˜ersely‘ÿe,‘9Hy˜ou“can“direct“ÞgperfŽ¡‘GÝto–xutilize›xa“C‘wµÞswitch“Ýstatemen•²!t˜sc“heme–xthat“minimizes˜data“space˜storage“size.‘yF‘ÿeurthermore,Ž¡‘Gusing–ÏÞa›ÏßC‘Ï’Þswitch“Ýma²!y“actually˜spMÞeed“up“the˜k•²!eyw“ord–ÏÞretriev‘ÿdDal˜time“somewhat.‘ZFActualŽ¡‘Gresults–¦fdepMÞend“on“y²!our“C“compiler,“of“course.Ž© ‘!GIn–oÒgeneral,‘â,Þgperf“Ýassigns“v‘ÿdDalues“to“the“bš²!ytes“it“is“using“for“hashing“un˜til“some“setŽ¡‘Gof–v‘ÿdDalues“givš²!es“eac˜h“k˜eyw˜ord“a“unique“v‘ÿdDalue.‘ öA‘»helpful“heuristic“is“that“the“larger“theŽ¡‘Ghash–içv‘ÿdDalue“range,‘šÇthe“easier“it“is“for“Þgperf‘ièÝto“ nd“and“generate“a“pMÞerfect“hash“function.Ž¡‘GExpMÞerimenš²!tation–¦fis“the“k˜ey“to“getting“the“most“from“ÞgperfÝ.ŽŸQA‘GëY3.1‘™Input–f@F‘þ¦format“to“ó\߆µTff cmtt12ë\gperfŽŽŸ33‘!GÝY‘ÿeou–Žñcan›Žðcon²!trol“the“input“ le˜format“b²!y“v‘ÿdDarying“certain˜command-line“argumen²!ts,‘ÉinŽ¡‘Gparticular–¨¬the“`Þ-tÝ'–¨­option.‘ä¯The“input's–¨¬appMÞearance“is“similar“to‘¨­GNU‘¨jutilities“Þflex“ÝandŽ¡‘GÞbison–¦fÝ(or“UNIX“utilities“Þlex“Ýand“ÞyaccÝ).‘ÝÝHere's“an“outline“of“the“general“format:ަ‘.ùœÞdeclarationsŽ¡‘.ùœ%%Ž¡‘.ùœkeywordsŽ¡‘.ùœ%%Ž¡‘.ùœfunctionsŽŽŸEàÕ‘!GàUnlike‘Þflex›EsÝor–ErÞbisonÝ,‘m5the“declarations“section˜and“the“functions“section˜are“optional.Ž¡‘GThe–¦ffolloš²!wing“sections“describMÞe“the“input“format“for“eac˜h“section.ŽŸ ‘!GIt–ãXis“pMÞossible“to“omit“the›ãYdeclaration“section“en²!tirely‘ÿe,‘ò”if“the“`Þ-tÝ'“option˜is“not“giv²!en.‘”³InŽ¡‘Gthis–¦fcase“the“input“ le“bMÞegins“directly“with“the“ rst“k•²!eyw“ord–¦fline,“e.g.:ަ‘.ùœÞjanuaryŽ¡‘.ùœfebruaryŽ¡‘.ùœmarchŽ¡‘.ùœaprilŽ¡‘.ùœ...ŽŽŸM­¢‘GóbÂÖN  #× cmbx12ëb3.1.1‘d(DeclarationsŽŽŸ³3‘!GÝThe›#Šk•²!eyw“ord–#‰input˜ le“optionally˜con²!tains“a˜section“for˜including“arbitrary˜C‘#ideclara-Ž¡‘Gtions–¤‹and“de nitions,›¤êÞgperf“Ýdeclarations“that“act‘¤Šlik²!e“command-line“options,˜as“w²!ell“as“forŽ¡‘Gpro²!viding–¦fa“user-supplied“ÞstructÝ.ŽŽŒ‹Ý Ÿò‘GÝChapter–¦f3:‘ÝÝHigh-Lev²!el“Description“of“GNU“Þgperf’·>ÌÝ16ŽŽŽ ƒ33 ý ÌÍ‘Gëb3.1.1.1‘d(User-supplied‘íMóe߆µT #× cmtt12ëestructŽŽ©³3‘!GÝIf–÷the“`Þ-tÝ'“option“(or,›%equiv‘ÿdDalen²!tly‘ÿe,‘$the“`Þ%struct-typeÝ'“declaration)“àis‘Ý,Ýenabled,˜y²!ou“àmustޤ 33‘GÝproš²!vide–bÙa“C‘b©Þstruct“Ýas“the‘bÚlast“compMÞonen˜t“in“the“declaration“section‘bÚfrom“the“input“ le.Ž¡‘GThe–$¢ rst›$¡ eld“in“this“struct˜m²!ust“bMÞe“of˜t²!ypMÞe“Þchar›¦f*“Ýor“Þconst˜char˜*›$¡Ýif“the“`Þ-PÝ'“option˜is“notŽ¡‘Ggiv•²!en,‘¢or› ÿof‘ þt“ypMÞe˜Þint– þÝif˜the“option˜`Þ-PÝ'“(or,‘¢equiv‘ÿdDalen²!tly‘ÿe,‘¢the“`Þ%picÝ'˜declaration)“is˜enabled.Ž¡‘GThis–B! rst“ eld“m²!ust“bšMÞe“called‘B"`ÞnameÝ',‘ialthough“it“is“p˜ossible‘B"to“mo˜dify“its“name“with“theŽ¡‘G`Þ-KÝ'–¦foption“(or,“equiv‘ÿdDalen²!tly‘ÿe,“the“`Þ%define“slot-nameÝ'“declaration)“describšMÞed“b˜elo²!w.ޤu‘!GHere–¦fis“a“simple“example,“using“monš²!ths“of“the“y˜ear“and“their“attributes“as“input:Ž¡‘.ùœÞstruct–¿ªmonth“{“char“*name;“int“number;“int“days;“int“leap_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ŽŽ ½Ÿ‘!GÝSeparating–Rthe›QÞstruct“Ýdeclaration“from˜the“list“of˜k•²!eyw“ords–Rand“other˜ elds“are“a˜pair“ofޤ 33‘Gconsecutiv•²!e‘Â_pšMÞercen“t–Â`signs,‘É^`Þ%%Ý',‘É]app˜earing“left›Â_justi ed“in˜the“ rst˜column,‘É^as˜in“the˜UNIXŽ¡‘Gutilit²!y‘¦fÞlexÝ.ŽŸu‘!GIf–{the“Þstruct“Ýhas›{already“bMÞeen“declared“in“an“include“ le,‘°Úit“can˜bMÞe“men²!tioned“in“anŽ¡‘Gabbreviated–¦fform,“lik²!e“this:ŽŸu‘.ùœÞstruct‘¿ªmonth;Ž¡‘.ùœ%%Ž¡‘.ùœjanuary,‘>þ1,–¿ª31,“31Ž¡‘.ùœ...ŽŽŸ@Ûn‘Gëb3.1.1.2‘d(Gpierf‘íMDeclarationsŽŽ¦‘!GÝThe–àjdeclaration“section“can›àkcon²!tain“Þgperf“Ýdeclarations.‘‹éThey˜in uence“the“w•²!a“y‘àjÞgperfŽ¡‘GÝw•²!orks,‘4’lik“e‘äñcommand–äðline“options“do.‘™|In“fact,‘4“evš²!ery“suc˜h“declaration“is‘äñequiv‘ÿdDalen˜t“to“aŽ¡‘Gcommand–¦fline“option.‘ÝÝThere“are“three“forms“of“declarations:Ž©u‘-1.Ž‘'¿«Declarations–¦fwithout“argumenš²!t,“lik˜e“`Þ%compare-lengthsÝ'.ŽŸÔ‘-2.Ž‘'¿«Declarations–¦fwith“an“argumenš²!t,“lik˜e“`Þ%switch=ó9ßêÌÝ17ŽŽŽ ƒ33 ý ÌÍ‘G`Þ%delimiters=ädelimiter-list‘DsÝ'ޤ 33‘Kâ:Allo•²!ws›sy“ou‘sto˜pro“vide˜a˜string‘scon“taining˜delimiters˜used˜to‘sseparate˜k“eyw“ordsŽ¡‘Kâ:from›'§their–'¦attributes.‘a The“default˜is˜Þ"Ý,Þ"Ý.‘aŸThis“option˜is˜essen²!tial˜if“y•²!ou˜w“an“tŽ¡‘Kâ:to–¦fuse“k•²!eyw“ords–¦fthat“ha•²!v“e›¦fem“bMÞedded˜commas˜or˜newlines.Ž©™š‘G`Þ%struct-typeÝ'Ž¡‘Kâ:Allo•²!ws›©y“ou˜to‘©include˜a˜Þstruct˜Ýt“yp•MÞe˜declaration‘©for˜generated˜co“de;‘ªRsee˜ab“o•²!v“eŽ¡‘Kâ:for–¦fan“example.ަ‘G`Þ%ignore-caseÝ'Ž¡‘Kâ:Consider–K¯uppšMÞer“and‘K®lo•²!w“er–K¯case“ASCI˜I‘KBcš²!haracters“as“equiv‘ÿdDalen˜t.‘ Í·The“stringŽ¡‘Kâ:comparison–d¤will“use‘d¥a“case“insigni canš²!t“c˜haracter‘d¥comparison.‘ÇòNote“that“loMÞcaleŽ¡‘Kâ:depMÞenden²!t–¦fcase“mappings“are“ignored.ަ‘G`Þ%language=älanguage-name‘DsÝ'Ž¡‘Kâ:Instructs–5Þgperf›6Ýto“generate“coMÞde“in˜the“language“spMÞeci ed“b²!y˜the“option's“ar-Ž¡‘Kâ:gumenš²!t.‘ÝÝLanguages–¦fhandled“are“curren˜tly:ަ‘Kâ:`ÞKR-CÝ'‘¼õOld-st²!yle–(’K&R‘(sC.“This›(“language“is“understo•MÞo“d˜b•²!y‘(’old-st“yle˜C‘(rcom-Ž¡’…³-pilers‘æõand–æöANSI›æÄC‘æÅcompilers,‘ ?but“ANSI˜C‘æÅcompilers›æõma²!y“ ag˜w²!arn-Ž¡’…³-ings–¦f(or“evš²!en“errors)“bMÞecause“of“lac˜king“`ÞconstÝ'.ަ‘Kâ:`ÞCÝ'‘-ûóCommon–ÀC.“This“language“is‘Ãundersto•MÞo“d–Àb²!y“ANSI‘ÃGC‘ÃFcompilers,‘ðáandŽ¡’…³-also›oçb•²!y‘oæold-st“yle˜C‘oÙcompilers,‘zÍpro“vided‘oæthat˜y“ou‘oæÞ#define‘¦fconst˜ÝtoŽ¡’…³-emptš²!y–¦ffor“compilers“whic˜h“don't“kno˜w“abMÞout“this“k˜eyw˜ord.ަ‘Kâ:`ÞANSI-CÝ'‘=¡ANSI›ÛìC.–ÛùThis“language“is‘Ûúundersto•MÞo“d–Ûùb²!y“ANSI˜C‘Ûë(C89,‘é^ISO˜C90)Ž¡’…³-compilers,–¦fISO“C99“compilers,“and“CÞ++“Ýcompilers.ŽŸ™›‘Kâ:`ÞC++Ý'‘"|ŸCÞ++Ý.‘ÝÝThis–¦flanguage“is“understo•MÞo“d–¦fb²!y“CÞ++“Ýcompilers.ަ‘Kâ:The–¦fdefault“is“C.ަ‘G`Þ%define–¦fslot-name“äname‘DsÝ'Ž¡‘Kâ:This–ïXdeclaration›ïYis“only˜useful“when˜option“`Þ-tÝ'“(or,‘ ”equiv‘ÿdDalen²!tly‘ÿe,‘ “theŽ¡‘Kâ:`Þ%struct-typeÝ'–ûdeclaration)“has‘úbMÞeen“giv²!en.‘ÛBy“default,‘Ÿ©the“program“assumesŽ¡‘Kâ:the–ÌÈstructure‘ÌÇcompMÞonenš²!t“iden˜ti er“for‘ÌÇthe“k˜eyw˜ord“is‘ÌÇ`ÞnameÝ'.‘ QThis“optionŽ¡‘Kâ:alloš²!ws–Vman‘Vlarbitrary“c˜hoice“of“iden˜ti er‘Vlfor“this“compMÞonen˜t,‘Ânalthough‘Vlit“stillŽ¡‘Kâ:mš²!ust–¦foMÞccur“as“the“ rst“ eld“in“y˜our“supplied“ÞstructÝ.ަ‘G`Þ%define–¦finitializer-suffix“äinitializers‘DsÝ'Ž¡‘Kâ:This–ïXdeclaration›ïYis“only˜useful“when˜option“`Þ-tÝ'“(or,‘ ”equiv‘ÿdDalen²!tly‘ÿe,‘ “theŽ¡‘Kâ:`Þ%struct-typeÝ'–M›declaration)‘Mšhas“bšMÞeen“giv²!en.‘Ó{It“p˜ermits“to‘Mšsp˜ecify“initializersŽ¡‘Kâ:for–Jäthe“structure“memš²!bMÞers“follo˜wing“áslot-name‘çëÝin“empt˜y“hash“table“en˜tries.Ž¡‘Kâ:The–$list›%of“initializers˜should“start˜with“a“comma.‘ By“default,‘iTthe“emittedŽ¡‘Kâ:cošMÞde–¦fwill“zero-initialize“structure“mem²!b˜ers“follo²!wing“áslot-nameÝ.ަ‘G`Þ%define–¦fhash-function-name“äname‘DsÝ'Ž¡‘Kâ:Allo•²!ws›“Iy“ou˜to˜spMÞecify˜the˜name‘“Hfor˜the˜generated˜hash˜function.‘×~Default˜nameŽ¡‘Kâ:is–¦f`ÞhashÝ'.‘ÝÝThis“option“pMÞermits“the“use“of“t•²!w“o–¦fhash“tables“in“the“same“ le.ަ‘G`Þ%define–¦flookup-function-name“äname‘DsÝ'Ž¡‘Kâ:Allo•²!ws› Ly“ou˜to˜sp•MÞecify˜the˜name˜for‘ Mthe˜generated˜lo“okup˜function.‘ DefaultŽ¡‘Kâ:name–V;is“`Þin_word_setÝ'.‘Ã%This“option“pMÞermits“m²!ultiple‘VÌÝ18ŽŽŽ ƒ33 ý ÌÍ‘G`Þ%define–¦fclass-name“äname‘DsÝ'ޤ 33‘Kâ:This–eoption›fis“only˜useful“when˜option“`Þ-L‘¦fC++Ý'˜(or,‘ 3£equiv‘ÿdDalen²!tly‘ÿe,‘ 3¤theŽ¡‘Kâ:`Þ%language=C++Ý'–€àdeclaration)›€ßhas“bMÞeen˜givš²!en.‘ mJIt“allo˜ws‘€ßy˜ou“to‘€ßspMÞecify“theŽ¡‘Kâ:name–¦fof“generated“CÞ++“Ýclass.‘ÝÝDefault“name“is“ÞPerfect_HashÝ.Ž©ÌΑG`Þ%7bitÝ'‘ýKThis–u'option“spMÞeci es›u(that“all“strings“that˜will“bMÞe“passed“as˜argumen²!ts“to“theŽ¡‘Kâ:generated–.Îhash“function“and“the“generated‘.ÍloMÞokup“function“will“solely“consistŽ¡‘Kâ:of–ý·7-bit“ASCIMÞI‘ý¡cš²!haracters“(b˜ytes“in“the“range‘ý¸0..127).‘ãÐ(Note“that“the“ANSI‘ý¡CŽ¡‘Kâ:functions–ÖõÞisalnum›ÖôÝand“Þisgraph˜Ýdo“ànot‘àßÝguaran²!tee˜that“a“b²!yte˜is“in˜this“range.Ž¡‘Kâ:Only–¦fan“explicit“test“likš²!e“`Þc“>=“'A'“&&“c“<=“'Z'Ý'“guaran˜tees“this.)ŽŸÌÍ‘G`Þ%compare-lengthsÝ'Ž¡‘Kâ:Compare›ÉÞk•²!eyw“ord˜lengths‘ÉÝbMÞefore˜trying˜a˜string˜comparison.‘HDThis˜option˜isŽ¡‘Kâ:mandatory–çÞfor›çÝbinary“comparisons˜(see“Section˜3.3“[Binary˜Strings],‘ø;page“22).Ž¡‘Kâ:It–ö,also“mighš²!t“cut‘ö+do˜wn“on“the“n˜um˜bMÞer“of“string‘ö+comparisons“made“during“theŽ¡‘Kâ:loMÞokup,‘‰since‘´k•²!eyw“ords–µwith“di erenš²!t“lengths“are“nev˜er“compared“via“ÞstrcmpÝ.Ž¡‘Kâ:Ho•²!w“ev“er,‘tõusing–h™`Þ%compare-lengthsÝ'“migh²!t›h˜greatly“increase“the“size˜of“the“gen-Ž¡‘Kâ:erated–©ÖC“cošMÞde“if“the“lo˜okup“table›©×range“is“large“(whic²!h“implies˜that“the“switc²!hŽ¡‘Kâ:option–àÐ`Þ-SÝ'“or“`Þ%switchÝ'“is“not“enabled),‘Tsince“the“length“table“conš²!tains“as“man˜yŽ¡‘Kâ:elemenš²!ts–¦fas“there“are“en˜tries“in“the“loMÞokup“table.ަ‘G`Þ%compare-strncmpÝ'Ž¡‘Kâ:Generates–†C‘…ÑcošMÞde“that“uses“the“Þstrncmp‘†Ýfunction“to“p˜erform“string“comparisons.Ž¡‘Kâ:The–¦fdefault“action“is“to“use“ÞstrcmpÝ.ަ‘G`Þ%readonly-tablesÝ'Ž¡‘Kâ:Makš²!es–Ä the“con˜ten˜ts›Ä of“all“generated“loMÞokup˜tables“constan²!t,– ti.e.,“\readonly".Ž¡‘Kâ:Man²!y–©Ãcompilers›©Âcan“generate˜more“ecien²!t“coMÞde˜for“this˜b²!y“putting˜the“tablesŽ¡‘Kâ:in–¦freadonly“memory‘ÿe.ŽŸÌÍ‘G`Þ%enumÝ'‘ýKDe ne–§Ðconstanš²!t“v‘ÿdDalues“using“an“en˜um‘§ÑlošMÞcal“to“the“lo˜okup“function“rather“thanŽ¡‘Kâ:with–x¿#de nes.‘TéThis“also“means“that“di eren²!t“loMÞokup‘xÀfunctions“can“reside“inŽ¡‘Kâ:the–¦fsame“ le.‘ÝÝThanks“to“James“Clark“ÞÝ.ަ‘G`Þ%includesÝ'Ž¡‘Kâ:Include–¸$the“necessary“system“include“ le,–¼“ÞÝ,“at–¸$the“bMÞeginning“of“theŽ¡‘Kâ:coMÞde.‘°zBy–>default,‘9ythis“is“not“done;‘K the“user“m²!ust“include“this‘=header“ le“himselfŽ¡‘Kâ:to–¦fallo²!w“compilation“of“the“coMÞde.ŽŸÌÍ‘G`Þ%global-tableÝ'Ž¡‘Kâ:Generate–däthe›dãstatic“table˜of“k•²!eyw“ords˜as–däa“static˜global“v‘ÿdDariable,‘”‚rather“thanŽ¡‘Kâ:hiding–¦fit“inside“of“the“lošMÞokup“function“(whic²!h“is“the“default“b˜eha²!vior).ަ‘G`Þ%picÝ'‘¼õOptimize–ðÍthe“generated‘ðÌtable“for“inclusion“in“shared“libraries.‘½This“reducesŽ¡‘Kâ:the–;.startup“time“of“programs“using‘;/a“shared“library“con²!taining“the“generatedŽ¡‘Kâ:coMÞde.‘…ÝIf›ždthe–že`Þ%struct-typeÝ'“declaration˜(or,–Ó2equiv‘ÿdDalen²!tly‘ÿe,“the˜option–že`Þ-tÝ')˜is“alsoŽ¡‘Kâ:giv²!en,‘­êthe–¬i rst›¬j eld“of“the˜user-de ned“struct“m²!ust˜bšMÞe“of“t²!yp˜e‘¬j`ÞintÝ',‘­ênot“`ÞcharŽ¡‘Kâ:*Ý',‘ÒœbMÞecause–ÉÄit“will‘ÉÅconš²!tain“o sets“in˜to“the›ÉÅstring“p•MÞo“ol–ÉÄinstead“of˜actual“strings.Ž¡‘Kâ:T‘ÿeo›í con•²!v“ert‘í suc“h˜an˜o set‘í to˜a˜string,‘þ³y“ou–í can˜use˜the“expression˜`ÞstringpoolŽ¡‘Kâ:+‘¦fäo‘DsÝ',‘ùQwhere–è¼áo‘uŒÝis“the“o set.‘¤ßThe“string“p•MÞo“ol–è¼name“can“bMÞe“c²!hanged“through“theŽ¡‘Kâ:`Þ%define–¦fstring-pool-nameÝ'“declaration.ŽŽŒ‹—Ÿò‘GÝChapter–¦f3:‘ÝÝHigh-Lev²!el“Description“of“GNU“Þgperf’·>ÌÝ19ŽŽŽ ƒ33 ý ÌÍ‘G`Þ%define–¦fstring-pool-name“äname‘DsÝ'ޤ 33‘Kâ:Allo•²!ws›íŒy“ou˜to˜sp•MÞecify˜the˜name˜of‘íthe˜generated˜string˜p“o“ol˜created˜b²!y˜theŽ¡‘Kâ:declaration‘–ÿ`Þ%picÝ'›—(or,–%equiv‘ÿdDalen²!tly‘ÿe,“the˜option––ÿ`Þ-PÝ').‘ ¯ªThe“default˜name“isŽ¡‘Kâ:`ÞstringpoolÝ'.‘×EThis–’declaration“pMÞermits›’žthe“use“of˜t•²!w“o–’hash“tables“in˜the“sameŽ¡‘Kâ: le,‘—žwith–g``Þ%picÝ'›g_and“ev²!en“when“the“`Þ%global-tableÝ'˜declaration“(or,‘—žequiv‘ÿdDa-Ž¡‘Kâ:lenš²!tly‘ÿe,–¦fthe“option“`Þ-GÝ')“is“giv˜en.Ž©s4‘G`Þ%null-stringsÝ'Ž¡‘Kâ:Use–©¢NULL‘©`strings“instead“of‘©£emptš²!y“strings“for“empt˜y‘©£k˜eyw˜ord“table“en˜tries.Ž¡‘Kâ:This–©œreduces“the“startup“time“of‘©programs“using“a“shared“library“con²!tainingŽ¡‘Kâ:the–jJgenerated“cošMÞde“(but“not“as“m•²!uc“h–jJas“the“declaration“`Þ%picÝ'),‘vOat“the“exp˜enseŽ¡‘Kâ:of–¦fone“more“test-and-branc²!h“instruction“at“run“time.ަ‘G`Þ%define–¦fword-array-name“äname‘DsÝ'Ž¡‘Kâ:Allo•²!ws›ÍÃy“ou˜to–ÍÂspMÞecify˜the˜name˜for“the˜generated˜arra•²!y˜con“taining‘ÍÂthe˜hashŽ¡‘Kâ:table.‘ –oDefault–9Aname“is–9B`ÞwordlistÝ'.‘ –nThis“option–9ApMÞermits“the“use‘9Bof“t•²!w“oŽ¡‘Kâ:hash–‰tables›‰in“the˜same“ le,‘Á®ev²!en˜when“the˜option“`Þ-GÝ'˜(or,‘Á¯equiv‘ÿdDalen²!tly‘ÿe,‘Á®theŽ¡‘Kâ:`Þ%global-tableÝ'–¦fdeclaration)“is“giv²!en.ŽŸs5‘G`Þ%define–¦flength-table-name“äname‘DsÝ'Ž¡‘Kâ:Allo•²!ws›&Yy“ou˜to˜spMÞecify‘&Xthe˜name˜for˜the˜generated˜arra“y‘&Xcon“taining˜the˜lengthŽ¡‘Kâ:table.‘ #oDefault–ìname“is“`ÞlengthtableÝ'.‘ #pThis“option“pMÞermits“the“use“of“t•²!w“oŽ¡‘Kâ:length–öëtables“in›öìthe“same“ le,‘ ev²!en˜when“the“option“`Þ-GÝ'“(or,‘ equiv‘ÿdDalen²!tly‘ÿe,‘ theŽ¡‘Kâ:`Þ%global-tableÝ'–¦fdeclaration)“is“giv²!en.ަ‘G`Þ%switch=äcount‘DsÝ'Ž¡‘Kâ:Causes–J‰the›Jˆgenerated“C‘J^coMÞde“to˜use“a˜Þswitch“Ýstatemen•²!t˜sc“heme,‘s‘rather‘J‰thanŽ¡‘Kâ:an–arra²!y“lošMÞokup“table.‘˜This“can“lead“to“a“reduction“in“b˜oth“time“and“spaceŽ¡‘Kâ:requiremenš²!ts–8Ôfor“some“input‘8Ó les.‘ •'The“argumen˜t“to‘8Óthis“option“determinesŽ¡‘Kâ:ho•²!w›í¶man“y‘í·Þswitch˜Ýstatemen“ts–í·are˜generated.‘³ÏA‘í¤v‘ÿdDalue˜of“1˜generates“1˜ÞswitchŽ¡‘Kâ:Ýconš²!taining–‹all“the‘ÂŒelemen˜ts,‘ða“v‘ÿdDalue“of›ÂŒ2“generates“2“tables“with˜1/2“the“elemen²!tsŽ¡‘Kâ:in–•Üeacš²!h“ÞswitchÝ,‘Ѻetc.‘¬@This“is“useful“since‘•Ýman˜y“C‘•Ÿcompilers“cannot“correctlyŽ¡‘Kâ:generate–JxcoMÞde›Jwfor“large˜Þswitch“Ýstatemen²!ts.‘¿8This˜option“w²!as˜inspired“in˜part“b²!yŽ¡‘Kâ:Keith–¦fBostic's“original“C“program.ަ‘G`Þ%omit-struct-typeÝ'Ž¡‘Kâ:Prev•²!en“ts–S,the›S-transfer“of˜the“t²!ypMÞe˜declaration“to˜the“output˜ le.‘ÂUse˜this“optionŽ¡‘Kâ:if–¦fthe“t²!ypMÞe“is“already“de ned“elsewhere.ŽŸ$@‘Gëb3.1.1.3‘d(C–íMCoide“InclusionŽŽŸ³3‘!GÝUsing–aa“syn²!tax“similar›bto“GNU‘?utilities“Þflex“Ýand“ÞbisonÝ,‘:bit“is˜pMÞossible“to“directly“includeŽ¡‘GC‘ˆ°source–ˆ¸text“and“commenš²!ts“v˜erbatim“in˜to‘ˆ·the“generated“output“ le.‘ÓøThis“is“accomplishedŽ¡‘Gb²!y–yFenclosing“the›yGregion“inside“left-justi ed“surrounding˜`Þ%{Ý',‘­ý`Þ%}Ý'˜pairs.‘V}Here˜is“an“inputŽ¡‘Gfragmen²!t–¦fbased“on“the“previous“example“that“illustrates“this“feature:ŽŽŒ‹Ÿò‘GÝChapter–¦f3:‘ÝÝHigh-Lev²!el“Description“of“GNU“Þgperf’·>ÌÝ20ŽŽŽ ƒ33 ý ÌÍ‘.ùœÞ%{ޤ 33‘.ùœ#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,‘ T2,–¿ª28,“29Ž¡‘.ùœmarch,‘¾R3,–¿ª31,“31Ž¡‘.ùœ...ŽŽ ¡™‘Gëb3.1.2‘d(F‘þÄ£ormat–íMfor“Keywš–áord“En˜triesŽŽŸ³3‘!GÝThe–"Jsecond“input“ le‘"Iformat“section“conš²!tains“lines“of“k˜eyw˜ords‘"Iand“an˜y“assoMÞciated“at-ޤ 33‘Gtributes–Ÿ•yš²!ou“migh˜t›Ÿ”supply‘ÿe.‘ÉjA‘ŸUline“bMÞeginning˜with“`Þ#Ý'“in“the“ rst“column˜is“considered“aŽ¡‘Gcommen•²!t.‘+ÈEv“erything›´follo“wing˜the˜`Þ#Ý'˜is˜ignored,‘1ˆup˜to˜and˜including‘µthe˜follo“wing˜new-Ž¡‘Gline.‘Ö¶A‘Nƒline–N¯bMÞeginning›N®with“`Þ%Ý'˜in˜the“ rst˜column“is˜an˜option“declaration˜and“m²!ust˜notŽ¡‘GoMÞccur–¦fwithin“the“k•²!eyw“ords‘¦fsection.Ž©LΑ!GThe–h rst›h eld“of“eac•²!h˜non-commen“t–hline“is˜alw•²!a“ys‘hthe˜k“eyw“ord–hitself.‘"åIt“can˜bMÞe“giv²!enŽ¡‘Gin›5t•²!w“o˜w“a“ys:‘ûIas˜a˜simple˜name,–XÊi.e.,‘XÉwithout˜surrounding˜string˜quotation˜marks,“or˜as˜aŽ¡‘Gstring–… enclosed“in“double-quotes,‘¼·in“C‘„Ôsynš²!tax,‘¼¶pMÞossibly“with‘…bac˜kslash“escapMÞes“lik˜e“Þ\"“ÝorŽ¡‘GÞ\234–î¦Ýor“Þ\xa8Ý.‘ In“either“case,‘fit“mš²!ust“start“righ˜t“at‘î¥the“bMÞeginning“of“the“line,‘fwithout“leadingŽ¡‘Gwhitespace.‘Û)In–P*this›P)con²!text,‘z›a“\ eld"“is“considered˜to“extend“up“to,‘z›but“not˜include,‘z›theŽ¡‘G rst›Ÿýblank,–Þbcomma,“or–Ÿünewline.‘Ê¡Here˜is˜a“simple˜example˜tak²!en˜from“a˜partial˜list“of˜CŽ¡‘Greserv•²!ed‘¦fw“ords:ŽŸLÏ‘.ùœÞ#–¿ª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ŽŽ ™LÌ‘!GÝNote–o9that“unlikš²!e“Þflex‘o8Ýor“Þbison“Ýthe“ rst“`Þ%%Ý'“mark˜er“ma˜y“bMÞe‘o8elided“if“the“declarationŽ¡‘Gsection–¦fis“empt²!y‘ÿe.ަ‘!GAdditional–p elds‘pmaš²!y“optionally“follo˜w›pthe“leading˜k•²!eyw“ord.‘˽Fields–pshould˜bMÞe“separatedŽ¡‘Gb²!y–e¸commas,‘r§and“terminate›e·at“the˜end“of“line.‘ÈMWhat“these˜ elds“mean“is˜en²!tirely“up˜to“y²!ou;Ž¡‘Gthey–ûare›ûused“to˜initialize“the˜elemen²!ts“of˜the“user-de ned˜Þstruct“Ýpro•²!vided˜b“y‘ûy“ou˜in‘ûtheŽ¡‘Gdeclaration–¨ísection.‘åsIf“the“`Þ-tÝ'“option“(or,–éequiv‘ÿdDalen²!tly‘ÿe,“the–¨í`Þ%struct-typeÝ'“declaration)Ž¡‘Gis–P+ànot‘ZÝenabled›P*these“ elds“are“simply˜ignored.‘Û,All˜previous“examples“except“the˜last“oneŽ¡‘Gcon•²!tain›¦fk“eyw“ord˜attributes.ŽŽŒ‹ šŸò‘GÝChapter–¦f3:‘ÝÝHigh-Lev²!el“Description“of“GNU“Þgperf’·>ÌÝ21ŽŽŽ ƒ33 ý ÌÍ‘Gëb3.1.3‘d(Including–íMAdditional“C“F‘þÄ£unctionsŽŽ©³3‘!GÝThe–´“optional“third›´’section“also“correspMÞonds“closely˜with“con•²!v“en“tions–´“found“in˜Þflex“Ýandޤ 33‘GÞbisonÝ.‘†èAll–¡ˆtext“in›¡‡this“section,‘Õ´starting˜at“the˜ nal“`Þ%%Ý'˜and“extending˜to“the˜end“of˜the“inputŽ¡‘G le,‘»is–¶øincluded“vš²!erbatim“in˜to“the“generated“output‘¶ù le.‘“Naturally‘ÿe,‘»it“is“y˜our“respMÞonsibilit˜yŽ¡‘Gto–¦fensure“that“the“coMÞde“con²!tained“in“this“section“is“v‘ÿdDalid“C.ŽŸü—‘Gëb3.1.4‘d(Where–íMto“place“directiv–áes“for“GNU“ëeindentëb.ŽŽ¦‘!GÝIf–Fiyš²!ou“w˜an˜t“to“in˜v˜ok˜e›FhGNU‘FQÞindent“Ýon“a“Þgperf“Ýinput˜ le,‘Yœy²!ou“will“see“that˜GNU‘FQÞindentŽ¡‘GÝdoMÞesn't–õ:understand›õ9the“`Þ%%Ý',‘î`Þ%{Ý'˜and“`Þ%}Ý'˜directiv²!es“that˜con²!trol“ÞgperfÝ's˜in²!terpretation“ofŽ¡‘Gthe–¿•input“ le.‘íTherefore‘¿–yš²!ou“ha˜v˜e“to“insert“some‘¿–directiv˜es“for“GNU‘¿[ÞindentÝ.‘íMore“precisely‘ÿe,Ž¡‘Gassuming–¦fthe“most“general“input“ le“structureŽ©/Ê‘.ùœÞdeclarations–¿ªpart“1Ž¡‘.ùœ%{Ž¡‘.ùœverbatim‘¿ªcodeŽ¡‘.ùœ%}Ž¡‘.ùœdeclarations–¿ªpart“2Ž¡‘.ùœ%%Ž¡‘.ùœkeywordsŽ¡‘.ùœ%%Ž¡‘.ùœfunctionsŽŽŸzÉc‘GÝy•²!ou›¦fw“ould˜insert˜`Þ*INDENT-OFF*Ý'˜and˜`Þ*INDENT-ON*Ý'˜commen“ts˜as˜follo“ws:ަ‘.ùœÞ/*–¿ª*INDENT-OFF*“*/Ž¡‘.ùœdeclarations–¿ªpart“1Ž¡‘.ùœ%{Ž¡‘.ùœ/*–¿ª*INDENT-ON*“*/Ž¡‘.ùœverbatim‘¿ªcodeŽ¡‘.ùœ/*–¿ª*INDENT-OFF*“*/Ž¡‘.ùœ%}Ž¡‘.ùœdeclarations–¿ªpart“2Ž¡‘.ùœ%%Ž¡‘.ùœkeywordsŽ¡‘.ùœ%%Ž¡‘.ùœ/*–¿ª*INDENT-ON*“*/Ž¡‘.ùœfunctionsŽŽ »áG‘GëY3.2‘™Output–f@F‘þ¦format“for“Generated“C“Cos3de“with“ë\gperfŽŽŸ33‘!GÝSevš²!eral–O-options“con˜trol“ho˜w“the“generated“C‘OcošMÞde“app˜ears“on“the“standard“output.‘ÀÊTw²!oŽ¡‘GC‘tfunctions–Óare“generated.‘ 2$They“are“called“Þhash“Ýand“Þin_word_setÝ,‘t.although“yš²!ou“ma˜yŽ¡‘GmoMÞdify–¬gtheir›¬fnames“with“a“command-line˜option.‘ïßBoth“functions“require˜t•²!w“o‘¬gargumen“ts,‘­çaŽ¡‘Gstring,–äÑÞchar‘¦f*›ØVástrÝ,“and–ØUa“length˜parameter,‘äÑÞint“álenÝ.‘s«Their˜default“function˜protot²!ypMÞes“areŽ¡‘Gas‘¦ffollo²!ws:ŽŸ,a’“z[F‘ÿeunction]ŽŽ‘Gó=ßêßêÌÝ22ŽŽŽ ƒ33 ý ÌÍ‘.ùœstored–^Îin“a“lošMÞcal“static“arra²!y‘ÿe.‘ÅÿThe“asso˜ciated“v‘ÿdDalues“table“is“constructed“inš²!ternally“b˜yޤ 33‘.ùœÞgperf–3ðÝand“later›3ïoutput“as“a“static˜loMÞcal“C‘3Ëarraš²!y“called“`Þhash_tableÝ'.‘†zThe“relev‘ÿdDan˜tŽ¡‘.ùœselected–9pšMÞositions“(i.e.‘¹hindices“in²!to“ástr‘É)Ý)‘9are“sp˜eci ed“via“the“`Þ-kÝ'‘9option“when“runningŽ¡‘.ùœÞgperfÝ,–¦fas“detailed“in“the“àOptions‘Œ~Ýsection“bMÞelo²!w“(see“Chapter“4“[Options],“page“24).ŽŸX’“z[F‘ÿeunction]ŽŽ‘Gèin_word_set‘yšâ(áconst–¦fcš²!har“*“éstrá,“unsigned“in˜t“élen‘câ)Ž¡‘.ùœÝIf–¡ástr‘ÚËÝis“in›¢the“k•²!eyw“ord˜set,‘,preturns˜a›¡pMÞoin“ter˜to‘¢that˜k“eyw“ord.‘More˜exactly‘ÿe,‘,qif˜theŽ¡‘.ùœoption‘®`Þ-tÝ'›®(or,–° equiv‘ÿdDalen²!tly‘ÿe,“the˜`Þ%struct-typeÝ'–®declaration)˜wš²!as“giv˜en,‘° it‘®returns“aŽ¡‘.ùœpMÞoinš²!ter–¦fto“the“matc˜hing“k˜eyw˜ord's“structure.‘ÝÝOtherwise“it“returns“ÞNULLÝ.ŽŸX‘!GIf–Ó the“option“`Þ-cÝ'“(or,–îequiv‘ÿdDalen²!tly‘ÿe,“the–Ó `Þ%compare-strncmpÝ'“declaration)“is“not“used,Ž¡‘Gástr‘CâÝmš²!ust–z¹bMÞe“a“NUL‘z‚terminated“string“of“exactly“length“álenÝ.‘ZÖIf“`Þ-cÝ'“(or,‘¯Îequiv‘ÿdDalen˜tly‘ÿe,‘¯ÍtheŽ¡‘G`Þ%compare-strncmpÝ'–õdeclaration)›ôis“used,‘9>ástr‘çÝm²!ust“simply˜bMÞe“an“arra²!y˜of“álen“Ýb²!ytes˜and“doMÞesŽ¡‘Gnot–¦fneed“to“bMÞe“NUL“terminated.ŽŸE¢‘!GThe–¦fcoMÞde“generated“for“these“t•²!w“o–¦ffunctions“is“a ected“bš²!y“the“follo˜wing“options:Ž©ÎÚ‘G`Þ-tÝ'Ž¡‘G`Þ--struct-typeÝ'Ž¡‘Kâ:Mak²!e–¦fuse“of“the“user-de ned“ÞstructÝ.ŽŸE¢‘G`Þ-S‘¦fätotal-switch-statements‘DsÝ'Ž¡‘G`Þ--switch=ätotal-switch-statements‘DsÝ'Ž¡‘Kâ:Generate–{‹1“or“more“C‘{@Þswitch“Ýstatemenš²!t“rather“than“use“a“large,‘·Q(and“pMÞoten˜tiallyŽ¡‘Kâ:sparse)›Á»static–Á¼arra²!y‘ÿe.‘‘¤Although“the˜exact˜time“and˜space“sa²!vings˜of“this˜approac²!hŽ¡‘Kâ:v‘ÿdDary–ÍIaccording“to›ÍJy²!our“C‘Í?compiler's“degree“of˜optimization,‘×this“methoMÞd“oftenŽ¡‘Kâ:results–¦fin“smaller“and“faster“coMÞde.ަ‘!GIf–Wthe“`Þ-tÝ'›Wand“`Þ-SÝ'“options“(or,‘fùequiv‘ÿdDalen²!tly‘ÿe,‘føthe“`Þ%struct-typeÝ'˜and“`Þ%switchÝ'“declara-Ž¡‘Gtions)–ýare“omitted,‘úthe“default“action“is“to“generate“a“Þchar‘¦f*“Ýarraš²!y“con˜taining“the“k˜eyw˜ords,Ž¡‘Gtogether–«ewith“additional“emptš²!y“strings“used“for‘«fpadding“the“arra˜y‘ÿe.‘ìÚBy“expMÞerimen˜ting“withŽ¡‘Gthe–¿¡v‘ÿdDarious›¿¢input“and˜output“options,‘Åñand“timing˜the“resulting˜C‘¿›coMÞde,‘Åðy²!ou˜can“determineŽ¡‘Gthe–¦fbMÞest“option“cš²!hoices“for“di eren˜t“k˜eyw˜ord“set“c˜haracteristics.ŽŸ›§‘GëY3.3‘™Use–f@of“NUL“bŒÌytesŽŽŸ33‘!GÝBy– default,‘¡athe›  coMÞde“generated˜b²!y“Þgperf˜ÝopMÞerates“on˜zero“terminated˜strings,‘¡athe“usualŽ¡‘Grepresen²!tation–ÂÝof›ÂÞstrings“in“C.“This˜means“that“the“k•²!eyw“ords˜in–ÂÝthe“input“ le˜m²!ust“notŽ¡‘Gcon•²!tain›QNUL‘PÔb“ytes,‘{¦and˜the˜ástr‘)Ýargumen“t˜passed˜to˜Þhash˜Ýor˜Þin_word_set˜Ým“ust˜bMÞe˜NULŽ¡‘Gterminated–¦fand“ha•²!v“e–¦fexactly“length“álenÝ.Ž©E¢‘!GIf–Uîoption“`Þ-cÝ'›Uï(or,–Ðequiv‘ÿdDalen²!tly‘ÿe,“the–Uî`Þ%compare-strncmpÝ'“declaration)“is˜used,‘Ðthen“theŽ¡‘Gástr‘$¯Ýargumen²!t–[†došMÞes“not“need‘[…to“b˜e“NUL‘[sterminated.‘ÄèThe“co˜de‘[…generated“b²!y“Þgperf“Ýwill“onlyŽ¡‘Gaccess–[Xthe‘[Y rst“álenÝ,›j[not“álenÞ+á1Ý,˜bš²!ytes“starting‘[Yat“ástrÝ.‘ÄÙHo˜w˜ev˜er,‘j[the“k˜eyw˜ords“in“the‘[Yinput“ leŽ¡‘Gstill–¦fmš²!ust“not“con˜tain“NUL“b˜ytes.ަ‘!GIf–Uîoption“`Þ-lÝ'›Uï(or,–Ðequiv‘ÿdDalen²!tly‘ÿe,“the–Uî`Þ%compare-lengthsÝ'“declaration)“is˜used,‘Ðthen“theŽ¡‘Ghash–îtable“pMÞerforms›îbinary“comparison.‘´ÀThe˜k•²!eyw“ords–îin“the“input“ le˜maš²!y“con˜tain“NULŽ¡‘Gbš²!ytes,‘b_written‘ •in– ”string“syn˜tax“as› •Þ\000“Ýor“Þ\x00Ý,‘b_and˜the“coMÞde“generated“b²!y˜Þgperf“ÝwillŽ¡‘Gtreat–þXNUL‘þlikš²!e“an˜y“other“b˜yte.‘å³Also,›TTin“this“case“the“`Þ-cÝ'“option“(or,˜equiv‘ÿdDalen²!tly‘ÿe,˜theŽ¡‘G`Þ%compare-strncmpÝ'–¦fdeclaration)“is“ignored.ŽŽŒ‹6.Ÿò‘GÝChapter–¦f3:‘ÝÝHigh-Lev²!el“Description“of“GNU“Þgperf’·>ÌÝ23ŽŽŽ ƒ33 ý ÌÍ‘GëY3.4‘™The›f@Cop•ŒÌyrigh“t˜of˜the˜OutputŽŽŸ33‘!GÞgperf–ËÝis“under›ÊGPL,“but“that“doMÞes“not˜cause“the“output“proMÞduced“b²!y“Þgperf˜Ýto“bMÞe“underޤ 33‘GGPL.–#ÁThe›#Âreason“is˜that“the“output˜con²!tains“only˜small“pieces“of˜text“that˜come“directlyŽ¡‘Gfrom– 'ÞgperfÝ's“source“cošMÞde“{‘ (only“ab˜out“7“lines“long,‘>—to˜o“small“for‘ (b˜eing“signi can²!t“{,‘>—andŽ¡‘Gtherefore–¦fthe“output“is“not“a“\wš²!ork“based“on“ÞgperfÝ"“(in“the“sense“of“the“GPL“v˜ersion“3).ŽŸ33‘!GOn–ý¾the›ý¿other“hand,‘”the“output˜proMÞduced“b²!y“Þgperf˜Ýconš²!tains“essen˜tially“all“of‘ý¿the“inputŽ¡‘G le.‘¹xTherefore–95the“output›96is“a“\deriv‘ÿdDativ•²!e˜w“ork"–95of“the˜input“(in˜the“sense“of˜U.S.“cop•²!yrigh“tŽ¡‘Glaš²!w);‘èyand–}its“cop˜yrigh˜t›}status“depMÞends“on“the˜cop•²!yrigh“t–}of“the˜input.‘bF‘ÿeor˜most“soft•²!w“areŽ¡‘Glicenses,›9athe– result“is“that“the“the“output‘is“under“the“same“license,˜with“the“same“cop•²!yrigh“tŽ¡‘Gholder,–¦fas“the“input“that“w²!as“passed“to“ÞgperfÝ.ŽŽŒ‹F\Ÿò‘GÝChapter›¦f4:‘ÝÝIn•²!v“oking˜Þgperf’%7…Ý24ŽŽŽ ƒ33 ý ÌÍ‘GëP4‘ ¸QIn–ÿuÂv“oking‘z³ëSgperfŽŽŸ"‘º‘!GÝThere–`are›`€àmany‘X‚Ýoptions“to˜ÞgperfÝ.‘ -They“w²!ere˜added“to“mak²!e˜the“program˜more“con-ޤ 33‘Gv•²!enien“t–4for›5use“with“real“applications.‘ëH\On-line"“help˜is“readily“a²!v‘ÿdDailable“via˜the“`Þ--helpÝ'Ž¡‘Goption.‘ÝÝHere–¦fis“the“complete“list“of“options.Ž©/D‘GëY4.1‘™Spšs3ecifying–f@the“Lo˜cation“of“the“Output“FileŽŽŸBô‘GÝ`Þ--output-file=äfile‘DsÝ'Ž¡‘Kâ:Allo•²!ws›¦fy“ou˜to˜spMÞecify˜the˜name˜of˜the˜ le˜to˜whic“h˜the˜output˜is˜written˜to.ŽŸbw‘!GThe–¦fresults“are“written“to“standard“output“if“no“output“ le“is“spMÞeci ed“or“if“it“is“`Þ-Ý'.ަ‘GëY4.2‘™Options–f@that“a ect“InŒÌterpretation“of“the“Input“FileŽŽŸ33‘!GÝThese–options“are›also“a²!v‘ÿdDailable“as“declarations˜in“the“input“ le˜(see“Section“3.1.1.2Ž¡‘G[GpMÞerf–¦fDeclarations],“page“16).ŽŸbv‘G`Þ-e‘¦fäkeyword-delimiter-list‘DsÝ'Ž¡‘G`Þ--delimiters=äkeyword-delimiter-list‘DsÝ'Ž¡‘Kâ:Allo•²!ws›sy“ou‘sto˜pro“vide˜a˜string‘scon“taining˜delimiters˜used˜to‘sseparate˜k“eyw“ordsŽ¡‘Kâ:from›'§their–'¦attributes.‘a The“default˜is˜Þ"Ý,Þ"Ý.‘aŸThis“option˜is˜essen²!tial˜if“y•²!ou˜w“an“tŽ¡‘Kâ:to–ô^use“k•²!eyw“ords›ô^that‘ô]ha“v“e˜em“bMÞedded˜commas˜or˜newlines.‘ÇÄOne˜useful˜tric“k˜isŽ¡‘Kâ:to–¦fuse“-e'T›ÿeAB',“where“T˜AB“is“the“literal“tab“c²!haracter.ŽŸR¶‘G`Þ-tÝ'Ž¡‘G`Þ--struct-typeÝ'Ž¡‘Kâ:Allo•²!ws›Ày“ou–Àto˜include“a˜Þstruct“Ýt²!ypMÞe˜declaration˜for“generated˜coMÞde.‘*òAn²!y˜textŽ¡‘Kâ:bMÞefore–C6a›C7pair“of˜consecutiv²!e“`Þ%%Ý'˜is“considered“part˜of“the˜t²!ypMÞe“declaration.Ž¡‘Kâ:Keywš²!ords–À¾and‘À½additional“ elds“ma˜y‘À½follo˜w“this,‘Sone›À½group“of“ elds˜pMÞer“line.Ž¡‘Kâ:A‘¬öset›¬ùof–¬øexamples“for“generating“pMÞerfect“hash˜tables“and“functions“for“Ada,‘®C,Ž¡‘Kâ:CÞ++Ý,–ú›P²!ascal,‘úšMošMÞdula‘Ϩ2,“Mo˜dula‘ϧ3–Ϩand“Jaš²!v‘ÿdDaScript“reserv˜ed‘ϧw˜ords“are“distributedŽ¡‘Kâ:with–¦fthis“release.ŽŸRµ‘G`Þ--ignore-caseÝ'Ž¡‘Kâ:Consider–K¯uppšMÞer“and‘K®lo•²!w“er–K¯case“ASCI˜I‘KBcš²!haracters“as“equiv‘ÿdDalen˜t.‘ Í·The“stringŽ¡‘Kâ:comparison–d¤will“use‘d¥a“case“insigni canš²!t“c˜haracter‘d¥comparison.‘ÇòNote“that“loMÞcaleŽ¡‘Kâ:depMÞenden²!t–bcase“mappings“are“ignored.‘Ç=“'A'“&&“c“<=“'Z'Ý'–0guaran²!tees“this.)‘¶oThis˜w²!as“theŽ¡‘Kâ:default–9in›9v²!ersions“of“Þgperf˜Ýearlier“than˜2.7;‘]‹no²!w“the˜default“is“to˜suppMÞort“8-bitŽ¡‘Kâ:and›¦fm•²!ultib“yte˜c“haracters.ަ‘G`Þ-lÝ'Ž¡‘G`Þ--compare-lengthsÝ'Ž¡‘Kâ:Compare›ÉÞk•²!eyw“ord˜lengths‘ÉÝbMÞefore˜trying˜a˜string˜comparison.‘HDThis˜option˜isŽ¡‘Kâ:mandatory–çÞfor›çÝbinary“comparisons˜(see“Section˜3.3“[Binary˜Strings],‘ø;page“22).Ž¡‘Kâ:It–ö,also“mighš²!t“cut‘ö+do˜wn“on“the“n˜um˜bMÞer“of“string‘ö+comparisons“made“during“theŽ¡‘Kâ:loMÞokup,‘‰since‘´k•²!eyw“ords–µwith“di erenš²!t“lengths“are“nev˜er“compared“via“ÞstrcmpÝ.Ž¡‘Kâ:Ho•²!w“ev“er,‘!9using›¨`Þ-lÝ'‘©migh“t˜greatly˜increase–©the˜size˜of“the˜generated˜C‘coMÞde˜ifŽ¡‘Kâ:the–ŽéloMÞokup›Žêtable“range˜is“large“(whic²!h˜implies“that“the˜switc²!h“option˜`Þ-SÝ'“orŽ¡‘Kâ:`Þ%switchÝ'–³=is›³Ý.ŽŽŒ‹c³Ÿò‘GÝChapter›¦f4:‘ÝÝIn•²!v“oking˜Þgperf’%7…Ý27ŽŽŽ ƒ33 ý ÌÍ‘G`Þ-IÝ'ޤ 33‘G`Þ--includesÝ'Ž¡‘Kâ:Include–¸$the“necessary“system“include“ le,–¼“ÞÝ,“at–¸$the“bMÞeginning“of“theŽ¡‘Kâ:coMÞde.‘°zBy–>default,‘9ythis“is“not“done;‘K the“user“m²!ust“include“this‘=header“ le“himselfŽ¡‘Kâ:to–¦fallo²!w“compilation“of“the“coMÞde.Ž©JÖ‘G`Þ-GÝ'Ž¡‘G`Þ--global-tableÝ'Ž¡‘Kâ:Generate–däthe›dãstatic“table˜of“k•²!eyw“ords˜as–däa“static˜global“v‘ÿdDariable,‘”‚rather“thanŽ¡‘Kâ:hiding–¦fit“inside“of“the“lošMÞokup“function“(whic²!h“is“the“default“b˜eha²!vior).ަ‘G`Þ-PÝ'Ž¡‘G`Þ--picÝ'‘ýKOptimize–ðÍthe“generated‘ðÌtable“for“inclusion“in“shared“libraries.‘½This“reducesŽ¡‘Kâ:the–;.startup“time“of“programs“using‘;/a“shared“library“con²!taining“the“generatedŽ¡‘Kâ:coMÞde.‘…ÝIf›ždthe–žeoption“`Þ-tÝ'˜(or,–Ó2equiv‘ÿdDalen²!tly‘ÿe,“the˜`Þ%struct-typeÝ'–žedeclaration)˜is“alsoŽ¡‘Kâ:giv²!en,‘­êthe–¬i rst›¬j eld“of“the˜user-de ned“struct“m²!ust˜bšMÞe“of“t²!yp˜e‘¬j`ÞintÝ',‘­ênot“`ÞcharŽ¡‘Kâ:*Ý',‘ÒœbMÞecause–ÉÄit“will‘ÉÅconš²!tain“o sets“in˜to“the›ÉÅstring“p•MÞo“ol–ÉÄinstead“of˜actual“strings.Ž¡‘Kâ:T‘ÿeo›í con•²!v“ert‘í suc“h˜an˜o set‘í to˜a˜string,‘þ³y“ou–í can˜use˜the“expression˜`ÞstringpoolŽ¡‘Kâ:+‘¦fäo‘DsÝ',‘ùQwhere–è¼áo‘uŒÝis“the“o set.‘¤ßThe“string“p•MÞo“ol–è¼name“can“bMÞe“c²!hanged“through“theŽ¡‘Kâ:option‘¦f`Þ--string-pool-nameÝ'.ŽŸJÕ‘G`Þ-Q‘¦fästring-pool-name‘DsÝ'Ž¡‘G`Þ--string-pool-name=ästring-pool-name‘DsÝ'Ž¡‘Kâ:Allo•²!ws›Ây“ou˜to–ÂspMÞecify˜the˜name˜of“the˜generated˜string˜p•MÞo“ol‘Âcreated˜b²!y˜optionŽ¡‘Kâ:`Þ-PÝ'.›ÎThe–’9default“name“is“`ÞstringpoolÝ'.˜This“option“pMÞermits“the“use“of“t•²!w“o‘’9hashŽ¡‘Kâ:tables–Ú®in“the“same“ le,›lwith“`Þ-PÝ'“and‘Ú¯ev²!en“when“the“option“`Þ-GÝ'“(or,˜equiv‘ÿdDalen²!tly‘ÿe,Ž¡‘Kâ:the–¦f`Þ%global-tableÝ'“declaration)“is“giv²!en.ަ‘G`Þ--null-stringsÝ'Ž¡‘Kâ:Use–©¢NULL‘©`strings“instead“of‘©£emptš²!y“strings“for“empt˜y‘©£k˜eyw˜ord“table“en˜tries.Ž¡‘Kâ:This–©œreduces“the“startup“time“of‘©programs“using“a“shared“library“con²!tainingŽ¡‘Kâ:the–Ýøgenerated›Ý÷coMÞde“(but˜not“as˜m•²!uc“h–Ýøas“option˜`Þ-PÝ'),‘+Üat˜the“expMÞense˜of“oneŽ¡‘Kâ:more–¦ftest-and-branc²!h“instruction“at“run“time.ަ‘G`Þ-W‘¦fähash-table-array-name‘DsÝ'Ž¡‘G`Þ--word-array-name=ähash-table-array-name‘DsÝ'Ž¡‘Kâ:Allo•²!ws›ÍÃy“ou˜to–ÍÂspMÞecify˜the˜name˜for“the˜generated˜arra•²!y˜con“taining‘ÍÂthe˜hashŽ¡‘Kâ:table.‘ –oDefault–9Aname“is–9B`ÞwordlistÝ'.‘ –nThis“option–9ApMÞermits“the“use‘9Bof“t•²!w“oŽ¡‘Kâ:hash–‰tables›‰in“the˜same“ le,‘Á®ev²!en˜when“the˜option“`Þ-GÝ'˜(or,‘Á¯equiv‘ÿdDalen²!tly‘ÿe,‘Á®theŽ¡‘Kâ:`Þ%global-tableÝ'–¦fdeclaration)“is“giv²!en.ŽŸ?‘G`Þ--length-table-name=älength-table-array-name‘DsÝ'Ž¡‘Kâ:Allo•²!ws›&Yy“ou˜to˜spMÞecify‘&Xthe˜name˜for˜the˜generated˜arra“y‘&Xcon“taining˜the˜lengthŽ¡‘Kâ:table.‘ #oDefault–ìname“is“`ÞlengthtableÝ'.‘ #pThis“option“pMÞermits“the“use“of“t•²!w“oŽ¡‘Kâ:length–öëtables“in›öìthe“same“ le,‘ ev²!en˜when“the“option“`Þ-GÝ'“(or,‘ equiv‘ÿdDalen²!tly‘ÿe,‘ theŽ¡‘Kâ:`Þ%global-tableÝ'–¦fdeclaration)“is“giv²!en.ަ‘G`Þ-S‘¦fätotal-switch-statements‘DsÝ'Ž¡‘G`Þ--switch=ätotal-switch-statements‘DsÝ'Ž¡‘Kâ:Causes–J‰the›Jˆgenerated“C‘J^coMÞde“to˜use“a˜Þswitch“Ýstatemen•²!t˜sc“heme,‘s‘rather‘J‰thanŽ¡‘Kâ:an–arra²!y“lošMÞokup“table.‘˜This“can“lead“to“a“reduction“in“b˜oth“time“and“spaceŽŽŒ‹oÉŸò‘GÝChapter›¦f4:‘ÝÝIn•²!v“oking˜Þgperf’%7…Ý28ŽŽŽ ƒ33 ý ÌÍ‘Kâ:requiremenš²!ts–8Ôfor“some“input‘8Ó les.‘ •'The“argumen˜t“to‘8Óthis“option“determinesޤ 33‘Kâ:ho•²!w›í¶man“y‘í·Þswitch˜Ýstatemen“ts–í·are˜generated.‘³ÏA‘í¤v‘ÿdDalue˜of“1˜generates“1˜ÞswitchŽ¡‘Kâ:Ýconš²!taining–‹all“the‘ÂŒelemen˜ts,‘ða“v‘ÿdDalue“of›ÂŒ2“generates“2“tables“with˜1/2“the“elemen²!tsŽ¡‘Kâ:in–•Üeacš²!h“ÞswitchÝ,‘Ѻetc.‘¬@This“is“useful“since‘•Ýman˜y“C‘•Ÿcompilers“cannot“correctlyŽ¡‘Kâ:generate–JxcoMÞde›Jwfor“large˜Þswitch“Ýstatemen²!ts.‘¿8This˜option“w²!as˜inspired“in˜part“b²!yŽ¡‘Kâ:Keith–¦fBostic's“original“C“program.Ž©ù‘G`Þ-TÝ'Ž¡‘G`Þ--omit-struct-typeÝ'Ž¡‘Kâ:Prev•²!en“ts–S,the›S-transfer“of˜the“t²!ypMÞe˜declaration“to˜the“output˜ le.‘ÂUse˜this“optionŽ¡‘Kâ:if–¦fthe“t²!ypMÞe“is“already“de ned“elsewhere.ަ‘G`Þ-pÝ'‘(set“of“k•²!eyw“ords–=has“the“same“names,‘.sbut“p˜ossessesŽ¡‘Kâ:di erenš²!t–Â^attributes,‘É[or“if‘Â]the“selected“b˜yte›Â]pMÞositions“are“not˜wš²!ell“c˜hosen.‘1ÄWithŽ¡‘Kâ:the–H@-D‘Hoption“Þgperf“Ýtreats“all“these“k•²!eyw“ords–H@as“part“of“an“equiv‘ÿdDalence“classŽ¡‘Kâ:and–ÏÏgenerates“a›ÏÎpMÞerfect“hash“function“with“m²!ultiple˜comparisons“for“duplicateŽ¡‘Kâ:k•²!eyw“ords.‘zHIt–{§is“up›{¦to“y²!ou“to˜completely“disamš²!biguate“the“k˜eyw˜ords‘{¦b˜y“moMÞdifyingŽ¡‘Kâ:the›Hgenerated‘H C‘HcoMÞde.‘¾qHo•²!w“ev“er,‘ZúÞgperf˜Ýhelps‘H y“ou˜out‘H b“y˜organizing‘H the˜output.ަ‘Kâ:Using–Ô–this“option“usually“means“that“the“generated“hash“function“is“no“longerŽ¡‘Kâ:pšMÞerfect.‘´UOn–íãthe“other–íähand,‘ÿÂit“p˜ermits–íãÞgperf“Ýto‘íäwš²!ork“on“k˜eyw˜ord“sets‘íäthat“itŽ¡‘Kâ:otherwise–¦fcould“not“handle.ŽŽŒ‹}‘Ÿò‘GÝChapter›¦f4:‘ÝÝIn•²!v“oking˜Þgperf’%7…Ý29ŽŽŽ ƒ33 ý ÌÍ‘G`Þ-m‘¦fäiterations‘DsÝ'ޤ 33‘G`Þ--multiple-iterations=äiterations‘DsÝ'Ž¡‘Kâ:P•²!erform›éSm“ultiple˜c“hoices–éRof˜the˜`Þ-iÝ'˜and˜`Þ-jÝ'“v‘ÿdDalues,‘$and˜c²!hoMÞose“the˜bMÞest˜results.Ž¡‘Kâ:This–/jincreases“the“running“time“b²!y“a“factor‘/kof“áiterations‘¢ìÝbut“došMÞes“a“go˜o˜d“jobŽ¡‘Kâ:minimizing–¦fthe“generated“table“size.Ž©fh‘G`Þ-i‘¦fäinitial-value‘DsÝ'Ž¡‘G`Þ--initial-asso=äinitial-value‘DsÝ'Ž¡‘Kâ:Pro²!vides–c@an“initial“áv›ÿdDalue‘GÝfor“the“assoMÞciate“v˜alues“arra²!y‘ÿe.›Ç{Default“is“0.˜IncreasingŽ¡‘Kâ:the–—èinitial›—év‘ÿdDalue“helps“in ate˜the“ nal“table“size,‘šÏpMÞossibly“leading“to˜more“timeŽ¡‘Kâ:ecien•²!t›@ k“eyw“ord˜loMÞokups.‘»¿Note˜that˜this˜option˜is˜not˜particularly˜useful˜whenŽ¡‘Kâ:`Þ-SÝ'–jW(or,‘vYequiv‘ÿdDalen²!tly‘ÿe,›vZ`Þ%switchÝ')“is‘jVused.‘ÉØAlso,˜`Þ-iÝ'“is›jVo•²!v“erridden–jWwhen˜the“`Þ-rÝ'Ž¡‘Kâ:option–¦fis“used.ŽŸfg‘G`Þ-j‘¦fäjump-value‘DsÝ'Ž¡‘G`Þ--jump=äjump-value‘DsÝ'Ž¡‘Kâ:A ects–ÐFthe“\jump“v›ÿdDalue",‘¾i.e.,‘½ho²!w“far“to“adv˜ance“the“assoMÞciated“b²!yte“v˜alueŽ¡‘Kâ:upšMÞon–«ƒcollisions.‘í4áJump-v‘ÿdDalue‘H‹Ýis“rounded“up“to“an“o˜dd“n•²!um“b˜er,‘¬Ëthe–«ƒdefault“is“5.Ž¡‘Kâ:If–¦fthe“ájump-v‘ÿdDalue‘CmÝis“0“Þgperf“Ýjumps“bš²!y“random“amoun˜ts.ަ‘G`Þ-nÝ'Ž¡‘G`Þ--no-strlenÝ'Ž¡‘Kâ:Instructs–CÌsize“as“the‘>Ín•²!um“bšMÞer–>Ìof“k•²!eyw“ords–>Ì(for“eciency‘ÿe,‘dæthe“maxim²!um“asso˜ciatedŽ¡‘Kâ:v‘ÿdDalue–D÷is“alw•²!a“ys›Dörounded–D÷up“to“a˜pMÞo•²!w“er–D÷of“2).‘¹The“actual“table˜size“ma²!y“v‘ÿdDaryŽ¡‘Kâ:somewhat,–¦fsince“this“tecš²!hnique“is“essen˜tially“a“heuristic.ŽŸ‘GëY4.6‘™InformativŒÌe‘f@OutputŽŽŸ33‘GÝ`Þ-hÝ'Ž¡‘G`Þ--helpÝ'‘=¡Prinš²!ts–Û'a“short“summary“on“the“meaning“of“eac˜h“program“option.‘šAbMÞorts“furtherŽ¡‘Kâ:program‘¦fexecution.Ž©33‘G`Þ-vÝ'Ž¡‘G`Þ--versionÝ'Ž¡‘Kâ:Prinš²!ts–¦fout“the“curren˜t“v˜ersion“n˜um˜bMÞer.ަ‘G`Þ-dÝ'Ž¡‘G`Þ--debugÝ'‘ }÷Enables–göthe“debugging‘g÷option.‘É This“prošMÞduces“v²!erb˜ose‘g÷diagnostics“to“\standardŽ¡‘Kâ:error"–ÆÄwhen›ÆÃÞgperf“Ýis“executing.‘>öIt˜is“useful˜bMÞoth“for“main²!taining˜the“programŽ¡‘Kâ:and–´âfor›´ádetermining“whether“a˜giv²!en“set“of“options˜is“actually“spMÞeeding˜up“theŽ¡‘Kâ:searc²!h–ËEfor›ËFa“solution.‘L|Some“useful˜information“is˜dumpMÞed“at˜the“end˜of“theŽ¡‘Kâ:program–¦fwhen“the“`Þ-dÝ'“option“is“enabled.ŽŽŒ‹š$Ÿò‘GÝChapter–¦f5:‘ÝÝKno²!wn“Bugs“and“Limitations“with“Þgperf’¨bÿÝ31ŽŽŽ ƒ33 ý ÌÍ‘GëP5‘ ¸QKno‘ÿuÂwn–z³Bugs“and“Limitations“with“ëSgperfŽŽŸ33‘!GÝThe–¦ffolloš²!wing“are“some“limitations“with“the“curren˜t“release“of“ÞgperfÝ:Ž©33‘ ØæŽ‘'¿«ÝThe–Ò8Þgperf›Ò7Ýutilit²!y“is˜tuned“to“execute˜quicš²!kly‘ÿe,‘Ý,and“w˜orks“quic˜kly›Ò7for“small˜to“mediumޤ 33‘'¿«size–$2data›$3sets“(around˜1000“k•²!eyw“ords).‘WBIt˜is–$2extremely˜useful“for˜main²!taining“pMÞerfectŽ¡‘'¿«hash–éªfunctions“for‘é©compiler“k•²!eyw“ord›éªsets.‘§¨Sev“eral˜recen“t˜enhancemen“ts‘é©no“w˜enableŽ¡‘'¿«Þgperf–ì–Ýto“wš²!ork“ecien˜tly“on“m˜uc˜h“larger“k˜eyw˜ord“sets“(o˜v˜er“15,000“k˜eyw˜ords).‘°mWhenŽ¡‘'¿«proMÞcessing–¦flarge“k•²!eyw“ord–¦fsets“it“helps“greatly“to“ha•²!v“e›¦fo“v“er˜8˜megs˜of˜RAM.ަ‘ ØæŽ‘'¿«ÝThe–Desize›Dfof“the“generate“static˜k•²!eyw“ord›Dearra“y˜can–Dfget˜àextr‘ÿp¹emely‘ ó3 cmmi10å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ 6ýÝ15ޤ 33‘0G3.1.1‘ ó5Declarations‘^q‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ â¨Ý15Ž¡‘?G3.1.1.1‘ ó5User-supplied‘¦fÞstruct{‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ÿFÝ16Ž¡‘?G3.1.1.2‘ ó5GpMÞerf‘¦fDeclarations‘Ï®‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ SåÝ16Ž¡‘?G3.1.1.3‘ ó5C–¦fCoMÞde“Inclusion‘ä&‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ h^Ý19Ž¡‘0G3.1.2‘ ó5F‘ÿeormat–¦ffor“Keywš²!ord“En˜tries‘àÍ‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ eÝ20Ž¡‘0G3.1.3‘ ó5Including–¦fAdditional“C“F‘ÿeunctionsh‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ìKÝ21Ž¡‘0G3.1.4‘ ó5Where–¦fto“place“directiv²!es“for“GNU“ÞindentÝ.‘7‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ oÝ21Ž¡‘!G3.2‘ ó5Output–¦fF‘ÿeormat“for“Generated“C“CoMÞde“with“Þgperf‘c¿‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ ç÷Ý21Ž¡‘!G3.3‘ ó5Use–¦fof“NUL“b²!ytes‘/Y‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ ³‘Ý22Ž¡‘!G3.4‘ ó5The›¦fCop•²!yrigh“t˜of˜the˜OutputdÒ‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘é Ý23ŽŸ33‘GëY4‘32In•ŒÌv“oking‘ffë\gperf‘Ï_‘32ë`:Ž–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:Ž‘ †ÇëY24ަ‘!GÝ4.1‘ ó5SpšMÞecifying–¦fthe“Lo˜cation“of“the“Output“File‘ã‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ ™Ý24Ž¡‘!G4.2‘ ó5Options–¦fthat“a ect“In²!terpretation“of“the“Input“File‘ÊÞ‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ OÝ24Ž¡‘!G4.3‘ ó5Options–¦fto“spšMÞecify“the“Language“for“the“Output“Co˜de‘;Á‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ ¿øÝ24Ž¡‘!G4.4‘ ó5Options–¦ffor“ ne“tuning“Details“in“the“Output“CoMÞde‘R,‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ ÖdÝ25Ž¡‘!G4.5‘ ó5Options–¦ffor“cš²!hanging“the“Algorithms“emplo˜y˜ed“b˜y“Þgperf=Ä‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ÁüÝ28Ž¡‘!G4.6‘ ó5Informativ²!e‘¦fOutput‘œW‘é˜å:Ž–ÝÛ‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž“‘é˜:Ž‘ Ý30ŽŸ33‘GëY5‘32KnoŒÌwn–ffBugs“and“Limitations“with“ë\gperf‘‚¯‘32ë`:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž‘ :ëY31ޤ ÿ‘G6‘32Things–ffStill“Left“to“Do‘óÀ‘32ë`:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ «(ëY32Ž¡‘G7‘32BibliographŒÌy‘Çí‘32ë`:Ž–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:Ž‘ UëY33Ž¡‘GConcept‘ffIndex‘ü6‘32ë`:Ž–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:Ž‘ ³ëY34ŽŽŒøî/ƒ’À;è…ïÿïÿ%óe߆µT #× cmtt12óbÂÖN  #× cmbx12ó`·ág£ff cmmi12ó\߆µTff cmtt12óYÂÖN ff cmbx12óS߆µTG® cmtt12óPÂÖN G® cmbx12óJ߆µT¼j cmtt12óGÂÖN ¼j cmbx12óBßêßê ó3 cmmi10ó9ßê> stream xÚmTM¢@½ó+z&ÎÁ±?tBL$ñ°ãd4›½*´.‰<øï·_•èÌf’W¯_wÕ«îrðãc;Šòê`GæUŠOÛV×&³£øç¾öƒ¤Ê®[vïÖæ6ïWÛ7ñÑTÙÖvb¯“uYt/N¼.³ó5·½êÿ¢¥=åS‚> stream xÚmTM¢@½ó+z&ÎÁ±?tBL0ñ°ãd4›½*´.‰<Ì¿ß~U¢Îf’W¯_u½ªîvðãc;ZäÕÁŽÌ«Ÿ¶­®MfGñÏ}í I•]/¶ìÞ­ÍmÞ¯¶o⣩²­íÄ0^'ë²è^œx]fçkn{ÕÿEK{*ʇuÄpg6;µÞ$4»¢;»µgZ8, ’ü²M[Tå›P¯RJG¤eWxm½ñ­ž÷ŽE™7·¢â žÒ"/²îÑ7»¸¦‘¼ýj;{Y—ÇÊ‹"1þt‹m×|‘£o¼irÛåI É‘c¶×º>[TÒ›ÏEnn#×ÛûþbÅø¹‘ûÒî«¶BS¬ØEVå¶­÷™möåÉz‘”s…«¹gËüŸµ)gŽÏR©ð133wÄ xAÄbêí;¬ÒaGL6K& 0+‡}&ö"?‘á°(Ò¦Òa/ ¡cì,•!£½¥‰î-fö3¤Ù*IÃx {aªùð”sIC%ÒðhSô¢¨7å£Å}­HÏ=ŤIYƒ¹(îƒêjŧ ÿZóéàü4{ÖØSOØá5˜‡áZ ä®ekxvKº·Ǭü÷…Ü@2aÂ> stream xÚmSÁnâ0½ç+¼$z Ø¨"¤€ÄaKU¢Õ^C<ÐHàDN8ð÷õÌŠV{Hôüæç=üúØS`¾Jñ m}u%ŒÒßE Y]^/`»w¦¶oâÃÕå:1L·ÙÖVÝ‹omy¾èUÿ­àTÙ ÖÃþŽv¹Êó‘DM^ug{¦…Ç‚° ÉpmUÛ7¡^¥”žX[“ÖôÚã{=1î+kܽ¨8 …@iaª²»¯è_^|Ó˜¼¿µ\¶öXq,ÆŸ>ØvîFŽ^‚ñÎp•=‰!9òÌþÚ4gÀêBË¥0pôùÞÞ‹ ˆñs#P~k@hZ+vQÖÚ¦(ÁöA,åRÄÑf€5ÿĦœq8>K¥Â_¸—žX NˆHæžÐÔ3$¤Çž˜{<Ý0Š*¢5cÕ~ÿP÷õʯÂùÝ5WÂ42^!ž0^#žrq‰xƘœE„3xÎü ñ ªz“)cÒgl1BÌîÒ°õ•?ŸXqû!òŠNA‡¨Wš»A*dý1ùÔ)iȧΰÅç“Оó â9ç’†NVf¤¡–kô¯VäaŠžUJü†ôì?%Íš5Ø»bÿTW£=ј«±®–¾Œ¿É5ëñ2éfè&p2pj³V^ócH£Mc†VYxLS7˜E=›þ1âj· ¾gÈÈ endstream endobj 6 0 obj << /Length 361 /Filter /FlateDecode >> stream xÚ}RËNÃ0¼ç+|ÑÈâõÛ×Bâ€@¤'Ä!mÓ6¢m Mü=vœ–"U(¼;;3ë aþCâ1B€“–,÷ n?ÜŸWKY¨eø9óÓ3Ã{þ(Oî&†Î@+«H¾ÚJ#kI¾"ot~,››cš £è´«Ve„m¾çž¬.ɨ g½NÏÝ|–Ízèû#¢¸S“24%ã<ù:Û >¤ÎÍ)FHæsù MIÖÉKt¯ ŸÆ†Á9h¦‰´6Q!ßÓBÐéÓ<IŸSn©÷V.ÛX™Çm,MR+iwX¶U}Xžô"íAãAÑÖM°L´kœ_8§x”¯ª_rŸî6b¼P(MW4ßñ†3æÎkB BjÒdÜj>p&œmex¨»Í®ÞäâùºLÒí¾Zµ½3ÿȨü_)£¦;Ô±qVT‹]yuáÈ ŠË…#8'N ÿSn˜m endstream endobj 5 0 obj << /Type /Page /Contents 6 0 R /Resources 4 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 4 0 obj << /Font << /F72 7 0 R /F75 8 0 R /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 13 0 obj << /Length 864 /Filter /FlateDecode >> stream xÚ}TKoÛ0 ¾çW;9ÀìJ–ãÇuC[l†ËN몭&B)°å®ý÷#E9±»tðÁ¢ø&¿O­x8å"ƒÿEU²É²(™yÚ®®n6<â,­YÍ£í#†Ï2ž–umÛèWüÙ×Y¿öz·Çƒ[ÿÞ~6yš•"b©Èj²kðþê¦`ó`‰H™€¼3»{Æ7dºÌËót“P¦·âuU'cõ:BÄ7ëJĽR$ý°n•ñ¬GöjfcGÓJ§­ùH—_L“ú‚“b“–U%¼H¹µÜaÕô0€ xlòXøñ®—Æ÷«ZR8KŠƒ|ònt+MK×­\¯F§H~Æ UÿÕ¬y| ëÆµ ìcˆ»ŸR(ã(;Ò{‹ò³nUHâöÊwà‘r˜ ÍþŸAóyl¬ÓM˜Õ)Ä”ÔÇuâK<·ÿÖgí±Wƒê©£†ìÁ¦ëÈ[ƒFÁƒÇCzªò?ÓÎyí§gl9mTà´ñï[+ãW’|x˜O嘃{«^ùã™b¶npæ˜Îí¡Ô)÷|ìhR}¨â½y›V»¶,ãG‹öe1_ún¦úµÙ$7<{³Ut—Ý`éäöÒM'EÕàH=ŠüÔ@©hVÚuSˆ{.òÛï?I¸UFõÐÍ…ÊïÆ‡NCÀ¬Îão°h3¨$á4üß4ÝèKËj«Ù¸î•TòdB_#,OÙ!éX[‚Z[R-»%/ìqá?õÓà6vF¶h:€ÝhZl@✯íŸH"pÏéØ>G¨‰‹’Oíé€ .ž “ôQ zˆ=` í„÷P~㉋Aí[®Y£œÈßy€ŠðÁù!j‘ŸØNm€4`N§§4" €Åßjq*noOáwŒ¹í”ÄzÊøn{òí¤I.ìg7ÊúˆÌš1‰<ÃA>ø¹*ÂCŠ÷ NLœ‚Ãj³µC2õÒ¨£›²I÷&/ðÈ…g‡- t&':‰êL'ªPq&jrÚ ¨¨IE™Rh‡ìÁ[I¿ÙrH/Ç¹Ž°>ÝÇœâW¿et{˜Ô…´œ’íÛÚLÈ øŸ¨KÒµÙuzØ{¨®®·«¿IÛ@= endstream endobj 12 0 obj << /Type /Page /Contents 13 0 R /Resources 11 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 11 0 obj << /Font << /F51 9 0 R /F60 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 18 0 obj << /Length 2782 /Filter /FlateDecode >> stream xÚ…]Û¸ñ=¿Âo'±"J”d]Ÿ.×½àA4{=M´2mkK®>²1Ðßù¢D{å+ü r8$ç{†cµŠà§VE´Ê“$,ôvUÞD}~£d´„‡ñþñÍ»_RµRQXD…Z=îý#w«>ý¾Þ$I|xøôð÷Ÿ>âDŸÿñןyŸ¾<¬7qœn³@­ÿýøÛ›‡ÇéÒ4ŽÿUˆñЬ<^©<ŒUª…¬l«C•hŸ¬<õÈ‚ÉDŒY@Í-*-à`¸3ά(øÄ¬·I`ºÞ¶ ó•¼åo\0Ï¿Håxîj£’(Ôx’ÊÂ"Éù¤ŸÛó:Þ—Îj „›ê0ž¢0‰åÆŠiË"Ÿ¶MFÉjã¡}TºÈ…S‚ ‹h"ê~AF:#´~i÷Ã:΃¤¤ìŒ‡ÓŽÍ®€_aôצ o•—dQ˜GÅ*ÓÀhÁ ã-¬(d%õÕèp72[XìÓ}{$‘_ÃùÇwïöý>l»Ã»[2´M©üŠŒ×vä°^p-8µ ·« ä§ QÙÃ7é.øiYÏ:°= æ ¶«'; fǰ¡åo…Ê΃ ÏÊF–w¶:û4"ðoˆdº'÷iÚh\Ðîù¡†+ÑX"4­PÝDÞÑV¦éå¨]KäTãÉ4d^oy3\&'#´.›ƒm ±Ã5CM+¨åñØ"ö ‘· ÙÎÐõt˜è,&‹ŒQ\›¸I~HÏçΔ§u¢‚§£¹cš…ÖÀCªX4üX#ýq&®‹Ó˜®<òäóø´VÈ(O?NÄȆoÉŸ=7ò $;éÍ9ŠSOTˆÙv<èÉ „OöÀemÁr;ÔF0Ÿm³ëŹž&XS §«àˆSInæ£AæóeŽ2ä%Ê…4ŸÚ~àQÿÚUÊDF3‘°ùÜ•Õ`+’¬Ð†¶{–£§­;ÓÛCcd?Y,~ËgÒ¶/bÙâˆí ìcw_¨„]‹¶œ‹3À·¯ùî<²sÏàÖ2˜¨×›4K‚÷ÙвYweO¦½õöHØO<Û»ÀvØp`a6˜,{“åóM³CÑÄ9‹&Îóà0–])«†—.¤hÍ&®ý]Â5‚ˆkT¸M¸¦…ã‘0Íô A“">íܵ‡®<ý—Oû@uAô¹â„éG’v¡ØÁáÛ™Siñ`œì9 ÀˆLîQÁ­!Y" ˆF>MN{ Ô“©mðåGPˆŽRQ`xÉf_^»ãè«d£ÁÂÆ^Vñ¨%‘¦5Ü;iZ«bÒ4.LšÆb¡ìNB¹"„”‡/ûpƲC¼ò|>RDFÜòØ· Z]\äLöE„;3^b¢3GSöSʨ9þêÉß¶.o0ñ®¸¡Tß·…9¾mÑŽ¤Ú€ñNò& ½ à.pÀ‹9H߮ȯNc£A/Žž01ßÏGyÒíd}42l´²Ø´ ŠgDŸî…ìž,¹+.©äµý\óJå|cƒ ‚Ÿ8O5ÈxaJïΤJo¤.÷¤€§Jœ¢A6×Ú,€CÏFÛ¹ZŸx^d“Á5–5šßèÛùަÏðäTv|· —‚4¿ùw@UÊÁVDC(tžPÁ Ê§£ËÚ'9æÅâ;Güò¹½¾Ä"wK Á{ªmL;öîY螃,>öœ»NÖ 7 øW}Jbý~²þÒR‚7X¯åÚ"¬4žŠ«ÆS!§bªû™tÌ eGô²Âºº¸!@î•A76áKÕ[NÕÌÊ'ié@ÚàÕHfTh~ŠÚ5§4Þ_^,³áŒÕ »¤ý…ÛwMvcy”2Å‚¢Ñ[î@¼Ôv*% Q € -*¦²½!-êËK~§gütm×S cƒ®pJP'V<[}õIÒhzˆ!úõC!žãÁ õÆV¦sß;Àm:€¡s©Ö“® È®†÷ÀÀ3Éö…ëEKG‡ûp´Þö7›HèÒ¿ùu/Ý¢©6Làœa„æc{×TŸ  ¶Ä‰rÅ-VšTÜ‘[Hà-uDQz‘žŸ±6ñÀÁNvR _óÄ#!âYA‘[£¿AÆ¡ÜÉKxx÷@-$„]G*„P¸ÈïvC?”?éJ ßø¿ý/Ê+$¾+{ÿ4IgWþfûÄJì5 endstream endobj 17 0 obj << /Type /Page /Contents 18 0 R /Resources 16 0 R /MediaBox [0 0 612 792] /Parent 10 0 R /Annots [ 15 0 R ] >> endobj 15 0 obj << /Type /Annot /Border [0 0 0] /Rect [360.709 638.074 446.617 648.074] /Subtype /Link /A << /S /URI /URI (http://fsf.org/) >> >> endobj 19 0 obj << /D [17 0 R /XYZ 90 720 null] >> endobj 20 0 obj << /D [17 0 R /XYZ 90 720 null] >> endobj 16 0 obj << /Font << /F51 9 0 R /F72 7 0 R /F60 14 0 R /F52 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 24 0 obj << /Length 2535 /Filter /FlateDecode >> stream xÚ…ÛrÛ¶ò=_áÑ=c©¼‹|L'ã3®“©Õ§“>À$$¡¦H‚t¢~ýÙx±Ùf?üq½Ž¢Èû|ûpûûû{œÄÞ×?~½¿ûÀ 0¸}x¼½^‡a’¥^xýçî?ïnwáIþ„+Äø [Ãj|•fñ&ˆbæí“©UU]®³È»^’ÜÓ/×aæéëuàµÅÞ¹m­:ñÄXü&^wlµêt­K†Mm;Uãæ®º0ÎÎdl›}‡ÓïøOµZH#‰ëpëuvs½NüÌ{¼¼ È€e${lúJŽ©›µsµXšum‚„…I>b&‘£ üXt [m»ÖÏJ‘¸jÎ'ÁçU—<è­æA³Ço(²l'²ÐjÍ«PJ«ªõ¹oÏɼÆí/šÓ¹ïtkA×aš{O= ã‹ËaP–ƒŠygîÃPu ,Üœ‹"eù»±GÙÓðW!$XcJGNóÀ2[º0ªâý¥ªºuhMÏ•Ñåë“hmßj!ïÜeA²B éÞI=‹83õ7?ˆtѱɅÁ@òÜÝ©–\\%†°Ùá¸qbFgAvGƒªŽÀ­Hx„}þzÏemžà0Áí”l›8% U;¿óg÷ÄŠä(7)y„ªÁou]¢Z v´1š"tçz½oálòw½¡3×ÞnÂLNÚÛÁnVóvð¥“e8y+ KÓGÆÙ7­[8S<šúpÃÒ` €ôÝ •Ø;‘u½X3`“¸P )º@#~ù´ ‘ç(NCL4Ch†ù& $Ñìnÿí¶oïýÃG|øòðñnw÷åá‘ÉÌóU²ÉAÍë ßaÎD|0|šúÞGt“¸f)EgÉ&Í=ÝlƒÑ¿AšÛ(èÞº¶zåL³‡8œš+ÂpÙz´ñÞ´íl0ftuÉèýSe@_Oå¼Íà6¯8û æhÍáH>‹œù!d1Ûð褆Åkäuež‰]^¯ÙC°9„‰D¬ÄP'T£åᳩKÙB2—²JÓ>»¸±}Ç]Ì,EµÕ'ƒ^×󵓲ÏöE'gŽãÀûʱ°â™³ Ž‘Û8†”Cxá ia;Ñ‚zª„’ã›gë¾äm=G!‘%wÀÑ`žõ6Ýz·ª@Ç%ñ„÷#퇯*KÈ|N œ‘xd²éW@; }ÉiävŨk¸0ªÏÆ¥Û/œ”\ 8r q1þbÊ|®I„î¸oÚƒªÍßj+¯,2¤Ñ˜Yq¡oö—CFG‰?xgÌW~—2¾mN '¯@:¥:w2¬ªÉ`ŸU+K䊱ÜWrîVÎsº'Lí•=bÀ.ˆÞêÿõ¦…t˜Aþ6†œyr¶'c1òÑïÃ1J¼:T͘£ ó,d3f`IÿP…ô!wø"çqXçé«©¼½V&Šö¥âò!ƒÎ膘bÐÌ\˜y}–ÊV áwI Zµp™· ž±MÆSDÿàiÂû¤¬;LÎX ½`wÒ¢+¾G_ˆ~Ñ Œn¹È OXñÔ¹`"÷'f_±[ 7°Ö×ou” ɇ‘Ù yrÏœ¬ˆW3h TÖKr"é·ˆ³Ö6ê%ÇŠaÈA4 6:IaÈ·‚‚O9ã™< ßMwd*«"ráîFèÂbÓw> endobj 25 0 obj << /D [23 0 R /XYZ 90 720 null] >> endobj 22 0 obj << /Font << /F51 9 0 R /F72 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 28 0 obj << /Length 2900 /Filter /FlateDecode >> stream xÚ…Y[oܺ~ϯ0òrd vÅ•´’Ч$Í9Má¦Á±ƒ¢hú K\¯]¶¢äÄÿ¾3ó µR¬äÀ€ÅÉá܇k.Bú3yx‘FÑugeû"Tì—FGWDpµ xs÷âO¿&æÂ„×y˜›‹»Ãr‹»êâßÁo>]^EQüöîûß_ß0?½¹yÿ4x÷áöÝåÕn—dû ºüÏÝß^¼»›Mv»?àŠ)þ€-cÌõþbŸÅ×&ŠÁÙÝÑÒ™û(øL¨Û'7Ú–á8¸©ï‡b¨/M@&p/AÖð-:|í7[NcqßX,ûz¹Ë‚~ø‚Ùº+›©²óš{u÷ðŠP)ŽG;`v<ú-GÏ핞÷*Ë„îze¢k“€ý‚æò<øzìK{FaÂÀ~“° `íôÛÑ¥J¾T3Ѩ²ÕŒ—/ΧA×mÑð8 4V$@ßSQò}¾\&û x ;­ý¾Iü·¿íÛèÊ9ŒÊîý4®îep±¯ÇZ¶?Õ~/¼Gû”X8ƒŽ˜þâÞ<’³÷8›áÅÙ^gÒ˜Sv1èìðÈ*°NOêš'=«Ç×vÐ<'g— ¥"Ç­›ÍíHsõÈWdnÀ?Vü¼-;Z ‚ì¾nOm•SfnGºd1T€ÞƒÂ‡¢´ ;øÃ–‚çõ݆խÎ)ÆšäJºÌ %ú<ñxIú/êF%¦`3Ì``<8M÷ †µº‡ë§¡Ôù²—kWºžmðúò*ŽöÁk°Ó®¤ÎÒJUZtìËW[zàcÃÜ0Û±Ié8ÐÛo,à8Ê‚ÖYO»°k†­s*‡š]…Qå3uÏÖõ…a;t¶‘Xÿl“UÏN£ ” ±OÞÁõ[é;5Ù4„íÑ"¦+¶¬?‡&.• ²éŽýVõT3§µîTˆLžˆÉÅ)¾°•Tleyè2( ÝÙä ¦Î‰ç©ó!FÆb¬œÈ»*d ±"œµŽIÌ%ÒÀÉ8_ìu°ßÃbl9±´3:ƒ¾ZÂpìø=‘òóU€¨Çëù éu%‹ì™½êÛ~¬ó¶YAò4w+ÿ’Dý°à…è)NBØõ ±¼Ñ!Zó„Z°ìØ4Àž«Ù×V;Tðº¾Ñ¹cïtÓ¢ëÇz¬­£x•ÆQðמï(µÈ)ƒœ–’å`I­ĉn3hiAÁŒâI6 ðØ×1<Ö:ƲËÅy(ÎÀx诹:Ñ ¦A–ó;ƒ™¾Ñ ¿[ÄiÁçqþ¹íË*Šwì°CÑ:@ËØA`1(•:ºYk»-žOù!}èp”¦šìÿ¦zð5äfUá&o[1U,ûO¸î¥òîœ]ê–4‚ª Œ(íµ<;uty”VŒ”iØÅ Q'äk .z”¸Å¨ñ†îhu Ÿh¸”ÝÆ% ΔèO8Õ‘ã£WØH¹ë4¸l²¢$ßvX³å’lt$.˜äç¨ÇÀ²Æ+>çà18l) ŽdëÓ•î1ýÕfž ‘{k [†¾Õ {IDœÊç 5 ‰æ¨Õó;²)a ×ü‰ˆhËíH-"E¬^Åyf¾7s._´&™Ýòy…s„§W«×e¡õ¸@ÑÚõîàûÊ$×û,Ys¿£¸ß‡Á›ÂI=O«>"˵µsdÄ‹·Ö¾æ²$NM0ÔG±m˜ÌSc`ÄÔU¬jÑN£›ºÔŽÎ€o ¼$”ÍmDzØDI(ʶ±Bù[R‰ÌV6ó¤ÓìJ)§ ônűÒDêHÜ ÚÒÔ¤ÝG(‚³ïŽ2©g9Ö(µ–}•Váäïb×ÒÈV’Üw´vÔéîèû1–Qç”À~Û´üubõ(†O]yAae?Hd¥pñ$ O榮©ÛZÚ¾—`MKèD7˜h»—h1'ÈúžgvB«ì„ýD=‚Cß4J‘²YÁCã0çc:m¡´½ü)!R4]¢Bž½…!±£%iº =ÇíÜ›fq2€GÙéà ‘!d–xŸ¤›¤jpÒ)ýè6ÛµÖs§³=R}]Óˆò}}´qAFžcñU¼7Þ¢㲃”__Ø’Ð}6¶zðÛ/4NÐÒ3FØËƒCQ+?~lµ¦Ã³<Â)ôQÞŒšÅ#yßB¢YûÍx-ðì†c2ISÈ6C뿤,›H±ôïªRPQ°~Ò†Êx4ÜqʼœŠdéXÞ#蔥9ÅçâÛDå‘Ê—÷ü•œ†½º³êž˜Eå‚k´~ÛØKNÞéw†ßäÛô’%v;‘0 ýñü¬wD_k€;JmQû %uì$Drž"Fóøx¢-ð ÀwWPÜZD?y“N'Õ–*_ŠCˆö¥63×7¨Óº[Ѻœ¿Gô#Ú¹Éâ«å5E•9 @© Zz¶ýFņSW%ßÞhi„»|Ö0).‰ð˜ÁØ…¯È çöu£ JŒ'V Α,Ïæª-_Xš¸ö‹ñ-ÎÜ´"jLä!ÓsíõÕ—Qœ †xÉô¡1ç²Çƒ1#×v€Š…¦ñÞ°g7£=åyŒ!/û|ýÄ»ÏU=?hƒWUp”i¾&Ãä²F"iŸì7ÉÒàŽuÏ!¹÷å/%zL°Mc¼V˜³@nýAß…F.,šÁƒßâIñ¤gàÀPÕo–ø³1 LÅ)iÕ¬\Ûì¤Ü'¢cÑ^áQG«¤ç¤U=ØRkÑÚĘ¥0u OâMÁì|qHH²ºc}_oêÇÏ0Z9gû…lS_» ¡9ÏôÍò,,* £3AßVÙùí¨ÖÛÀÅõi3$Á (‘(›‰äís;ó]À§keJÐ|Å87>ïñ°¬‡rj©’ëJ8¼Aé‘ïÔˆ"57擄àHSÚsêf‹¹Yf„­fÔ×’D¥/lÐ+JlO‚[y€'žÛ ß èóGÌ^¼x»ªþ¬ÂlIDbB }:ÕD^kn&?²tgW ’æ~ÒFDÚFP!8òž©OÜÖý‚]oìƒèп¯Ê’˜ß_â`îØ^ë³üÕ[‘üYsŠ÷Üß*‘5(8AeáF…˜-Ÿ¶rG zµ7LB”ÏM+ ~ô<çßL䉟ì4¤Èi°hùïÿ<£ne endstream endobj 27 0 obj << /Type /Page /Contents 28 0 R /Resources 26 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 29 0 obj << /D [27 0 R /XYZ 90 720 null] >> endobj 26 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 32 0 obj << /Length 2716 /Filter /FlateDecode >> stream xÚ]ã¶ñý~Å"/'gW”(KnŸ.‡KâršMŠ¢éƒ,Ñ6{úpE)×ý÷/JÔÚ»)ü r8r¾‡cõÃO=â‡ð >~þùãf›$Y±ôæ_}óñq>4K’?¸büÁµ”R»ýþÐ;•j¾Ùß/¦ƒCóŽ>ôÝžÈZ1¸ýº)4¨ëêhò¡¿ZOqEpÏÿ±)R¶¢8ŽÚÒÛ r¶:‚abšž>a!}Þ>3Kö €Ÿ†þ<”-kœ´PÉR%æcx©‹Q£üMeæ°…;ŠNmÇèÞÐï ³¶S‹øy]ŽŸ¶&¯Úk¸c9òh9&À´»Újê'×<1ˆW sÝ ]”£ñË×éØXwá ©¾¦duã,*Œh°SdK4ï1Ó'―¥([Ú3Û!ƒ»~DŸ&ªæ/H0‰¾”Ì•1,[aYÉŽ²A‹ÎÚZ‘ºêFP#YN–zyЈ[ÁYbYæC ^{×w[5ZëÜ¢¿$/Z$¬QY³*JÊDPUõƒÀ$lÔA¸dwp.˜×+‰Iö b›KÃBÉ$:” ŸµH)5Í}.¼œ Y¼Y <:ÓUf½ÄÜDRî0”’«pî£åãwÑ Í¤ÞðìÞ‚WusìÁuþT‹$ºPzäÜ£P_d¨³;Öô)R/àT [oÝÍï…‰™Ãå\Ê¿åp– ½”€ Ö\ /‚:IéóÅSI¾å*›Ï¼&$ýrdøRÜÒ*JÁ-ßùÐPóÆzpuÕ\NÝ ËMW)‡†‘D¹#M9#ƒv7¬õ\Ì‹àÃãl²0?ñ.MĹ1÷â»È9{=¾ÿHu˜$]òþìÃ*Pÿ%¹Ž¿ô³´™{‘,â̹EËfÑ-igÇÒqù”D\^©¥HCExåʲºW9¬Ê=EášP&o=VtÂðÛ·wë²c(~—ã5$mŠ.E±,ƒBZ‘ûÀwÎK0®DÂ4=DO\ã…4| Œ™È¬t˜h:\=Ï;DÌøÎí—,„¦‚ÁÀQÖ`µ¶Æˆ r(:7¥‚ȉòAyµ%qþ™ŽÈvõLó¥Ø×#q¢t UœQ!3¹‘gØø‘Övsé %FÂdÉ%jέ*Ì­HüÆxÈ)]qQ(a‘¸2á@^ƒiÌï›l?{ I †Üé½k¿SZs\q_Ä!÷0 ¸‡™ç†W¶:–Ê"˜ˆ`d× ^›=gþù@[<Ê'»e®=×’Œu,ÉXÇz ¸]L@°8ÍâPÃ-³­"IÀ„’§s‚¹ìøyÅF€8˱`IÞ ÕYƒ* \‰IÖMcª0@†gF–"O|¹bDð":6Te†&9ÀŒÉªée–IüÅ#÷sùà ’>‰áÕÚ¢7Ü+má+dx-SÁ|·uÁÄ¡nH¶i.¯ø^¤m2œ'—$*\¹¸ùBAëljx–e^âyHøêPÖ°j""aiMBÊ¥†o#^LŽ:™» <#gÔAÑ–â;ust„§G¦’ÙBQpò’Ç;,gI†©¡x¬fÉ ¬† ÂÓÂ$ˆ#´ ‰Q `ëÖÁVÇ’`Uê|\áOƒÔ¯ËE)i'iifÜÆ‰µßHöÍÔY>­–ÝØåÙ¯É`âã`ÓKÝÖ¹=¥ MÕ¡†\PA"“ɨ¬£/ÖBåùŒYg4ß0ŒÝÕ‡¦ì¹QfÒ´"ÔÑñ`0nj¸D¥£n{K´o¸×7ÚcH#§’Þ5@¤[ŒCi$äØÈáì@~ýîç¶*,¯Úªé^^297ž„DÀÐ[7Ÿ=ÈðÈ!¥’Üè+Ýr‘;"W‚§E=Ñ=Š¥/Mu·–ª Ј©ùE?tU3I2*Äþ V{‘®þ’aë/VÏ©"•·'ëç³yæÌB‹”‘r9½”Å©VHþ\P6û¶·þYsÇ'uìP`esóˆþ†¯ô ÷¯÷(>÷Ý6lI|Ge7ÔkÿOZíƒ&´Êo›ÐŠþã¥çòWùê9»—Î"X Tÿæ^Ô~Õ}†©„ Øï«uå;k™³¼$5ª@µÜ««ïøN†>ž¥ÏZšJiJ0šËœ”ëyôüÿ@ÞdxÐJÙár;˜²æW>ôÃü_>Éåî•‚cæóÅBMB¸^YÉ3ó{·~Òñ«%Oaëó½ _IæÑw'ðÖÿ5í· endstream endobj 31 0 obj << /Type /Page /Contents 32 0 R /Resources 30 0 R /MediaBox [0 0 612 792] /Parent 10 0 R >> endobj 33 0 obj << /D [31 0 R /XYZ 90 720 null] >> endobj 30 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 36 0 obj << /Length 2954 /Filter /FlateDecode >> stream xÚ…ZKÜ8¾çW4rr©ÚòÛuÌ™AAL:‡ÅÎÔ¶ªË?j%;Iϯ_¾$ËUî$ˆ%Š¢$ŠüH±ßàO|w<Ü•iº?fÕ]Ý¿:õÛ«XZ;`Ø¿<¼úǯy|öÇÃ1¾{8…"š»G¿}úz¿KÓ4úíý§÷¿¿ýˆ,úüõ—Þñ4Þúòþ~—$yUDùýþùêýƒ_4O’¿ÙrüͶâ¸Üçq~WTÙ>N3Þ›ÚßïŠâ½‡û¤Š¾ã?úwuŒ¦³ÆF÷»¼ˆþ«ë‰ õ[­¢FÆÛá 4²C4&èå<“°¶º¹bVÜ¿œ‘÷Ù¶µêxÝË}™6ó’ÇèC~ha`¨»¹i‡'¦^ÉØ¡âîâ|_TùÝ.N÷p\:¦¯p#v2íã<µpb¢ôºiçäǰ±ìDª®Çþ¢Þr…AéØF¥À&4·ßÆh{–Ñ8È®€þXÆÙÔÂöÇ!Î~:YnUE[=È.cÞf3õØi6ŠkÅd²S­g;½2m÷̄ٲ†³èÄ×Fv[Áo–Šñ>¾d q) 2ÜB‰ ¹óD Æ_4Y1ï•BÖQ:ë YG`@R,ÍÏÛpG ´Îr³ãµmeeiž^ÙF~Xl#ck„ÏÓN“ #Ü~ªLÿ~jR]Ûð ßΜøÛie¥9Ö[FòLW Œ¾îu@ae‰² 'º,,º‘T-%SIÒ83Q6Ê{as&hM"a”Q¶=-òíŒ{á»4ÓÕêÓΞ‚qY;x–D½3™Žð!¦¿iôÔ²ÑqO ¬p\lÚ³°Ê&¬Õø—il¤ÐX)B#… èX ¡=Åxí²¨›pñ· òN[·CË%E€CåÁé_@_õýŽpI¤¬¤äé:¦x)ìÂeàÂH^³­=‚‡”´ZË_8.;0¸ŸAóE¢3_ž¬GúØÖz°š¼2cKX'IÂç!ÔJnP 8>W ˆåx 'AÉÝìxÀ7¿qÖ=aÊueº­T:ôO¬ 1ƒwN骜%]ÓæíÖåóby6a6då+CÏvÒ=·?¶F™gL$|‘’G@ÃG®”lÔï”zü­W9§ßï=_;è(/DŠ f›zûÚ{ÞÀñÚ2ˆqš}µ\)£ÏAá5“H½ð]J'åºtÂJQp;÷Ž/¬½~ÃÅ´çÖ'øÀÒk5È ®ìC ^ÿí£DG’%qzóþð)ß±òaMÇ:ùGr²ZºŒ¹˜è™^ž÷Лï)1ù%ÀÍ¥”*"i!ºf01Õ·Ë‹ Žù<.‚Î#ž¡)³qå+ŽÝÿaGé:nüÉëï”"TOô×ü“G¬¸p¿¬Il×±).öÆaì…©¬` 6²9+?×¹ÝÖº£ªy:[®jÚ?]¸0úÆ™¥DžïÉœ¥S““÷`Š> endobj 37 0 obj << /D [35 0 R /XYZ 90 720 null] >> endobj 34 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 41 0 obj << /Length 2772 /Filter /FlateDecode >> stream xÚ…YÝoܸÏ_aôIâíRßê=9×ô"uƒœƒÃ¡×ZÒzYk¥-)Åñýõ/JÔZ½À€EÉápæ7䪫=ü©«jU$É®JË«úôf/Ô§7JZ70á&˜ñîþÍŸÿ–©+µßUûJ]ÝB÷ÍÕ¿¢Ÿî¾\ß$IýôþîýçÛØI£O_Þ}üð#@ãýÝÏï¯oâ8+ó(¿þ÷ýßß¼¿Ÿ7Íâø;RáŒïˆ¥”ÚåWy™îT’²d÷ÇÈ"Ó®U4Ø“ÍÐ3ít—ÑäFî¹é·½Êë–…¦¶½›¬§µÌBªW\D£é‰WÛ0ù0õ5îcúG^0< ‘çüaac`Ó–>àœ7*Ù©ŒE®o²<úˆ kTTãÞ9|eeË]ãäÛó·dšv2ãlÛ¯(]K2Ž$cŽº˜ÙZëÇžÍxä–º¶{á6„lj=yÖtŠRNQ{ÕÂÀQ»Õ‘ŸI8´=£â¤›v7ÏËvE)ó>€ºR8ä Š6LÜ!]—Ÿå…iºç¯WV‹Zâɳ–°ûŒVì÷&Ðiß´–{ãuˆ-×Ö|ì˜þ-4²=)Šx€R.Hî,*tÈu€¯MJzKãÊóN"Íý/Ž…)£OVT:Õ£ŸÓ7<‹Àƒµ&dHæ•u=YÇí˜éYÛQ¦dD8ZÝ;=º"á÷ùhjä~ܲ"ƒ¸Š#kîÈ+É18×:Lj€A:Ž2xæé±g§@ ˆsÔöBMðD‚:ŒÔ€V†+r.8Y°ÈÙàeq¿u±Ÿ=ZÈÏFD‡¯ ~7i‘³µá{àFFÚƒ>ÚüÊ€p “'g{Û>jÛt aqàïq@‘že Ù+3ÁȲ¥8‚<Úêš„óÑÀhýNúj`Cõvn‚—"úq] V‡¾ÀÑÏÃdëvÓ»ð?roþÈcʵÇ,ñ{âëâ§u=œÎº7mãGaðųk·ló¡w#x”* ŽýÁGðø{‘F撚‡X¤¤(ÀöÿŒmO‹õa¸a,µ2§Ç\0r[ŸÏàPín1þyMóØŠæõVÖ÷|”MG1!ª*tÁk4£*Q%È9jÓ;fäBC?˜ÁWúi„m…žIÚàÎ*îzA^° …H¨e²ì@ʤ-y!¶9þ`ëÂë`9Ây;œµßôéܵo9˜Ï9ñ™4…±ɘ ˆüÀ.Ʊ?õçጙpú‚ïg\üÏ ¤73Ã=cz¿2sLDeá÷lÉϾŽÿêK8%Àˆ`·„§éënò|ôëÍc[¶G»¥¹÷+ªÀZ¦úÑ• HpÓYüC6QZûÕÔ¤eÈ<¤\m­– (eápZ1(aÑÄL=äS ^ØÐø)B+¡<\Ú@‹í%Woœn@öiŸ÷¡i±»¸úÞ‡¤ý:Bc¢KãyýÁ7æÙ>?î/ðÉ»ñwIYL–á£v^Œ­óüŸã$ ‹“$j9ÎÅL£Ûº¦¸Žs¸LŒI©ðéÛ‘ãûâ1T9Þ¡3GEì4Þu{:1ìù|d?ñ9 ÙlÖZ(ßèÚî°i%0¿5\• sqÆFÃqÞ:.îÀ5°M f¸•7'ÑàSä¼c"Õl0i9w±x>ë/pà0\c§ÎÓP®­äl‡Qjš¡“©Ïòɉ<ª7u š®íàÜEDº0Ëf`ÙÊ‘É>žs$¶7rdƒŽ·¯Dµ0ç"k%ˆ4H8ƒ±Ñï ò{æPr„QL•V˜Q¾•Ø1ÙÅEµä߸(#Ö0w\*qvLÏË4X.â€Tæ UãôЙñT õt î8 ógñÅÉZ¶2˜"ü}³*ùÊEê…ô¥M§º–É„‚J²d\yјhd­Ca;¨þ±‹çä" ´š³­ + ìIPç%½l¹Tøº“½µsôMÔz€>áœöå¶SÖ¦ža’9-y¾Æh Æ4Z`~¦è [m^f^Þ²€È”çûè¶i *EÅÅ÷˜ .u¼tµR¤ý ®Ê«eû$’bØž ÕïîOLÖt†–ºNšœ7 …‰« «®½wÀp…Tý4f„ÇGÈn½“™>Y`û¤Ÿ6ñÂõk VùV·g”C<ä´ƒN<2ô­4,ë)þbÈ·kôxbš,Êb¥Iœàƒ W 3åÓã8êfCR¬-!<,SùúÚ õ,/¤Ý8Ç ÷hõ‰Ý‘k¾°ž&Ö' ÍzXH‰›˜ÓãÑ· ±äûÖÊz)jd%…_׿7b Dk))¯PbÜ"+ŒA­{LP‹v‡cVsÃý©3 Ó§¾YÕÙj­2˜ÑQLxÆzþá üBÈ*´Ï&dÄh_¥ÞG,öÜR|( ÍtS^pêó/4>QÔFÓHÈ÷ØWÁª%×ïÃ\¸öJPw-̳ù½'¾XñfƒkÿèžêñGÕ x ]ÒR¤„p…¦ëy¼ª  E«Ü: óÈIˆ‘Ñ“|@]0­¼—BkñÒ”ÃüÀ{#K¼ën¥©á"{«á…¶cÒåÁ6só/T ¥U‚·°‚„ªdŽB/L×2Œ$ ŸL!ׯÒy Ë1ØQµ D_$€†3oyª²n1ï2®D²²ÅYnÆõS `YÕ3‹­`b:Ž7bR9ÆaKðÇs’ðXòG0=™ï©Ì› ÎákF*oåóÛ Q|F@­² ÝvÍéž&Átž­G2$t視&KÒ%â±5–›¤¸çÞO: KeÐ1ÑÈ`ÍFp™Æ7 .ÑññÓÉ®G¿åbJèÌÕôáeÞ{ÂsɈå Bѯ¨ezÈÊÀß³":wš*E ¯l‰C¯m™•|‡Q_§£írròŬ\|1+ìc‡| 7âî%”7 ›ž¨ýÞØ—«úëòÔcGúت4ÑRs?špâ«Îpœ±]—0ák¡x~Pel:þÝÀ…;„¨ª}U®Tf÷N°eú|Ÿ–‡G ÀÕÞ‡2 ùLeRšÁ„IŒ‰N†S*ÐîÚ4Âkwë0Ž~Wûé*¬¨4pè ûá;TªÀe'³ÖüN±I¥ËMZ¥s í #ù8tYwá)5 m˨ch#j8`JeÝJ_?n„ÀÉR×%ip'4rýZ2BŒQðkþB\³]¥.êQ-¥ì_«;mNlñX½~øà‡´XP ßfóüÎÐSZøèTº='`$æÒ ÙGI_Õ`CŽ ‚à+—-¡ªl]T‡‘Üß³Uþåü0»×öù.®ÔZ#¢‘Ï)å‚€/G-¾ QDô×ß\6Ê/~˜àâ¨v“¸¶‚~™»ãߣúa45YÝÉ/V–ç0¥=ŽÖ@ÍAJ Ã{ylð3žï“ñŒ3ì±µºÌk¹qÆ $|dépÑIç˜ÞwîÄe0‚4LöÎmïm²Â¿ÁAåƒúÛºRŒ?Ìþ–µ/ªµ%j±TèGó X‹1~g[2ˆì#7ZBƒà—‰pRójtµÎ(8)+óoÚó~Á|Ic7‹,t`ŽÅþ©P>ÍÀDÏ_@X,x¸õCö‰>ü3.×Ð’G`6’låß/\P²; üBºy«Fµù‹mp•áOÊÿöÀ@Ô endstream endobj 40 0 obj << /Type /Page /Contents 41 0 R /Resources 39 0 R /MediaBox [0 0 612 792] /Parent 38 0 R >> endobj 42 0 obj << /D [40 0 R /XYZ 90 720 null] >> endobj 39 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 45 0 obj << /Length 2701 /Filter /FlateDecode >> stream xÚYÝoä¶¿¿Âè“ x·¤>w‘§KzMR\Aê<½>Ð×KX+m(éœûï;_”([¾,Îðk83üÍ Wß(øÓ7GuSeÙþ˜nêË;%ܧwZZ;°‹F|ÿî¯/ôVû£:ê›ûS¼Ä}sóŸäÇO¿Ýî²,K~üðéïï?"‘'¿üöýÇŸàh|øô¯·»4-eRÝþ÷þï>ÜÏ›iú'Ráˆ?KëÛ7å!ßë,gÙšýí®,UòÑ]ÜèºÇÛ]^¤Éx¶Ü˜jdÉ©÷̹N­«Ýx›’¯å¯ ú!é;0«?ñ·3—5+K`¶í†Þ¶¬k¦ñ¼0O‹ Š<…Cìt¶× ~1£õδ߱a¸ÓÅ^UGø–{}(y¨•3þÍÖ­ëèéñŒ=~É£7žfdÒ»Ç3‘›ºÆzî½inu*Ѱ¿â­ÁáÏ<„ôDÓPsÈÁ³ cè/vYÆ2“ôsGPåjõ;&>¶¢ |fò¤Áú/ TfÒ€—JÉöE™¯•r¥üjŸœg¥ªÄuË ;ÍÏJçµ]ßñ:|#3"i`4ÊÅŽË`8ÚÙŒÌ fcêA¼ˆW`ý¨³Ì{>÷¬ˆp€EuOã¿à?÷+‹îSåâ¾Uí†ìϪPänØÓ“Ç6ÏgfÂbUbý‡˜CŽ_7ÂdÍË<»ñÌ\‘ WSØÅ Ãt¹Ž´Ê®DlÍrÓŠY ú3®]î°Ð!éKâCÃÛÚ]åMîðJTr3MúªÂÔMœ¹ 'pÇyÕAÖ%¹«Xn`.r“"7Do4¶_Ù¹Üe¾ôâm»#Ø?°"'ÁƒK7Òf?Ù³‡¦z_ÂfÇ=Àíõ¾±²®È~^¨¤ë»îY±Á=,vÁ†ü§˜¦qx#KŒ<ü2H·—q5²å¸¸ g= nxÄgÀÉÓäE`x;ŒÞÕdÝ¿°Tè®ÛÒÙ1;“‹5 ;H dÀ[ó­B&À4\G­“ŸO̹‡äß@]˜kþò-™˜£X9ÃG΢\ižÜ-"®ÆkQd<9ônu9ˆqx!²#xº~dÄ9¦É0ŽØÁ7[.|eæc>ÇrúŽDn@žÆ~¤Åa›`+»·}؈oa$Üô 4»=n|ÃB³mÓƒŠm{‡èŒ£š±ûbf°g² ü /€œ"QÀž9ÌþùÄ,ÃcøBÈDZ†¡zºX¾’<: ëÇîoœ%Àu¹!wÆC„˜ã- Âf9 |W¨úuî–ˆM1´>òY0•Yä’Eµè ¸ŽØ( ߈±%~ݯá܇0D“Sˆ¯¸>Æ\¤`Gê1Ì­f×îìZ!¡¡†e(Û¹|¥Hë ѬLÃLÚô¼›kÂF´ÀÆ­9 .¸7Ÿ+¶ ’íìÀ$\0n ÷Ý0ÚO5Rgî^[º9)È^[r?‹e7þ‹õ0Á²EY›²Œ/Eè2[™(×ÉŒšqÖ7LËÅ¥ˆäduÁ» a.HLÃÈÔµ5µ½‹7X’ĵöA1öË-x +K HÂ&O¸mŒü-g_iEÃf6XY%û t±=¡±Š/Ø!j¢1Fv2×+EJdö¼Ð¦—ØÔz{2NÛº3ÚbØíWÀ{?Ÿ)daÛ(£•»Fxgq”&>´a0 ½ö ÑÜûèx¹b4C1sC Ç\ Å8ˆ²µŠÑ4ˆ+û -Q6p†ÃB8Ï•fÝ7ÜÆ¥Íϲä=ÙêÄ_ßÁ^w[J3VCä:Kž½GÛ1ÑÎÀ•KÜywhcœÅ¯ý£¶œÊ}ÇÅ ‹ƒ#8ù‰A ùžÒià\Ög %Ý[N×G€ó%û¹ )Á2+ $w¿Çq¨çŽô}(– rÍÿñFa¢7ƒ3„3˜N¬]Í£%Eä,3]òä“L0!…\NN¯)V^H.ï qjhe±5–"gÚL@(úäX#d`K¢i"KÞÏÉ0t0õ…v‚òÇgG©¯â„ßø¸8ŠÖ¯ø¸U8.t¸‘;¶tâÞ5è> endobj 46 0 obj << /D [44 0 R /XYZ 90 720 null] >> endobj 43 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 49 0 obj << /Length 2847 /Filter /FlateDecode >> stream xÚ…ÛrÛ¶ò=_áñK©™È‡7‰ÔcÚãô2™L¦u:Íy IH E¨Çýúî $3ÍxÆv `±we7)üe7»ô¦*Š»]Yß´§W©@?½Êd´‚uDñýëÿ¼Ýd7Yz·KwÙÍÃ>fñÐÝü™üøþ÷Õº(ŠäÇû÷÷¿¾y‡“2ùðû÷ï~þ0¸ÿÛýjç›z›Ô«ÿ=üòêþ!lºÉóoœ )¾q¬,Ëî¶7Ûº¼ËŠ’Oö“Yåuò„ÿÔj%Ÿid_ÃAª*ÌxÔÃ&Û"±²<ÍàGÚá¨LÞéV N1ø`8ŽçÏ81Sž‘9lrÒÎážz•%f`ÜhxÁÙšsshFágdã¢ë¤Óûg”Ü|wÙ†/Ã{>ƒDS 7«ü}TÇ@º¨±ŸîVëMQ%G…'FLÓŽÚ Ž'zØ[¸·òœÎÄ×êÑ.…à {ÏÃp=$ï Axžu«Î2fy³¼î.î‘ñEà\VíUðEY%þ^å&=MQ–$üz© b“4 )‹r–íQGw(QnIúÈEP² ^Ÿí ÷›& 70{Ök¹oé IV€t†å°Î³»¬V›»JlôwµÞnÓäÍ4šÜ­‹!~|Sàà7ü/+ôàF«šã~U­>k%É;ÅÉ™ï›)Ž«u™çɨOŠGA28i ±aY>3¬ñ¨CRF`$å²Ä÷¦6>“°ñlúþ9P)ÍÝÅ^½HsAô{kàÞeæ7ËP?ôAMÏ3^k¬Ã3ls·Ó ØÌÕ xìÂ.y‡fäQ|Ïb“¸éLl“ü_µBàw!X8v°‡õvS&¬ê‚ežIcȤp`•;ÓÁdõc/è=ÚH?´Oc[R‘2E+8{MKTÞªp §²Ï5‰&Oz<òêç¾:¶GE õœZYm“ànå¥õè7ø^Ò±ã¹e ~›™nA^’é¾á…{e-ß (E-Gkz ='9ƒ±‡fÐ7Ä$Kà™6YŽŽcá)àñÜ(\³2æà!`$çyvã>ôÐYåà ÉW„T€´è³î`K$¸|%Ñ‘®Öž”=ú˜ÎÝ-¼ÁÏhûY5»?”È)d5¹A˜¾0PÄyÅeP¬©Ç»á„-‰ÃëWDXôŠèJó,QÁ‘Щ@ŸyÍ®—¡é,?b„i–<qEšÆÎÂ1´a*¤xF$yb2ßfMï®xVä`òçR ± _ãx-¿Ì:Y/]‰òª˜…ð<ìí=9ô¾°÷äF†›Žž´5S/ CΦ¡SB3ïlÕgm&ÎÑ@rr>¢ÂÕ›äÜO‹Þ¥ZԉŠQ¿¢¨)G®Z’C¦ ²qü\…è°|ðƒ±‘»ê$bUÉoQ[Åļ¨ò‹.´f¢ˆ1Á…ür{išõ•„ùšƒ¡‘Ybñ§äí£GþzDKf€ƒcŠRÜ$B ê:34ä“q®>¦Yaìè=dpóÅ.MN×`˜pö}ò¢V hHA¬Þ%ûÉrZм¥Õ!‘=ÊÎÛ ÔÁ³"±ÇèâÉúÇ’·À‹³Kn퉈À4D ÙµØÍß0¾]Õ’¶J}i 2Q²—VQ"¨Y&0a™¤^&µÈ úÂR¶Wž£5,±}¸ø"»`¯®$ù›H5…´†|Yc)†ù~>6ù! &Òú<žìAÅN(¿*Ì/… € ¯åµ×–{‘Ñ9kÎA (”{å ÷"׸˜õ€òAcÎÇt“ê¡í§NJʼn˜ÖçÖmßèSža&oXV CYÝÓɞܤGØ"\ß+‰l0ãô‰vôJMœœ½àÒùeGÒñÙ¾^éxÊ…ê`H„Ûdr~\ÓêûcÐLç¸L9M\“n¿ÛÍÚgÇ@¢Ákà}OK*eÙ#ÌUZÁµ qÂ]èœËëq¡*)@)ËeÁRëñ›ÙýLÀw”‹…dI?BÊmoC¹×†*Nª>MOÊŠcŠÌ´dÂZèiößJ¸Lh†H$ÊCv8 ÅN(UÛ° ÞÛKt]T5 ±Ú‘ÁW&* ˆz„" GžòÛÀ âÄ×EàcãT‡õpbÝÉÈ(üœNŽqâd:ÆibѰ—Ïâ IÓ%´püwR.¼ /‘T ƒëír†ÍõñÕbâ `Ê»!W ™,ƒÏA[d5”»å ÕE¹ål÷ëä<–b“KêJêð*ÎÆ{£üj’Tä××ÀeäQIçHšl÷,“ö¯IS"‹3#$Ø;höcX!DÂM\Ná+SΤ`Êɺœdv( ç}Œ<®3'åñ0Pã}µ´x|x8ùð0Ž“83òòÚëû ù±:òcu¢âÏÄÿûXs­V/õ3Ò1¬]óê&–ª)u'ðËeg†~Äâ‰×û:8¥ŠÓ U^Ü4NÍ@e~ Ö,láŒ22¡òS¡{ 5m+!–Xì;!)ªr®å+¨ÂÀ×­/ŽA’­rï²È@ÉŸáIýøÜ·”¶Y^vžlÈFÜ5ktëì0,10s¡TgÞð×ËuéoùADìŽgÒBÙ%±gF8¾L9½¨\ÇÁ”Ȱ,Íȉy²“cG²†?¬Õ‚.ÄÈ*Xg¬=Ò¡Î…ß+Ã&YßKÓ_œ29MêÌÑ #Q(“IØYÅ”‚ ö",YrËRê,Îô`¢¾@¡éoÌU0 ÆÓ}2¼äiÑœôè¼æ§;F¿]ˆBÁƒ¯Sƒ9éÎÙ )ypD‘ÒÔØÈÁÖ âIß mƒ9nò¶G„N¾ƒpñwÊëúâg t²K>Ípnq¶Øài}¦±”gl%™ØÎ]+yQbe‚%)øórêL†ï|ŠdFA_i—@þKçs= :$»#¦Ûb=©†ŠöˆÐ6Ci{Îië”rø Š6¥«Ã‰óŽ1R´Úw€?ÖfÁgÝ Û•:%–#‚ÜxeÇó@”‹¾[•e\Öiý¦Pño \Ñ—éÒo éåo àÀ? l𮽬¶ª–¾wNeAÄòÂ{§Á{3©²ËTÒ\Fý«E“¼jjååÜÔŠ[ÃìøË¸©…¤Z:Èl›Øæ«n JÖ}óØsÒƒ˜½ï {B» ’L¾¡Ê­ ¬¯÷+ÅÕqâ~óìx±ÊçYö«… ZظÏÿ÷â@£wšó3É`©ê³f:/m}z±÷ÏxyqÙgPcpp\‹¡*|Ýì%ªÐ°Vº_,5ð·;~1IÙêèåñŠºe»X9„k¿‘QJó>ˆAÿ˜qkQm3q_ͧh@ò¢÷‰íTF…öçNR·”³e*pâŒÿüy|A endstream endobj 48 0 obj << /Type /Page /Contents 49 0 R /Resources 47 0 R /MediaBox [0 0 612 792] /Parent 38 0 R >> endobj 50 0 obj << /D [48 0 R /XYZ 90 720 null] >> endobj 47 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 53 0 obj << /Length 2837 /Filter /FlateDecode >> stream xÚ…]oܸñ=¿Â¸—“¯+JZiõ˜+rAÚ4 îœE¯´¤õÖÇ%%q}ç‹"µ+ßÁ€E‡CÎ÷pVÝÄð§nÊø¦HÓû2;ÜTÝ›X Ïo”Œv€° 0~zxó—Ÿ÷êFÅ÷e\ª›‡cH⡾ùOôþÓ—Û]š¦ÑûwŸÞýòö#N²èó—Ÿ>~ø+/Ààݧ_ßÝî’dÈ£òö¿{óîa9tŸ$r+Äø“k)¥îó›üÝ«4ã›éÛä}½Ýï#mZýØ6wpŸ$‹ß,ú-ÞÇ üS<ÕÖêþ©áÉ4ð·nÎÖ|EB²ðr›Ñ0Û±i ä;å8ü¾ù-VÙô ÒYOMt aµ¦júQîŠÓÉŒ(.ÃN¥÷jÏœµL5·ÑŠ<ú†„ûŒ „A#ƒ©0SaPL/Püì£N÷}#ûª¡ÍÜ0Ó‰GÌ lóû|«"c›îv§"Ay‘ºW(fá#ó —ÉbÅâ>QóN­yÌçÀ`%*˜{Q!íþÞ3¶éŸÚ‡Û¾Àô‡­»vî‘­,Eõƒ¤gžœ4ÃbÑÕ4ë–ÇÏrHÛÔO²<ô„âÏöÑã<1ŒuM‹‚%ü‘`´‹¨p£Ü@6ªüOëÚlª=‚ï«" Ú£Haº„‚LBAúšÍQÌr‡H‘†\å& ²úWã%éñÖ A7Œ†åDIì'D9 ý ÑÓj÷áZ“…ÓäbïãÝ«©´("Fz ß&NÑEdS|éœdOX=…dY§¿=¿ÎCò&“úgG;t¼KzÇÏÍÀuHÝ|ñ­Ÿc>8Ãn|çiÿÎs/»UѶzÂU˜lŒùÂu!2É×L-Q6`êà™ºÈêø_ð–2Ì3쟤74QŸ.“)|ŒÖ Xn8‚"…¹ "Ãø I÷ò ÙõGNáéÞik04-‡FƇ„ÐÞzGÓ qXX8ºµ[wçJ Ÿ¹¢˜—ònw6­FÂ#C$šç¥ó™I³Æb'üx#û0t¡ÞS}˱)/ƒX 1¿Ñ0`ο¶°0¤¤8ϤtOÝ¥Ótm‰€á-‘+#¯©èNöZ³” –xþm}LL£$Ž‹ÍzåÓ€%D—$SdéIKbCÈÇ¥–ƒÉx¢š 1]EpìoLv¦œS=2NóK“…8¥í ë ÎL} ¡ó»3<Áj‡½mãp÷†*â8ª›#bÁ¤Ò=_¥,/_÷Óné2‡–enð°q£\c8D×ñ(äFÓᦹtß óؾlq´«`ƒ­yr!â8^a´„œp ¡˜ b+¡¼j¡®è;¹8 T·OÜ •hÉIz;?Âá¿Ï µ+²$È«8YNHÞ8¸”7Âè)ÈCí¾m ,’=;¥IÜñ]C|£í>¦²ýêXr’6ðÛØn”á¶á‹¨×]&érT‚Öж 9EÂkv`éÂK é–—Ñœ•€Ð­Î("³Ñ'¥+(h8ð"”~ÝÕ­ÊËÇÏV™É-}¶¤½înÕ‰tÐóûLšFþ‰¥ÂŽ2º=—›˜¼«^Ò×@õ[¦–«ãÅC­ÍÚa.f»œNgl0±$°ka›£åúÒ Åf9/‹8ÓíN´oh¤N2)RÉ_–jBºŒÁSgùµé-céÒ–“bâ}Ó7–úïxà vVÉOP.N½’L ªà¦Óƒ‹€, Ò=Nœ{ÃðÌÖøÕŒ\1&¢ñ+# CtÆ8NLM_ß[$Š,}Û™ÑÓd§Š¡¶èŸå»™J(è=šžˆíÃkï7ÚëÉ> ­ÉRí&Ô•Ë’,ì¾'AÇ?$>BÂ!ì.½Rþ°> endobj 54 0 obj << /D [52 0 R /XYZ 90 720 null] >> endobj 51 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 57 0 obj << /Length 2600 /Filter /FlateDecode >> stream xÚ…YÝs£8Ÿ¿"µ/Gª2øëѱå˜[¼€g&usÄà˜:\€g.÷×_±‡Ý­TE­V«ÕênýÉê΄?u71ïF–Õ›Øã»íñ“)Üÿ|RB=‚ÀcKâ)üôy1PwÊìM̉º wma|÷/ãÙÝÜ?Z–eêŒZd Ø(8‹7ìZ™’ØÝl”®V®À“>le(p› …K†ÂÀw8‡ìpðNÖ„vh¢*)~Yô·Î=œN‡”6:r¤¡M«ÎÜŸ™»§ìa_‹ü^ˆü$Gz ‡Ú]~8ä„§¶<˜G3@ÃcæAÊÄi%çúI âŵÎ_"Á›hœ>®Ï;}dÝ8ä°QŸUBÿâ8èÔŽëš(èÄŠñ_¦ñ¾€`„ƒ•СbÉŽ {†½®ØP®ª¨WÃV®7Îy«%eyÅ|Êá1æð"¸Þ‘v¹%É7ªŽ081U;1Û$¦jó¡k—,„haÀáo$ç´æˆŒj‰›Cc‰p}ZAî[ ßäTYíÚ½ŽÚ cwE£…Z Û’h ÑD;¯×ÈÁ²¯DEÜZâºÿýàîöJD cÑûsŸÖ%»;@oeœ ½­z(ßv[õÔ/eOµÊžÙ.{ŠMB¢U¥Lã ¥˜0AÐ$šÍü£ZëUFYÁq:^а(³ ¶ÛäTEP$Ú|ÜÔaø/9 (]£,¡dA$îѹÚçEú¿D*ÕUöÕå³3ñdg v³¢`VÜÔ]‰~gª¬F&Åo'£Û‚Iûû§.xìrºØÅ/¦rÉIV.+ÄTÄñ?S²±8¦%­FÕÏ2–9z‹R¿>GU[Á‡KÞYâ¸Y³?œPêÓ÷H@º?2ùáHz<ÕÎŒE6‘`‘ÉÁáj·ÍO|à•Q¤ï{Ž'ìóCœˆTT¯ÈÝà ن¯Dߎ‡>PC~.º6tw.L­OœKÍ(⦩§W™Á¡쫞²¯ã¯èoHçyZn|,JöpÅ·¯7QQD3Ú>°Xe[ãD>´—Ú‡ïû‚/˜€[×ÃvºÄoêûS7D—¼òð5{>w`:k×òžýé˃ y7"ú[¨Qê^ƒ{µÿØåÉ' õÅ,ãé•Ûéz W‘éÓŠTÙÆj ¶)ãk‡õ7´i¦×!÷¿.µË”‡ûcY'ÐÌ BÄí)þkrÜŽêÿÕwBÇ}Ʋjò6¬‘2fÞúÕwž—!ó—Þj®ý€;Swþ]ƒrl‘ü•!Ì5cêÓÚŽ–Yâ;ÜÃg®»œÂ«J£ì˜ý|ùV›<è¿1ñÕ —Þ&d‰Ž8¢Œ·àvê ãwÇ?ðí߈­¿u†iíë @÷Y°#Úóx`8/'MZ€ë¸³Õf|àÑ'²\/dÎÊh×JBOæñf/êºBC1å=‘í¾I;ÂöE““fKÜ0†úÉY9á+Bˆ˜&ÆÂ ]Øs›¤&nÖ4Wb5Û¬€ìòÃÆ_{îa…œ°éH@¦;x°lÛ4|'ø¹(ónÄÿØLÅD»6¸kí‹a/SwÖ™Å~_|ÖWíƒÈ <Ö(9ÁÔ«·éñXY²š_ièߤ؅Aù)2s½Ð³ÇŽÀ„Îý€piã2LLƒ`󢙦U˜yp‰Â-ØjÅ„«göü+³9Å_œç2}ÍÇÉñEQg€fžïëYèxn® ª¡àê .ÍUýŒÐÂÕU½¥XÒ¿ÂÔúƒÎÅ2À@Š­þB¸‡äÆ]QÎ!íë?6#sî!ÔaÛ†:ì×PÇ=LQ’Â`<ûºžÊR78¦n€Ì6¡D8èg¤èäÛ¦Õ†4ä3¤=p‡E[˜!•xÍ ¸¾Šö¥× êÞÜY0à ­ Lqm÷‹~•ÎA ®s§ˆ‰º@ûÉÃxPÎaÿIwääÊaw"²¡£Õ(9‘Ñœ|ì̱3}aïê@аÁ±+ÀÕÏf"@z¬õÌiŽÛ œ3€xÁ%|q³euhÁäBG=t1— ˜9@akp2* nÙ‡@l"&r.·ÁE¬€\®mžEŒ¥M,°x`<ùݘ-¿P±Þ„¬‚à9 ¼Ë¡ñ‚€¡ˆLÉŽ tép3ÞxRBzDÀ6¤ŽÓ´'ÍÒ×.¤/eŸKÑœÍ6¾”|YÏç-ÐbC° :CÆ 9.ê´‡C:«ØR!A‡Úpéø"Ó>\¡¹U˜!>\RevV*ÃísÁ$׆áuÉï2Ž2\Gã²C«| $cûõÙE²¥5€`ªf#V1å,ä^»™‰ÆÑäwD³†þUñ|eÖ’ªO×@j:§ÓëàÙ!ç"¾,xŒ÷ª BNSÂÁµeÈ‘cÒ¼ú0ÿúýþjNŠS‘tU ÙÖïHÀUƒúY!æa¬"VPƒ©ä–gšøÚxù€7åž ­¼\>àù#¼ L=´kTkêk(™còE®‡i\?‰Žˆ/á¹<¼ñÝФK:¿÷˜ª~fäN}…̺\|à{Ï–nøÚ•¼3i Ý!·÷àvž1ߎFr;Ñ‹JZ‰xôhÑK}"|0´…«WU2],†Ì%;FµÐê+-ÒýØzÌK|J1‡Æö—LÔ…P+¯éni¥p3ißÊüp®ð]ÄÈ\Ú< ¡=žÀÙIÚÓ©7‘BV*Š·y–q–‰ê´Úwœ4ù!¢y-xà«û9;ðCú˜†Pà—„â°±<©ãu±,ÏÇúù;V VBæ´ga§(ã·]d°4]¶ÇnÑÆcâu}77OŽÍ¯6D¼:ã+gVßš‹«ëò.Izõ/Pÿ‰mÄâ endstream endobj 56 0 obj << /Type /Page /Contents 57 0 R /Resources 55 0 R /MediaBox [0 0 612 792] /Parent 38 0 R >> endobj 58 0 obj << /D [56 0 R /XYZ 90 720 null] >> endobj 55 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 2504 /Filter /FlateDecode >> stream xÚ½XmoÛ8þÞ_aôK VD½{û)ͺ]/²N8X×V–i‹¨,’\¯ÿýÍp†²d+Ý8°ø2‡ÃgRŒø‰ÑÄEžgOüx”nß9ÜúíàÒÆ‰O‹w7Ÿ1Ž=q&b´XwU,V£Y_æ/WcÏó¬/Óùôéö+¾õøòé~vGP˜ÎŸ§Wc×uâÐâêß‹ßßMí¬ëþƒY(qaW䎄o{~è²]aìÛÂóÉ®éüW˜> ¬‡Ïô]LŸþx¦â­é»{˜ÿ:[ÌæÏhÌ5ö;ŽYÅoå•'¬‰6%Ýíò#kÌd-¹x5ñ-Ymë¾ð+6—ûŠjsɺ«rS% “žû–4ñýÑXLlá²g뫱ï9ÖñÊAV„µ’ß±*órG½ } œvÕ•°ôD×ÐVR¬ô°’øßP·â/®%–°u‘%©R²-M&©°©dÒȚǀ-¨»®Õ2g}ÍCAzyÜ.ѳ,^/‘Ô `¿ÌUŠÇΩu©ÕÒ,±ÿŽÔ¯M…Ž$ÅÆL±o¨±ÉTMbô,îXÛä[GN¯Zו䖺\7(@óUÜzÈÀ± fЬŒFðtÕÛÊ‚NÁ«Vz©´ÒJ®TÝTj¹o$½/X •I±áŽ}±’Ž58[ Æ™­5·ž mÁA»¸Š= ÃÏõ¬ëò Mâí_Ïõ­u™ç¥^©*6ÔW”JeÍ‚eo€Á¥#ˆ•úš5ÔªjRW'k½WÝ¡soIº«üÍ©›¤Âý‚¼ž´{5˜Z`P «J% ~u„ŸsYo9|·eÍj$t{2mŸ£#5ÃD$•~(úwšïkU]LV•9=iïé¬]É]FE•ûœÃ Ó‘ýýŠކ¾¹L´[1 2îû —àä•ÚdÚ”÷$”«â<ÆêÙé3]*²œ¢Œw„™¬dxÔ·Þç95QdPYï8ö–¬6Zb{†>â™Û±^©Ï+ÕÇ#€`$ã°„Óâw£¾›–Œ gjªÉ–;ô‚t>ËJÉ5ÕJrcÉ-‡ =¨ûø»*eÍæz¢c.îŠcû!GÝ]¹ÓNåQ_À¹ƒ?1°Ð0 wAx” ø4„³q2ÙX“웬¬&³Ž± ùÀe½:¾à…p#–¬R¿Põˆ„!]è#O×à̰H—·åJ­áÛ(íøÃ `dêmUCù¯»Ò¶O³]…¬’œ*ë©|!UÔfsÍŠQ Î$oõò-³Úy>·Þxfop;†gÒÀ ¾¦©` ¯à»¬èlcÅ{cl7΀£ ººVqèį¥w8³Žv÷‘@ÒœaE:ÜŸ Ó®²ŸTqf|VîÚƒu~*çíX² $l8ì¼RP;äñ?g‹ß^$s;¥ÂŸ·OO·óÅëG£}ÏóÈïòÜ,µÝåÊ}Ð@Ú[ÿÌúÇôéî7˜àöÓì~¶xíïÅçÙb>}~æÊÃÛÆ¡vû´˜Ý½ÜßróãËÓãÃóò—€-´ž¥ˆØË=ý¹ð]ŸÎ’ À•l•׃ÛûjNªIz˃…•L%cîñÿóYðp’—HÌîÕgñgÜ6ã¹!#p¸ÔRžÓ{wÙa|'°ýh¢)¾ Ôhïȱ½ Kôì¸#¬É~'Ï5j˳¦Ùýrss8ìM±·Ëjs“Ó:ë›s“|wbû±è™tyë0R?6æ\—6Æ¢öHvìÀ‹ˆ¯y,z›×œu“ÕŠ’©*€Ëj«‹Úè ä€hZ?_§%åñ$e¢@DtO•%e,KdI9h×…´©`¤&³Z_Ëv yC?·¼mìv­Çðœ Ó ` RXGŠD¦¦*& U`P⨖~€á„Ížð;¬G N¡,ÉnÏå„>p^¢TËI 9Wíxm™â¹Õ> endobj 59 0 obj << /Type /Annot /Border [0 0 0] /Rect [297.677 403.487 429.481 411.706] /Subtype /Link /A << /S /URI /URI (http://www.gnu.org/licenses/) >> >> endobj 60 0 obj << /Type /Annot /Border [0 0 0] /Rect [324.455 227.912 484.817 237.912] /Subtype /Link /A << /S /URI /URI (http://www.gnu.org/licenses/) >> >> endobj 61 0 obj << /Type /Annot /Border [0 0 0] /Rect [114.273 159.17 383.452 169.17] /Subtype /Link /A << /S /URI /URI (http://www.gnu.org/philosophy/why-not-lgpl.html) >> >> endobj 65 0 obj << /D [63 0 R /XYZ 90 720 null] >> endobj 62 0 obj << /Font << /F51 9 0 R /F72 7 0 R /F67 66 0 R /F31 67 0 R /F52 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 71 0 obj << /Length 1149 /Filter /FlateDecode >> stream xÚVY“ã4~Ÿ_‘7œÚ±‘,ùª¢(Èpìr,›y[±Uë#Hò,ï§å–g05•õåV÷ׇBw~tW]ÆXTð|WvwÄK?ÞQO…`®,ǻϿK莒¨ ÝÏkÇj÷kð0ôû8¬V§ÑÚìCÆX`wòàû÷ûß?€“xí„’4JRwë䣾H}öv7—±8гx6{´ªUÖÝö¼cF( hì>»ûö¸¤Äñ+9:‹$ ·Ð,ŠiÂ}’iÎ#Êø5IFo’ÌLÎ%É,Y;¡‰r¶‘ãí] ‰2^¼È.{F㔬´ã(…°Â8HáÃûÐl > ¶I2»>6rò"û·¢$®ðª§ì•Iˆ3øÇ@Óÿ3 =ö®:E¼êÔºŠÁ{:/EÔ È@ «:õÊ3„ÅÉDTÌÏ `Ó¹PxëMT)-?éÁÊ®TíV¥à‘°°âÌ‹¦·~Û;,ÜǸ¥nÌýhði“Azðºy–­§ë?œ÷si}K@‹ÏÝá§È¦4£²¸pÝŸÍ¿è~î] endstream endobj 70 0 obj << /Type /Page /Contents 71 0 R /Resources 69 0 R /MediaBox [0 0 612 792] /Parent 68 0 R >> endobj 72 0 obj << /D [70 0 R /XYZ 90 720 null] >> endobj 73 0 obj << /D [70 0 R /XYZ 90 720 null] >> endobj 69 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R /F75 8 0 R /F60 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 76 0 obj << /Length 1384 /Filter /FlateDecode >> stream xÚ­WßoÛ6~Ï_á·ÉhEó§(Ø€-h‡X1 )6`Û#Ó¶YÒH©^ö°¿}G‘’­”IŠaÈ)ò|üøÝÝÇ Yaø#«¯$c¨àùª<^á°zEÂ,ƒôÂâ‡Û«Í;AV£du»»tq»]ý–\T×k³Nc y³N9ÉM³¦yÒ›v¸ʾj7Ç„$„­ÿ¸}õöv>VPú.gñ0IWD"JÀ²œ#¸F֩ȨƒÂˆ‡ãÀÅèåÅç| .‚}§Í./X`e”¶Ñ¬²à<Ëå‘tã­á—ºìýÆAÙƒßÛ M íïu£ê[ã7O¦ê{öªÆ/^ÇÀRÆQ.åàÕ«HBb²AÀ'ÉM€ÔÕØ]kŽÖ£&RÄ"Ú±|¾g=#Ì‹ÉD×ú¨}ôñ*e…@«”0Dà—£Õ`µIm੬~Ç„ë-¤Áɽû­~8¹¡5aÑê>†ŽÐI’Mgÿ…'–³I塵ޭòÃ2^!^noŽWìxW‡Ä ¾ßÅŽ—ˆPrAÄ‹D“g} A˜,†¦úsÐõƒ‡wTõ7yÁ› ìë90´`¿Šß†!š?Oe†d1'C;S ’ôí'Vû0Å(záWè#ñïc1úl–ÅR„lööS¢XÜFŒÎ÷~ZÍbÅ´ ÊÚEÝ O$³ÄP_âù ’tD GǶW}UúyíÌö~èüB¯îjp4Û NUÆÏÚ¯Ýp~b,ò¬A@%ÉRnÚº2•òlï?·žs׸›»²ƒ|1~Oùa_}UºñŸ¥“žƒ2ªì'CÛ›ªÙG“ ž;ÑacŒå(Ïæ$ó””å`À¸|q‰8¡Ïëf]Ê x¬êo×ûñ¸NIÒÚé9*@ôµ#=Ðñt¦½óë¿Ý#½*—WE˜,;î¸À¢çúP[Š—2Èœ™ŠLH-÷>Ð _æ²ûñ¸‰èÄ­_ùâÝõfe»oª¿]XÝ÷® “ZÿU•PÎ)d¦ªÀ&â7Zí0¾ìW)Ï D|Id÷¸GdLúTwS™Ò¹qýƒ(îrµu¡gER­IÒ”õ° &yòã‡OÞöúµ݂ΚmÉ$4dÅW4dü"iæqò^¹{~^ hÆïýì¶”Êïü4ñW+¿À‚ÅH[˜M«fÒ¹în dÖPî~;z+êÌŠׂ®ûÜ$Úv0epYpzÒo‰ ¨ìE¸œŠ•AŽùåÎòEÎ3–\éb\…i±Órr>û9ô}÷f³ÙõÚ7jÍ~Ó w˜oF$›( 9èD‘_<ý9Ôù÷þÜ`¨éióK[mKSÝer(e4C{Ô¹=ÉüÓ’Eõ›ñérRn«}ãçáùùt1Ÿž å‹n\ãÞh5ê¸÷ЫªÁ«r ìÂKTMÔ^ü~Ô7ùâ1úéãÛ7¿ú,Xÿ—‚ãùÚ×m³ƒ±qÙô€÷Ik§è[ˆ°mýæø?ŒOeüW‰p.¥ÄétB¥E§Áö5ÒÛaó-ÇjÛo@ª†£F‡þmr¨ Ëìÿÿ -·ÞÓ endstream endobj 75 0 obj << /Type /Page /Contents 76 0 R /Resources 74 0 R /MediaBox [0 0 612 792] /Parent 68 0 R >> endobj 77 0 obj << /D [75 0 R /XYZ 90 720 null] >> endobj 78 0 obj << /D [75 0 R /XYZ 90 720 null] >> endobj 74 0 obj << /Font << /F51 9 0 R /F72 7 0 R /F52 21 0 R /F55 79 0 R /F54 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 83 0 obj << /Length 3328 /Filter /FlateDecode >> stream xÚْܶñ]_±åsË; €—ßÙNì*;©òæ)·ÄÌ0â’6_Ÿ¾’³T¤Úª%и}wcâ‡þâ‡"zÈ´ “?T×7‘@ß¿‰¥u€ ‡ÕŒ??¿ùÓOIüGañÃói½ÅsýðÏàÝ¥¼MvxÍ]]^m‡ ¦²å=®Ì;æ}7>!fàA¨¢€SÌÙð> æf#F:Œ²Â#Þ5SS¶Íwoi ™+7ww»4ÌâdÙm„;ìí¤²0^“ìa˜…°Sæ °fûaG„iî1Aï’$x×w•½MsÙ¶/¹æ³ºÜ`D‘†Üï‰#U5Ü?2‡N=pŸW#^¸30:I ;Ž¡p!Ã4*¶\ø¹©£à†ÂÐTÅìiO¹“$Ì‹/ŠºŽik7Ív( ¨N ´¬Ü£e‚*”߉üò0óÓÊa(庸qÕ‹‚°tg¾³Œ”…úO~SíËGüôCípCUÇyžŽG!|ר…ŽY¦ÚÑQš€àÇ™®j"Œ¢AUóGX Иø¼p{ºXž:£A(Ò$ ž/xö js0qS™ÔȾvEã’v½ ~²ÕŒ2s˜š«,¬úqâAT„'ãE¢­$,‡"ªUð3¬ÈØtÀ·äà{š[n×l7 µØ"êÒaªHAo`Nç pæì©SªCU$÷fO+pA•«$«.6{’¡Qk5Ó‹µ'׿“ú¼ÏÃAEFbCµÆ©®4ØÿÌB|¤<Ú@¶…°Ušpà#^³$" ôeœìUìîíÖ6Uéé«”3µm=wö>ÛŠo*ÈÊ™U;×±3ÏU½5-øõ5OÅ2å‡$ï(©¼Ô£ˆ 8`°#î@S@ˆ—€)Ût<‡>µõk»š'ç¦MÇëÇ‹E#† SË “Ûð½ÂR±JwBøûŠGh&Ik±q4Y­Â!O ]kë]Oª³0UÞH¿Òú=g¢ÃLå+€'7Ö"dbÜÕzceN’µା#…4÷²ã<²Õgc’Ç¡uØP¡ž²ck݆þ<”WîxgH‚ôÄaX¬8¨¥Íî@ƒM˜¸Á6˜lN¸ a‰7M´P¦3[æÄ7…AäRˆ£ Fî·ùj‡~F¿¥‹²FÉ6~¤1O n®·Ö^ÅÐ ÙÆ~jÆ ïÇPÓÛùQmÓ½Çõ„6ìÙÂ27vlºrpduˆ¯¨ºFÏ€ËK²œ( _snŠcpl­~<·‘¹‘È=/åè†KÐÔë¼ÐÁHX ¦›E„g€þ}ÉÇ““XÏóÜ em÷4C$ß™hZT¸¤_SV$oà:¦Æ 1®0²¹< ˆ‡€ G¦Uc»Š¼\ò'l“ÇÀ)ŸJäé=yÈ}ÓIFKðßíÆ¤q¥ÞD[‘¦^¤¼“Õ)F[»8}£Ù-ˆÑÜõä¯B›"º©Ýìçó…'°žb´„3Ø2bÄ3ïË35U9Ê$¡´Ðƶ £“sàZ\œ¹¶§»0xŸóÈ*n¼àR{£CÐÇ[⤇÷ìÉGãAF„ß¶?ï1EE@Å<û¿LI'k¯ ÎæÇSHÓ†Ñbˆj(D5Nêép”zAÓëv.º-xƒc´³TE9™lK†VÜ,„Wx½‚¢ øàÞâã 'F‰¤2q»†¸ì!Z,{B÷Wr°ÅÏ’ß KÇö£å˺n]q¸›~ÉýkY¹Ø²t9C¸s¼öÓ¥96bRå(þ/é·ø¡qbëË2·L†èºÀKVl‡ï¦µY–lòWp WÂ>/`ÌH†O”ãù†”Ì­òrùJGMæÆ'ç wtý¦FJ‘Eáo›ä@ÒÜvf£ƒ=þæ%|n%¤\ #’o†V[Ê„ª…Dö;ÉV>ÀûGγ i_) 0B±52j"áiй0‚8Ë“•eŠ©‚“Eš¡å¨"žvä…5ÚÓY©|}’¥2ÌHïªÝ9¸‹ï™¼i´&oœK6œƒý³]F¨0M|PŒÁ¸Î(AìéÜ‘ûK\ƒ¦¡fà`«þÜ5r›,#…Ñ(æÜõN;Û:³8…‡ èŠÉÄŽ<êë¾ÖÐw»y°‚ô3MV‚utUAQ*<Éå(hCÂDÝ%­ ÓÈ…\Êz¾4R¨Z’ØII¦ÿˆµñâ`«é›×Ìc&“3ÜaáA8³‰Š¾Ž‹Ï„ÆÎ¦þÜv¶†àíÊ Ö #š[r²YÕäöyÌ"´‘/P¡jF’÷VÕ;ËZÛ±cÄ6©,¶ŸÞãUïi© îÈEnB˜ç½Þ¢‰–Ó¹3§,¯‚p$˜Y;$ÐlÇZ8oØyeã÷èúàݯøkp^®¢u˜’é,ÂXIat‰ubÍ2N­uÊÆFF(ôˆMp*e‘-ÇÆJ›r‚XûâÇnÆk"0lþ–÷öz¯°’B6ã¹Dž±^Ùr>ü⣳­Çˆ¢0]Ê`B0Q±B…Å[þ:Œ“ßa¡¼Ç‹þ R»r¡†eÅw}wphкµN2dgOéÞ¥â†2,~8«Á¸­ýÆ©9Íc¦µ  v‹"sH\ÁMtÜt…1Œ‹ó ’ö–‹90£ñ èD>¥ìá«#ÀŠRxš¯c;²¬’UÃB˜õuŠ—¦>ð‚&ì>€ôQÅ:u†!EjB¤ÒË#$“sZG7‹ßÅ̰•Or0‚ E¤[Ò( ©_©Ì §Ž«[쥧 r?©öÜßcérhF’Bcš…Ež~±Ò¨ò0Õ~Ú·xÿ«§’"Œ‰ûâb.ï7d個Kar7ºR =KÐ,%¨ÃJi^ÅÐE%Ù¢ÎkIÆóÄaåùZ’qí.Kl”‡J¥‘}Å{³Ä;8¼¿ö¾æd½ríP4Ï«³äËÅ[êƒv‘ßÈG_}mÔ€áÅ5’¼+ÆfÀ^ÉXÂÖ7yÈ•i‡¾å¡µYpûˆlj ³û²ˆ=CÊÎfŸäqb¦,2¾~§Z3p}]ÓÌ¿ jZ o8© 5—ø:ƒma¹Khi«w¸¹ä¯Š®²R/ˆ÷öÉv”oëò[)“2©vGvê.@^J~ø°Ž 4Šâ’Ú!÷Z6›¾Í©´Kt±ÑiZya(ùSÛª¬­¼iü, ØG§l"–Š{«½BnºöLÅÇKƒvNöªøµŸ„©T¯7$T•Ôåh (°!÷°2Yó“€Ñœº–\ )å ”Á˜íÛ'õïÞÖ¶ñ®²/š»üLÐç뚢JÁwœøFÐç㸡„¾ ¡‰Þ’":+²F‰“Á\”8ŠÙj¢QݸqE³-lnDF˜ŒB·ovãT…æ+ì®[Rø ìô‹<|29!lÔÃ\C˜'˜Ý?¦PÍ‚G…gñ£é0Ï·Ò8 j¸ÚV$°Ãªø“QE GÖU/ì¯x±ïü¶!&¨Q3~ù`Ìs¶èÞÉñüqÏ!Œ$hëNª')`øå¢^fbC#uÕ•}¯ìPaQ8€’ýl¿ÐdÁßæ ý<:pÍi读ïò D›Iþ5¬-ŠbýbŒC(3QIk#L ¹þʕƕIì[Ùz”ÅL©\Ù}•[òm•»÷·<¢7‹ÕÓ@ÜÇH…% ¢y1>ÏSãÝÓïvé‘¥a¶Èðwß}¦Vi–<„Ž^ô‹XQ`Hy?öw*Gྌ¸Œ‚“\ÖMËLAœÌ•ù¹EÉŠã@“4&œ4"Ü ‡°0{ynêà©ÄsùÙàô€—G®”J2FGJºSzÖ# Šîñ«›‘Þ8w-5»×ÝÁ¥wŸ)¸” D ‘ÔÏh€KÕ>S÷o7z©A}^`!W\5Ê“ñ©mžúk9¹zæs1šàËé]ùcý›Š‘ûØH1ªõ¸û æàìÞX b’7ÚÓ‹ÏV›ÁÕ&üÛð*h€UÛÇ:œÊ/KrºßÉüM‹‹U endstream endobj 82 0 obj << /Type /Page /Contents 83 0 R /Resources 81 0 R /MediaBox [0 0 612 792] /Parent 68 0 R >> endobj 84 0 obj << /D [82 0 R /XYZ 90 720 null] >> endobj 85 0 obj << /D [82 0 R /XYZ 90 720 null] >> endobj 81 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R /F75 8 0 R /F55 79 0 R /F54 80 0 R /F60 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 88 0 obj << /Length 2562 /Filter /FlateDecode >> stream xÚÙŽã¸ñ}¾¢`1j Íˆ‡®}ÛíÝÍÌ"ا A&@Ø2m3-[ŽŽéýúT±Š’åV£'DÉbÝ-oRøÉ›*½)´•)oêã»”¡Oï$6°as±ãLJwþ%“72UZÉ›‡Ý%ЇíÍ?’ûƒ=®»Ýh­ýýíÆ˜,ùà÷‡Í_Ýï·ªL\Ck?¹¾îüyðí &iw´ð—ß>ÝþóáW¸H]^¤ÒJ”•ºÂ=û³ëv¼oA’RȪˆûd†›Þýü01•)õ׸ãÛPS%3Ãlç¥RºFßn²\%n72‰ÌjEÌÙ³ÌÂwb¶È.Ñ«*2/ßdv£ÊT(en6:…¬hûÃÁ¡(Ur¾Ý Ä»«‚l Ñn<ÕQø*Ù»“ëìÐvk¢—E&²·%¯•PY·uÎn{BnéÓ;&‚4­’Ï ¾§[U$îù šFÛmû?1u]{äÃL¡?G>ÿ9•¦qH@)Q}³‘ZH 'Üý9ÍÒm°˜0:‚XÔö´µÝ–f1ìxD*ž ¼u;;6 ’‚”ûq ; îxzš -ݺΓó._©  øÓž©‹Z@fR悘N˜Tƒ(ëvò8´®ž`?&9º#ÞùÈ·ÐÊ‘aÒS¶Pg.EUNÒ|M'ž“6]îÖT^)¡K1}ñ阼¶ç‘e\À9¨.€Î·2éZ&@þ„7£Hq3ÓJÎŒÐyµTrÓ†“íÓˆ2®`»}lèÊh™|Ü­rQù-†,E©å$Ÿ±®C[ÆK€Âðe‡ ŠÄ9ìBÒ4³ô™},è{îò"ÙŽµëûÏÖw4Bâ÷ž±·cW³0dZ‚ú²¥0jÆåß®4ÄŽ3¶$ÃÅÀvÛ 2Y#NÀ-øŠ’† 1ÜdÈ»ÈMCK,ÇXîé3ÓviäL¸G¥I¶ðÒI©É$YpÌ.‹ËÀø,Üž—yrß°¸i€a^6"¡—­ŒÏó XƒÏÚg›Åô9¸ÀÈd´+þyd¶üî™Å­çPe0zÉdË .PM[P–Ç„ýEЭR§ÞÎw¥Èu· v˜ÔˆTå@o!ÒHð@§Ê²ÙîÖnÍ2¡ }ƒ‡9m›"¢GÝá÷ÒÌyÅÝÆAôÎkïÈÓia²;<‘r Á•ÆõŒn[õ< >…Ð%6v "1 eõg[;RxFãÿ°l¿ÆäÉV<º…ðîŽööqnÖa4-œ¸¯¾g=“‹á(ü£KÝ‚‡mZ Uǃ®çÊåB£%àk'é!1Û=î1åÄŠaÅÁï>‚˜ÞÞ"oe™|<ül;ˆòcck™Îpœ‘)Ùx͇œ"A¸8d €lÁ)«tí˜=T™(m7…HœÝXct^¾·ižiùÙ»†¨S%ÈÅö¡¨\"r½à@’r"ï”:aÄ“'ãáË ÄHñfÍ ó@²yÛñ6qã"i£`TÆF†¬«¬z\.J¥/s¶;Î>—ô,“#_J‰÷ýɘž¶v`‚Ø’Âéha›Q²i•ür ²;°ŽîØ¢®‚‡U¥(J¹ÔõØSÑUÈõ&]ç7S"¿àãu~+@=Éåh¹2C¼̆ /ëÙáBl‡yHS°‹R暦àš€:Îv>¼0 lî ˆÓ[®“Â}̹|Éyçz§=ó­cz‚k :9›!wF÷ô©±²jgß@šeVƒ»eCTéÞQd—šÃq{tqSåÉ> 8]b²Íz”/!Ê¿Ý]hH"Ù¤+Û÷~²j…®$7:žpYËà xP5=Ж<”?ö< {6W#ɼ}Ck¨ZÀF‚#}ÒÕB¡úµ-HÌ!ÀpyÞÓ²³1á쥑äTcÃg<ùÿŒî )ØF :úÀלwc'c‰!ÔÔ0õ|!Wa9 8€h¼E{>»W!”6¬†§«©Tê=í1|%gŠ|õ>6žÏMÃî•þšHSVoÛƒ©žì!V騏U°q³ÈE³rÝ !dæ.–ʱ€„6ü"¶þü5"ð1ôÙ˜D‰GÊÄä8f­NeVîÝ@eû¢f£N%ä`l×   ÉŠüÿ)Èèõz“+nÛ5ôúÀžª„Jùé8åF3v¤Ä_l¸V,²©VÄ炟4•ÐÕÛ¤40Š«â{ÿŽÉ’JÝœd´$â®E³–ѯa…Ë[r'Ʊ¤Å½±‘F8Ùm÷L~ ‹µëë§k–Õ;nÝQ¿=Z·.°ë"‡áïÂCæÊ=!c:!§ýkµ4BVSǺYíj%T·ÙTݾ'´Tù…ŽGÒ Þ²{Þ÷4·g¶QÛÙSíè¨çÅÒðLfK@| €P2 âÓ ÙjZ¥¦ž}׸¯«¶Wˆ™ptÆTØÑ£®¤øè{z…X{Õ)&M/+à2Ÿ~ûø·‹’ú5ÒK0µùà5ÂSQÊò Ê• NÛžm]¯¢R8¼ X†2ß$\çÞ÷S_FÙyÈòÂdC¸&½lÙ¾_©Ì@ð•^æå­«AÛ–†•ÐþÝwkÐ'ÈBø¶Òq®ˆ‘3 ß\y¼(³|IاSãŸÜª™e¾ÅÊä\ ¿’S´¨Ê)W¼j]Ë`y7¿[mt•.% ½‹–0¡ö§Jç³,x7B—':ÞHÞlN7ìOÉ+—xˆf°kç·™xðwJ&’3Õ~O ‹übæ7eï¿‹ÎÊ‘"9ÐŒñ®Ô|l á-2£Ð‚_Š:-”hÔ®qŽß–:ÑŒ#£/“\ 0‹{êÐL Ð aeB9šß»+,«ñUU IcþÇè<Ï$D¶N-“‹7 À™L±æ ŠÓ2ùôüN=+¤¶½»ré =Ää…ëô0¶÷±·§þ°áÚ$ ÅÓXƒõô8_<ŸâFˆ/±$¿c]‹½X#à åRÏÿ¶§rçJ0عÇîÅ’ŒíRG]Õõ‚=w¾Y[â¢P2#(*H‘2ÐõdS•딟®Ü 5φ›Ç?JÈ©ŠrEVœÞâËY;0ŽÞÔQ”SmbI]EI¯íå…Ä|+`­›‘Ÿ:po÷è‡E¦÷ôÙF%ž6+õ[×ìï4þWŠàð&Ú¯v\2Õ¢ÐÅ7ý‡’Oñð*þi=½3)ì‚ ±üv8Ëz*üÛrf²ˆfFô…þ‹k–жqó®s‘¦Wÿ¬àËÂ÷¦íTB[®z×múñ|n¼[ÍÞRéËOï?¯´ï/"þ÷_.usá endstream endobj 87 0 obj << /Type /Page /Contents 88 0 R /Resources 86 0 R /MediaBox [0 0 612 792] /Parent 68 0 R >> endobj 89 0 obj << /D [87 0 R /XYZ 90 720 null] >> endobj 90 0 obj << /D [87 0 R /XYZ 90 720 null] >> endobj 91 0 obj << /D [87 0 R /XYZ 90 406.434 null] >> endobj 92 0 obj << /D [87 0 R /XYZ 90 138.082 null] >> endobj 86 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R /F75 8 0 R /F55 79 0 R /F54 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 95 0 obj << /Length 2182 /Filter /FlateDecode >> stream xÚ­YÝãÆ ¿¿b_Ñç©æC_9ô¥I›\[º‡H‚T+׺•%E{1Šþï%‡Yòɱ?h>9$‡ü‘Ë»~ò. ï­EfÒ»âð&äÑ—7’[X°™­øÓã›?ü%’w2Y˜É»ÇÝœÄãöî‡àë}Þ¶{Øh­ýÕÃÆ˜(ø®|Þoþn_TØŠæ¾±}Ñ•íP65˜ ÙÑÄ·ßxøéñ¯pš¤ÂL¤™¾Ü9Ï­ív¼nÁ’RÈ,ñëdŒ‹Þüùq*RêŠÔ¸â3±àF‹Ža±ãÔ© £…ÄßÃ&ŠUð¡·Ý¦Û¶*í–xL¢ùni”Paêyì‡n,†5a6R%Bʼnˆµ¦õïAS*‘Á°·ÔøÏšÂ´:ÖþŒÍ*}Е‰&~AÔ¾•„Áa6Ý[è¤&°¿ŒåëCyek¼Ë¡:>¤:pÓú ;(sù£îIæÍplícq*Ÿ1¶µE•w9r|IÞgû"‘éÌï+û BÇÑĉ­ó§ÊnY†#ŠÕŒ«¤•0§;;Œýú°S ,là¾%̹Õm× á×r *2¡ rü„Á×kšŠ?e®‡éé‚óž(»[@ÚUº¡¢9´(^·*˜–]-,ë³3=ÓLo ß ƒ]×Î6”u;òY?†ÒTV ¿ ‚0:J–ºxtf’&ni‡<úŽ­¶ÔAŽð;ìá]‹µàÚä}ôŸœdL1ÄmÄ%Ç–§VÑ$Ùt™Å>gÄúrUÑÜüt!M·jÞJ¤ÑdxES#HÑÓ6ë´cðëd2ôÒóïu´îÙ¡HO–¸ùÇEÏŽæ„êñž:fÍÖÍ@—¥ãXÈTñe1Ê–„Ùõ[A¡ìð•ŒÕ꺞S)’øäõª!«P$'Ä.wt†Ó;t  œ>>E†õÔ&tÃcÎÐ-!t3O3;—Ð è'"<¼µe±*©Âæç°æŽÃëÁI†'v(-ÐY|îPnqš<ÊwœGaçä3ØCŸIÐg°Sä@íuÙ¢PDrÒ]ì ²½E<РÌaߌÏ{¤Ÿ%3àfXêû„¤¡¡aŽ7·sË´mà}Ž×úT{Þ¸·Œ:‰F™¥’ÖI„§ù·ÍFÏ Ò8ÙŠ~3FâV¶"s)FF"I'ϾßÚ]Y[ÚÙWͰ¹¤û, ÏØ\±+ƒ˜v±liŒ{UƒVÿ‰MM™PÄ.ïЙ"ºßÙŽ™!ë4Æoå¡­xÊþš0´ •ʲVƾ¬ŸiþÐZöý2ícÍp¶4óz;Í— Òù0€ã`==s…aè«UÅj@ç3i|H‰T„L¡aó¿ô!ØÆÖ—¨ôwÔFsz<<Ùî|t›ûó±Êæíϳ‰ÿ½sú 8{¿d›ý˜×cÞA‡2J¢@¾% úÔXÛµ³O߯(^­RßÈV88ä]±Ç$(F·”·]Yù=Æ/ §ÆÚžCŽŒé䉮œÂJkgE€BA|ÛÇêè·$7Š2>:¢,³éMœõ*4^”ÝÆ]S mr×#ÃÛ8¬›×ùaRÞv€Àb›Z?íóÂcî1L럶ux‚®¬àqÏ-QPèÜ’¿éSE°H:‘:å™þרJ—õ%1%z0òâÀâøÉ¥íݶ§QØh`kGM‡=íÏ;&™Ó§ÍK^×ì8Š(YŸ^jó:[Œ§E`cƸ ðÙœ6à(bâsÝ£šøØ« ê)í!¸R 1½¼m}‡R¢+j¼3•Ý1Á K'õ–0«Æ/!­1³tF‹¦µ? ¿°åÃ÷ïÿÍú1PïJ¹Ôh¦*))\· ªºIâÊþº*râÒP^ä#2°•€c ÕÖ%3Äú7Šo*£R5å-{ª£2ˆßÍ·xúÉ¥“›'{EÝbÏÕP°0¯}¿¨F*ö2®‰0!R0—5Ð⯞jìØŒÀÔ‘§š´‘F¬gFùÓSg_Ë|°/wMwण*_8ßs´ìWƒ¤E\ ‘ïÖ æw ^|ÛBð{ÉâµeC¬);ÖóE.ß‚;`ßa.‡}sÂ’õ°&ãU̬,Õ‘YLÕ/vܹç1yY¯zwb€^{®—0§Btvv/@¶0¾|Í~¤ƒK,âÁ¤¢ÑÖ…ã’aÛaa~Ñ%”da|1ÌÞŸÏÒhÚD68êL‹L×$øÐpp؋ʥ®Ø¢|¹§Î¶Á’4 Þ×4°Ë‹ÁQ‹~!ìŽ4ÓÚíž7.^%¤J¦È)wtJ¹i+ üæ+†6qJþQsVNœ ÜgÐ"|¾›w¼`ØwÖžŒOÊa¦C.v‰LžÁ–òq.Ô‘ÁZ¦Nj»ç.ÕåÒ,ÖÜ)ú\,$2#ä6îñDØ€~ž1ñ^« $¸Â©ÐñE M’ 1Ôñ1MªßÀ§í^qÏãa…ý .°¯E¤Oü÷@¸Øÿ‘–ÆÉ|)TL©<=ä4ã…'|6,Ò>G`SMÕ8íý‚ P.øGžl!;<*«žô3 8<î' ©*÷<ü -ˆ“¹µg®T˜4º%¢¨ÓKÔö3'°ÌÅb½¬ð•Iø¿Jþ+… endstream endobj 94 0 obj << /Type /Page /Contents 95 0 R /Resources 93 0 R /MediaBox [0 0 612 792] /Parent 68 0 R >> endobj 96 0 obj << /D [94 0 R /XYZ 90 720 null] >> endobj 97 0 obj << /D [94 0 R /XYZ 90 720 null] >> endobj 98 0 obj << /D [94 0 R /XYZ 90 253.706 null] >> endobj 93 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R /F75 8 0 R /F54 80 0 R /F67 66 0 R >> /ProcSet [ /PDF /Text ] >> endobj 101 0 obj << /Length 2542 /Filter /FlateDecode >> stream xÚåYYsã¸~Ÿ_áJ*ºÖbˆ‹Ç¦ò0«ÍáìÖlÕŽó”Mm`‰’PC‘ ñj~}ºÑ/Ñc;NžRz n4º¿n| ±«~ì*‹®!ÂL¦W›ã›Èµ~|Ã\iV£ßܽùÝŸ»bQ˜E»ºÛ—¸Û^ý=Xô©Íëë•"__¯¤TÁ_Ìþ°ú>ÿtÍÓ /¨ïÛ¼ÙÔæÔšªÄT;êøóû¿]ÿãoÄ£,L3 rÙ}ö§¼Þ¹q8c!Ë?Ž%8èÍïúC)Ο85ŽxúØq*C&$móÏ%‘E /Ço¶yaŽTÓüÆÆÉxlœ† ï¥î¯ Ó´KÇLY(e¿ú[æRa|µb"dŠÚßE…Jh@·LçkžUG•¶¢ï©¶c>™mN ?qдµ¹fA¹§ê ÃZmJCmjÓ­ß5ùv¼8,’Ÿt­[·òG‹€ó~ªzÛX±#'2#™wuu„ÑI´‡Ü ’Ò(Ð-sßµy^¯Tʃ»CN=Û|§»¢¥¦Y²K#ЋSÕ¯–´©ÆÊ¿yÌ–ìùkX)Hi’¬òH‘Q« ó¦ÉI­F®wG3ÎVI5ZiI¶f`ì(USÝY­ƒÈ©.n»Ûƒn©ÿ ­éí(jÉX¹¿^aÓvkí S6Õñ¨Ýôª¦¡eþP˜Mb%R‰E_ªç{`¬Û´«ö|Ê—t:õ ‡r~§’éÁ'@j¤<“´"SnŠnëΩ‘ÂT˜Æ™ß¤[L¤aÔáÅÍÎ'R­¾Í7â¾n;Rš öy™£Cl©}SÙiÛü÷TGÃ1¿Š&3T#‘”Ó$›¸ºÛ@ JÈ¿èã©È_a³/«:_mtó:㬫²àòÉTÝ 5•¾®Ë-D€LéÔ¨Ceàö¶öîÃúÖ*äÖ÷Âø¨yCÛtC«æÿȩ̂kº@K‚\2Íá âØB¬CÐ2µç3EA%ò+(húXÕØ’” hÌü1¹Ñ´'ôEÙTN7±ßÄ’"ÞW­[É9'” ÂÆŽ0ÓßqåÖ…ç©Ú;ÿQŸNpD絺Ω@fÝ^C=….÷Þç‹7,ÈîÇú¡«RQ”@Üds%i(Ùß·%yãb„—qÈÓøIn xËÞ»mXˆÓÞ#©Ö;$VˆÔÜ\¿?Õgƒ5»uê£'„ÙÄêÁ€ð¶¡]¯úÓfbÉ÷ÝÑY5$õ½Û×YónSøàìL Ѥ«a“Ú!¾8Ýãæ%ŽÿÝ«õ"µâXLµâ1—ÁÅv6<NAiðÝoÄB¬Cj {Kƒú°ß·v€áºi+ǫGWn§tØiM=àN¤KÁÂ8fSUžLaÃ,¼{ÿá–Jkú GÚ7²ÈÆS#©zÔ^D¨ ”ÞS™îìº\-ŘÁ/ŠTäoTG‘KêÉ뺪ègÔ{Oqs£ûëÝsæBopâG"fбhc–MX ºenÉÓ0½7½u”ò8y!–ÖQ¥t„#ðuÀ 0 ÷u¹â„Å=v”cÚ©•?†èé±sq]úLìgxN™†©äSc颱tVž å±iMŸñÚ‚¥c†½¥>ÈËž©,¥<€fàÐ^Q¿ª tËó±GŒ‡ñ4MF1ÎODIÈÀ*㈚O­?ÎÀPÄßX}8 ®ƒc6ÀÜMó±$Îå‚#+]ëI¦å¾—$ô?¿xЈˡIÈPÄr) !Ò]€ùL¢“˜€I80a+€éÚÒ/ˆ¢ÄÒ™½'0mòЭÄ*Ê~ -\=zfh|•·~è{YEÖŸQ< y4Í×&ÀÒ\Pá:ËfƹñlÏÉõ¢Ç'1 ¹Ù_}µ¤;à¼XŠf"x·—Y¨ä µ~d'aÊGVÈ–%—Ê›/ 9°R£”KJé- YYƒór¸Àžû‘3,k3ÎB1ò Ú|T™1x4ŸÅPJeA€!•ÅdÅÉ»~Œ¦¨Ú ›r¶ HÔGäǨnŸðUƒ,@Í.\2AÂÕ4 J8 ;ª²8SKGϼ­+¨óá—nØi˜ºx\.y˜ò^¦Uû4NÞÒÒtí‚Áô…lăÁv ËáÈ~J¹M&>û_OrÁ\ÑXsž0Á, $œù ¸Bì£Î ¾9ûu,¦nh‘Qh†i_ë#UtÓÛlea2Oàì4#é$ÒMÅ-í"þ[•} ‚ÃŒÏHˆ×Ôj/œÖ/7»Ü䆾ËöÆ€ñ'‘:eª ¸üüs .î€EFÍ2HAØüÊdjß^à›Ÿ»7m­ë3U)µ«Ì&§:2núkd¦dº"qü¥&oPWÈöPuûM0- oZLI/sBûvÓ5.„нµÁ¤€žúçŸÜSO&k?ÚJX¸XhuìÄ-Ð@î^˜|»h|2UÏx:Á«Z Q»ç'R¦/MDÇΔÑÌç¼^5Ýng~YŠtLE úF“šEßÌÂ,Íæo± Ó„O4ÿÿóØÿ,èeb!èe˜é6TG<¨Ž#^ ß¶Ôî2òúhZ7Ñ&úð’õÝ™ZœùÁæ³}w«¿Û:ÿqOH>bûqòvê_¤v•%¸ƒ{Q'¨é+5‡ÜµWÉ쾞%P<Œ"5€˜v"Boy)VAq'°¾/œŒ£˜T›þé–ƒSƈÆ)1ì_¶d£|'^c[R;l¹Õµ›ð`Ú•4}ì32¾ÄÁe„W¶Ñ…#=™)§_èÉÁ†-…›Ë7ºá™“z¢ƒÒg"ïÕ ´êvrºø5Ø ‡^Ú‹ò ”Å=Fše[q4@Ìže+‡Œ³y¼S˜¦ñ×:4ïjוt—G™Ý,Þ½ˆÚ1ÈP"¥¾ðÒnÁæ_Úá¶²ž3OÃ{ç@—•À6Q‰çàZÆoãöÉl‡ºcZrÃo{¢ì\zaq·ÝòSHŸ+ÚMžE!¦ÙEÿ‡Ž¸9ã+ö⩦¥P@ ¥·£ëB7mưjHoî¢F„Z ;ô²`KÜ;ºN´àl)\šl—lËA9R„5ø.ª®k9ÄuSþü\÷ç&_¼·c€]6…PvÑÀD$ç°ƒ^âEkN…“lìR‘ô`ƒJwá±è[/ÿx?üµ%ü¼öÿ´ØŒj$ŠMjtÀÿGM<„ endstream endobj 100 0 obj << /Type /Page /Contents 101 0 R /Resources 99 0 R /MediaBox [0 0 612 792] /Parent 103 0 R >> endobj 102 0 obj << /D [100 0 R /XYZ 90 720 null] >> endobj 99 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F67 66 0 R /F55 79 0 R >> /ProcSet [ /PDF /Text ] >> endobj 107 0 obj << /Length 3011 /Filter /FlateDecode >> stream xÚ¥Zë“Û¶ÿî¿â¦æ¨ÚB |µv¦ö¹µIœÎøú¥q¦ÅQĘ"’òåú×w»àCáõlgY­3öçSùqÇ©lºÓ¯™ܰ ú½¥KG±©’|kù©/R™zw2;ûìA–:ÖãP ×”ð*‘{ÓÑèÍj¥õRñ]Ij_‹Õ:£àMOSMU58pËKï°Óœ¨Ó7´¸;†°¸(·w<â/¦Bgz~g§*NædL:ØÙÚ·vÃO±$”<2iY2Øâ9NÙöK»5 6ðtâȨØÂi2ÌD&3¿Õ?ÀŒmÑÿûµéöK'™H£ÁšÝ]é\¨Õ<‡ÑäS<½)ûEKʦö X“×ÞÐTt8ê¿Sz˜æ}(µå=N7=uàynß–õ®£N¿§ñ4¸-ý„zdêA´ø\Ø6¼È´»ÓMÀïÓøýH¢XäJÏ úö™SÒ=µ¶§º`Ü…ž©ynåg AOñ®Í‡Óqi=Ý[]SYDlMÝ•7v¦¥N7¤k|hÆÁówWoœÞÐPW݃àK:šƒÐpƒô»Þ2©¬i:qLÚÒX(@«S´QPÔà ׿mzë—>{Xüüí»7DºZbÛßzQ«u*"9 _Ù™ª>–tMƒW‘ƒ®¡ì—€p4”ãn»Ö÷ï¶ixŽ>3]¥‡ÍêfÙBpšƒ¥,‚$º!–©XzyÅa`ˆàŸ‚zh#î·¦IýÞSÜ“°ÝÊ\Š´Šæp4­]ƒ Üõûn‰-ê ¿#S&É\…¯h/@• B°»[çwÚ ý)®Ã¸´mü’¾½$Ãv†j€$7j«e× ¯Kã„C=‰pù…só:€-˜¾iQâ4€C±‘7emzRÊT EìcÆ¿(Q÷`~"¢Ñå¯ß-ºy–ànˆ“÷î Dïìx\$Âi|Ï[£`ðchD>„ä¸A$y‚N½¥ád'l21‘M ʘ²æí ÿȉޱ@¾%ù\Œ¶²“8Ångk[Î;ÈR1 ™-?›¢èdÔ5Å Þe³‹S‘|©· ¯ï1ñOöÖ¯8 Gñ(‰J©pªôØ%MÄqÈß;O³‹!‘NDœMAè>u$’p0ö1Üw›7tg¦íÔ¡iDôÑ1:ºÿ2ðŸ¹<«NðSl\É¡žñ>•ÒHzš†Æàž‹·èË> ¬:CØ4-ëg›åèlÝ0×ÿ9€õø|39ñxê{rqSÀŸaà—S(Ö%)fÈ0ÞÌtð,ÞÞ“è-^:Åš¼om½ãÇHNp¸êuòþÆûói–ä,ò]$½ÂT,’f&}î õ4‰wîÔC)œñ«š?<…LXßøýŸQ×+AIúhß•>:WžÈAĦŠ#¾22 ¶Ü•‘8WW Œù¶ë:¥Â-[Û•KIJ^RÎÞ;®Ei'qöµÖ5õ‡3Tù¦2é ‹“A|?– ŸþôSñWSŠCÙ »9}ý°ùûxN¾~6Ø€‹­N›e”>Öñe`qÏc{Ún©C/¤´°°]GÉ Ð»»®·j—ÃWšE>Y®Í‡B‡C-÷)¹±_ ٤¦¢ÙŒ+Îve]“êà 5óiá 6=ÓÐHðµ¡ñâû±w0±äšaéþ—¢@û8)äØÁé´ÔrÍ©ëy±—vz_-ÄΠƯ!Ñ1½>aø\Å™ÿ\–ðç²tò¹ ‡î†\ô>Než@Î!í?!¥aYÄ_°¿K„rÑõäã„ÿ,†ã]2ÄaeÛõ>—ÚV!{ŒÇpAyí£žDb¥ñ áä÷¾²(žÝ±.¦-ÿ5‹À ò,Ÿ½v¢‚[Wý Ùñ,“—"‹þÿ†øgéø­‰*Ó|ûtP üˆ&N×ãtV½…î¨éÐøK0Öí ×ÇGD*}ä«wÎvÝ¡msÚíGœì ÃóïóþÜ‚^cϱ¾ï¯)¤Š§uK_”WøRýÿ‰Ôñ¸ endstream endobj 106 0 obj << /Type /Page /Contents 107 0 R /Resources 105 0 R /MediaBox [0 0 612 792] /Parent 103 0 R /Annots [ 104 0 R ] >> endobj 104 0 obj << /Type /Annot /Border [0 0 0] /Rect [339.177 523.599 514.727 534.508] /Subtype /Link /A << /S /GoTo /D (Binary Strings) >> >> endobj 108 0 obj << /D [106 0 R /XYZ 90 720 null] >> endobj 105 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F67 66 0 R /F54 80 0 R /F55 79 0 R >> /ProcSet [ /PDF /Text ] >> endobj 112 0 obj << /Length 2530 /Filter /FlateDecode >> stream xÚ½YÝoä¶¿¿Â/‡Ó•Nü(èCâ4IÓCßSS ²–»ËžVÚPRl£èÿÞ©•ÖÚÚ¾‡Â€5ü’¿ßÌp–ݤðÇnÊôF ‘”²¸©ïR_ûåóR âYïîÞ}ü!c7,MÊ´d7w»ùwÛ›¿G·‡ê4h»‰…‘øfK™E?™ý!þ¤ÿØð"Ò µ}¯ûÚšÓ`º+dÔí¨áÇ_>oþq÷3,Äç ñ´LŠR‚^nýIÛï·Pˆ3–°R…~¬ÄNïþr7m*ãü…]c—·2aBÒ2ÿ\SY$©z¼ßêi5m±¬i÷ñ©ëš¸­Žšçj>˜‰")Ë2Œ?w»Ø.(¡Xèõ»ÜÄ,-’>"a5|Û4žþC7’¥ÑÓ†«¨ñzÊhè°’EýiCµ®Í M‚[ÞIxM‹¦=|YÔnXä B58qKÜn¡vOE\¤ˆ:úßP]m5ŒñýïQÑ™¸¥Ôï†Ñv¶ºn*[x2–®ŸÎ‘MHx2õê rÏ'èæû-ÍÒÎþ YéßGóÇ„ªÑ-*74O›BF¾ÙDÆXÔ^Pˆey"Ù¤Qüëš>€_™e“>  K6q©òèŽJaû»jlZ•®«MO×Ï3È,–Gö"B ”ˆÉ5­2•p5õý r8hkÆ‚çËÁ ºfmfp]6½åá; 6 ¬8TýÁ7U÷ö?õ4QïIqçi"`+sÈÿ–2Ùh¸#ÉÊèÁ 0¡Lùú9d)°({3Rp¾ªÝ’àÍ‘ÁÕ<´—ˆ,×Vgiž¨â¼ü¾éî«&v[_ÓCI@ˆ¼ÐcqX1AXò4@8ª8`D&‚‹%Fæðo4VtÚ t3c½º¢HXÁ'tÿxÝrnšÝ fÞ:Ç6ñ¶ ‘'Àš `³à¯5·íØ41AºÍÒZàb ¹<“ÏV `ûåó§O$…i¡(ûAW[jqƾúx‚[È£]gW;}qÛ~"X?!a€ºÓÝX£ûdÍ&±§ÕÛ±Ö¾@ÐE{DæP¡}Æ“o4G½Ôüd»½­Ž~ð؃Þ4¼ò[9TV{åso+ëÕ¯;Ò¯2-Ž™+HúއÑjKæ‹5¹‚­oEØ‚Š÷ã@å¶óBÕÓ÷ˆËŒ5š ´`CË´ÂÒ±+´ãy™¤Ù[YˆEf0àÒp±®~ôV¯í½]â%KÊüR!Òé(ѱ³žcƒî‡LJ 'ÛÖ¸Óƒ§ÀÌŽõ™nqh°cë‡Â]zÎeaÄ×Ä'€¿¸²¶zúቇÀ¿2<áI¡ÄõE”   À÷"@Á‡n|€" ϯyÛ pØ7†èy¢âp—C#Z!›ã%8AÆ HùÝ1`Öyä<è’å…3jX³nö9DxÓà™7¦ÖNQfIÁйóe â¶;dôËL,½ô¿XCq tsþkˆ®eæé†À<*yAS–LNNetÊ®ÎËÈ)»ª³¼¢{T‘ö½½k<““ò(¯ó\V®Ô›üKP$¸BTOíw¼¯• Îy=ìϘç9SlÖ—ÙôfŽ´›™­à¥÷‹â¹_Y’¢³úzšÃÆ÷Ô¼Nt Pàù×a¡–0š3]¨Ó±€LÇoïáKLw-ÎȪÀ.”Óms×Ebºó°X¼dúb(ÆšßòT/D¶`ºÌe°:9…/Xs…é<Í„\Zê*6òE˜]DÇU&®ÀÊK¢c Q º9¢cóîØòŒèEæ4» ñ(b‘ósü ²‹¿óàï@ ª£4Q]€}q óh¥f¢ûbìMæ×Ü3<–òü­t'e<Ý2×oB¥sžCôÊÙMÿw¢¿:îáÉSþ¼Fé¥;©»±]õ:.å¥9K˜¼ÀËm@CíËp¿å2ʃâ-}\°§(ØÃÞ}éEBµJxX¤rÒ„v¶¦±(’\ç-,ô—NÓ÷6B-šùBå ¶Aõªõ›ä½âb—•óMùܨÀ[>j|&ã Ú…Õ“‘—"„åP[‡z/€ähª¨è÷àsïZUtïάs/Xœ‚vT¥õóô§ªÖ+¶Ë"úít¨ˆR>B¡ïÜL ŸÖ' ¸Q$*÷hzTF9¬®ì~<&Ö8åñK; 9 §àôWxËš¥V÷k!Ô¼œ}VFǪ¥3]{œC®^wû\­ß~O«T.ÌÎf~v™q}‹ÕEäíÄè{¹8ªÙrŸŒ­-Y$3®ê ™[/ vé xŒh³PÐ í N¾ƒáBü` ½ðþXDýñËé3ÓŸg"Ô2eIPbù•UÝi>GaÌmå_-kö©„HJ½â"!j8;AdªL#=ÔpY*e£Jr‡¬@󱪃k­Iœ@åJ·ô©»ãÉ4Úú¡@J÷¤&kuþÁY%’ly?á ÇÜ–A‘¢‘4À´ïõªYìï7ÉבœP|ê3o°ÜäHAçÚÝs ðd<÷XÇnÆw9a~ÖT¸ŸHèÊËŒÐß´ƒú¥ïº~0õŸ¦é¬Ù›¶òÉü[úøäÁóW諽VQLL/Ýxx:­ºÔRÍááý’ä‰*/”ÿÕê…#ú‡à‰ÝïœõO)DZ6»³ñ/NªZæ°OGƒ§AÝ88CŠ•dHÝ}e”F¢ùéâ¦|ÚŠi4»Eêm®‹Ë0žóeènÁ{] ñ2[_ßèÝÿkóƒ:¸4ôèGk!tÝúy®$Y8àÙÙZ¼ÿ÷+^.g®®<åD¢²ótÿyÅ/8¤³»Æ¢ý΋~ÒVûöÔ¡švŽGî0 `&Î/œÐÎVûYT &à¾êÃïm”V¼HÜŸÀšnô–[?VpO!ßxyDÓ™‡߈ÉPAÓNWÃhõ7á—Ôÿpb´« endstream endobj 111 0 obj << /Type /Page /Contents 112 0 R /Resources 110 0 R /MediaBox [0 0 612 792] /Parent 103 0 R >> endobj 113 0 obj << /D [111 0 R /XYZ 90 720 null] >> endobj 114 0 obj << /D [111 0 R /XYZ 90 149.112 null] >> endobj 110 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F67 66 0 R /F72 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 117 0 obj << /Length 2178 /Filter /FlateDecode >> stream xÚX_7ϧX´Xܸˆ•‘4›Ã¹\ÒæzÈËíáš"•my=·ãw¤É®¯èw/)Jã±WÛ-XKERù9ü*…?~U§W¥”¬Îª«õþEê©w/¸-a9ãøûÍ‹Wïs~ÅSV§5¿ºÙÎEÜl®~LÞîÔÁêa±”R&òÛÅ2Ëòäûæv·ü—þ²U¢[Zû‡6ë¡9ئï%ý–¾ûøŸÅO7ÿEb®H¤5«ê ìrznzØz¾3ƒçŒ×eà)2½xw3*â™S#ÇãcŸYÃyŪ«¢Ê—iºþ5„%—ŒçDüºéÖí¸Ñ š'UÆèÁ²ÝßÎX9ñ¾ú†¸nv¡‘ÑkòNÐ?ø»îƒ¸ÀÖt(Uoh¶iØÖÚíidw~[?ÚÃhM¾y3vÑò í8tŸ÷}gwŸ7êè5~JóÔØa\{6·îº±y9©¶~nµ:|>j5Ànþ:â¬ëßb¶<¡çWï¼âNíõë µÝ¸_éá’Š¹¤9ëf ¿½Žs}±ûªÕp„#ó¼ÌîÏ.Oƒ˜¨­^ a¸3ž[TaPǶíÕ°Þ‡(Pò3ªh cŒ2¥„–,… Æ^ Œaü_ׂ8a ©ÉûE-“~Ø+ð„Smû?èãýB XÛá]·<±C£M,!yy”A%+B®Ü`,ʲÂï;'§„«€°¤á§”g­gÙNF” „OBR v#¨X9@ìmÓiC‹Q€tçp¬†°Ú3ª W9GO5òæëF¹”rvéܺœÎrr.œ{5ZT™ RPLj™ìöœu´fÆÃÒ²ÊȽ’‹ä ÑÑb­œf}Ût]ÓÝí¾ÁˆÇÑÏQXÌSVæÜ}»œ•bâø k:úu¨€Æ¢ËãM]÷í¸÷ ´Î4= Sp®È%"/XVeçAºî÷{M7ƒ8SdÉ;ÿáhwîh²”p³mÛ#ù~"Y ?,/KVKñìa«ÙaQXcüïm׃ý+²’Éxð:{úõl³Û±·Ó÷!4*ÉŠâÜ x³pþBdxײÎü]KH­Ë»FÝ5ŽâÇ—5+ewýgî…á]£r:H=»kœ„»Fç¨]A¿}xŸam£×­T Á`>I^–t½ É’³¬gÙâsk=ú OìÌ“ÁÏP Dò–Æä§Üç‰C´ [À–à3lÉR1‹è”Ž¬Û ­ 0 Q«5êØµë»eÜÒ%m:%gêó6©Ö¦hxš :O¦—n§5ºÝb ä"ùà¯ÑÇ8ð@‚nÊ“îI¼qÞ ±."Ì­‚º+Ï· -)ú1ÍþàPÆøXbÔ€»L3?Äëè#;ú{_C?v>Ý"Ý“òä—±·!2€Þ¨;ãEºgm˜l‰¿ñx.²¯7e8ÅnX¹éÇU«—¨H£èLžÖÞ«9ú·àÁ¯œg{cš–CÈêѸWt÷w¦UÆ“ "U´ÇÁ9PÚ†.4–YZ0ɧlü…àWÑ÷/gu>!¸#" •‰Rž{E ™E«ÜœUòerÁЬž›÷ ª¨,ÃÀÈè9øÐa‰Q&†å¼( m•Á˜‡&Ò)õqf¬üp8½}8U–ĹDAÂ%üá"¦%®ML˜|^á™Èµš G—#g²ªÎrä~×@”Ԛзp§!$„˦ÂA?XŒ–´vI è(_ÍA1;{°ž~A„Pè޷楮Æ,’8êü:ž5’g¯ñªUÝÝKj¥ ”cjá:š‚'¶´âÛáâ© ÒYL©º´O¦svÖnûà]o@ᾟõƒ{ÆëDÿ26°øe‘ÃÓz¯·.ïGõœU9T@bꊯÉÏK{<è˜}E-bqaßÜEÍãÞŸèÙó>ódÇ.¦ŠÔ÷€9…yR­;%ýfêM]jÔg3 àÚw/GßÑR#ï«»7mK,‡AiúÑ„ºÌÕ8Ól­ö¬˜Q¡kí»)‚˜¨‹ËÏÓW&É D"¢²á[ ßœÖln endstream endobj 116 0 obj << /Type /Page /Contents 117 0 R /Resources 115 0 R /MediaBox [0 0 612 792] /Parent 103 0 R >> endobj 118 0 obj << /D [116 0 R /XYZ 90 720 null] >> endobj 119 0 obj << /D [116 0 R /XYZ 90 538.58 null] >> endobj 115 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R /F54 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 123 0 obj << /Length 2060 /Filter /FlateDecode >> stream xÚ­XI“Û6¾ûWèâ2å²`bã’[ÜIOœÊt£©9Ä® š‚$–)Ráâv×Tþ{Þ@T£—©Jé ð¶ïm «~t•Ç«”s’‹lUœ^ÅnõË+êFذ™íø°}õþZÒIçtµÝϯØîV¿EWGuîu»ÞpÎ#þÝz#„Œ~*ÇÍ/úëše‘®ì·tW´å¹/›DÔìí‡Üü{ýyû3bsB,ÎI– àËÐ9œu»wû 1J ÍÓq£¸éÕ[/”dì©qDZSà†“È8±“LÊ…%à %|½‘ ‹>ÖE5ìÊúâ¤2ú~·+QHUÙù•ý»^ç<ê?u!9¨òbµ¡)I8·T¶G:Ê¢æì¯äyÔËvg?tº5šEªê»£hÚVwçõ ÐÔ»5:÷¡j:]ÝÛýwe÷×h+k03´|šûf¨¹²™Š§ŒdÙh}¥¿ •dÜ£àÂÀEZ µ †ãfómÙ5uðÆ Tåï$€=Ê£ï+Ð4êõ·G1rmþAo9µ½ƒ™Ì£®Wmo ˆßTïΣòqáSL…Ñ=NþÄ*e$•^¯_ L‰rÜóÆCÍâ˜ÕõÎ1Ä›‘eÇ„7¢Û,Ø+ëóÐ#Á†ùR}È~¥AT§JgÓÒ€VïìÌÚ½½U}y¿¯Yj¸°€ÓvpеnU?žk†i›±%ƒFHxt£ú¡•Ѱ–ñh¤îöŽ\Ü#ÝfÀè‚8Ħ€Ø®¼-+Ø “{#Zìd²"Y¾8(¥ZmÃIT½]uÜr@µq€ŸZ¡TY[¸A†=bYâè'4šœŠG㇯k)ÁÃJwòŠX/ðɄ [>J%þƒ÷µá‘ ѹR…[Ú•-ÒýºæÀ@g×öMk>H¦rN%9a©UYït݇14Ÿ\%€Ï Ë ØE 'ÁGD[î-e'w¨FeÄ]1pÍ-l\i¾PûqüXŒ§ô“†¸_²Æ#æ÷¡e˜ º"'"—Ïf œåùDÙÀ/¼%N.¤.MdQ§µÛ`G (3Âbö¼„ž£ÖÓÌw¿º«ß ´ d§[W&'.p€W0,Q°dÊó„%Ÿfß äIöÈ}À¥þºÿ½à:˦ã÷6Á’qíŸ/¾Ö{ ÀÑxŒÑˆ @Ëå´¾mª°r’Åüùúb‘dÞ82.>êöÜê^¹hëÍÞFb.¡éE"³![R7Na“¦˜ï[ >ï¶MðƒÉQMÚ®§3·uºu×uÍÉ}½T®™p‚ƒGàÊiŽö¸rAx™7þ饥©3Lì·‘P_er©ÕuÃÉ–NSàÑ©é\,· §£µË6©ͅ쾊A(d$3!‚\Ö«tQ©V¹G2ªGt‘lèè—«_}¾ÄƒE³ÓDeÁ|yô)Xƒ×»¿èû»¦Ýu/8àV÷OÕŸ›‡šòøC-› ß •Ïœt8zu&M)â òöãÍ?Þl7¿^_¿ QO2’²dîßp¯ `ípØ0ÃnÂ÷ó‹»‹ætÒÖ‰]‚WîßTUƒ’ßaÊî¾ ª =%N_®\ÿÖÚp!¬]y0àßÄTož"ú léÿ) âüï9}çOx©BÂ^uD7‘°™W°œ@nv5³ݯ±†RÎtxM{2ùgQ»ÍŠæ±!ÑV€Ì§°jz1_áM @ÙL$}¾ »"Sèf™”¹îü_®·!4f®‘D¤Ç|‘!Í×ãˆ{œØhóEÑëWöo^\ÃTm·©UÛ9Rõ♺EµîÛ;`êßÚèb3…ï„gFºÂ¾BÎle¦ <‹p_­$Òû‹-…ª*ì:ƒqâ»·£êŽÁB …üÅŸé`#ɬÿ‘û{§ƒI4a$ŸjP(¼DŽ=|l†ÃÑ2í#0NNjê‡0,B;=w†“3H¹7í½DÅ—æa&‰ju2—¾éO ~6  AšMm‘ýМ¡qC5£u hÆ#3ýãÑVÿ1”¶rÈÝaØ.¨ö0øûn¤ð@HàP¼ yýWzqTî¥i òr±9!tªèàÖ`% -2kË›¨˜pÌŒZ@èJ×#6Ö3ÆNª½ =/“ÕûsŒ’˜úÒ n25Ïçu@bëìˆEÞ«¡êíd4†ã±mú¦Gõß;Oììe #ìL¡¿ã—Ø"émÂ[ñ XIM;g.¿ývõÜH•FŸ'mP’Ki#¦;éd —?˜~#0êÆ fN–,«r¨›¥·á§XÆ!e*Ä„ À£«D á$I:ç/¡$‰“‡ YÜO!ê³H8Ÿ‰‚5Iéú߉l^úL¦N–ѹ 4\•Éšx¾ðôèài6¢ÙËÆGX>hÌLh 3ha¡‡»0|S"¦¶î‰ðsòö€"ô@Ck‚L”[t Òó:œfã ÊàØ,Z=&Å,º5ÀÅ1ôõø^ižÂ–ÙP)ˆ}Äcî”ƽϙ7ÌC—Iq€Rvã^K¡qÁÞÂgŠ%,¨„pÄž‹0ÉüáÚJÖ»èžd»Ò§a†mÖh«o6ÉÒQyŽcU¹Íã z)›ŠrJÖ óÄè> endobj 124 0 obj << /D [122 0 R /XYZ 90 720 null] >> endobj 125 0 obj << /D [122 0 R /XYZ 90 720 null] >> endobj 126 0 obj << /D [122 0 R /XYZ 90 617.099 null] >> endobj 127 0 obj << /D [122 0 R /XYZ 90 217.259 null] >> endobj 121 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R /F75 8 0 R /F55 79 0 R /F56 128 0 R /F67 66 0 R >> /ProcSet [ /PDF /Text ] >> endobj 131 0 obj << /Length 3257 /Filter /FlateDecode >> stream xÚÍZY“ã¶~ß_1/.s’B\<\•{_åã!ã'Ûåp%¬ÄZ‰THjgÇ¿>Ýè ¸3—«Ró@\Óh4º¿> y“Ÿ¼)Ó›\kQšâf{z‘òèÛ’[X°™­øâîÅß¾´òF¦¢LKys÷fNânwósòêP×Ýn´Ö‰þìvcŒM¾®÷‡ÍwîÝ­*w¤¹¸~ÛÕç¡n0Iû†&¾úá§Û_ï¾…Ô|#•–¢( ðå÷ÙŸ]÷†×-RR YæaR¸èÅ?ïÆCY¥ž85®xâØR¢¸É #¤6´S?´ÛÁÒ"©ñLižTÔ=¶·8ú¶:R¿ª¡ÞR»êº åòp[˜D€¼t–ÜOö=ÿk] ø»[›%ÕñâzêÕë#¯¯yhÛ6ýÐ]¶ãÿÔ·2inUžÀÝ4Õñø@ü½Æ¡‡˜¸áâ¥Ò>!m­D¡tvÕàvpŽcE:Íö[çË@ݪç/}FIà?Í¥Tèä¯ä»0}t¼Í¿£Š¢KQf*ðt¨úÃo$¢ÿ6*×~ ò·e?lй£#q7È€$n@KS‘Úœ%$ùúa)É[•&9û£´}úÝÓØ/©Mkáü+P‘]½u0ÌR÷÷ÃOß}õ= ›aÕ`Vä©Y"ذÂjöŒñ‘W"ìFo0O…,ÆÐw³]U"3»6¤6*‘ÉF%²%Âé‘£%Ê…T#ýO¶íé ÁÅDÜlOçG%Ÿ¶W=R$cR 8Ù´5.½Û½ŒD­èä›Öp§i6r|Â_·MZÿLŠ>p¹Ôå;Õ ÜØú^Ó°Y ~døÈs áWYd×>Æåëèm¦d ¬àÎ7¼S<ȵóÛx®FµI#ðüKXÉ“ qzD>­€AuˆÅáN¤ú£u$›…}¬# xBÁÉUÕ)$cS‚¸¦ØdþX)t_ŸÎx¥Ø~Má2uª†¿]w‹ÎÇ'Mž«6îßò)-Z»õ‚´Q5^ûgp}ØrG;ì(+r=_E¦„«Z\…·D²Æ…hpSOŠŽ¯áUG '¬’r]ÄcH‡@:ž(%Aã;Fͽk\ÇÙ(̾i»1˜À:PÔ‹`Ì‹8dãh¼f|® Ñœ5³$Ù›óG£îǬB&=fŸ‘d ÈÉõsuôy9Ð7…]ÏÓä7O8[Œ>ç6J;•¢(®¼ã÷1$€KÏ E––Ÿé6;‡IFŽ1$7àM¬šÙ 0ÍíЙ¾rj 2~ çG1Ë2{®þ5Ŭ3N¬À¯Ú¡:núûzØ6Xp'× }/Áß嵨 uò#AjÃ;þ=Æ ´“…þqV&®.ö+6'°1P~I´)¥²ääCTyÏË•PSÚ@¬E¯2…žå Ä;•4ñ ±Ë`“-õžâ;€žÐjü¿j©Îg„ö¶¢„Îóž./Še‡ðǯ¶[4 ‘LNpk¼P—Žz¯è³E”_XCñ£û”À )íܾsŽVzsÆ/Ü©þÝ»@Œ§ý±=jÂäÉ8’à äa®Yî\9ý¼èa’þ„4mªØ!ÊV=Ç܆?ÆØæ‚.cdÂXÅw 74ÄŠÍ}Rv~ëT!‹-Õ5´<û µö|t¦üJÊæWRNÉGº–b™BdSñY)Vöýɺ©ºÏ@•isDµá¢€ÈX_…s^4l“¹æÂ!4ÚS= rù°„Œ†wîMºÅ‹¹ò…moQ9%n ÂØ=Wû‚æc50‘*ÚbÁdT‰íuuå Ù,äVcýy*#ùmKwYÕ¾ÄHl…L5·™ô/Cžhi—ž~h÷Ž‚/ˆD@#|«Úí|‰×׬¡ïNç!«¡K™'¿—°P¸cCèd“3’Aíi%{s;GCíÑДÉLÛ½'Ôu]°œ$f0Dب„òÀ®n/= Ô •è C(6Ú ×í¶ƒ‰ô¸aŠ0POÄ vx\ ê U<  ’ÖxˆD·ƒ£øÔ­aŠlC%®=%Qu ¥úú,H…hºö!g7:?®ÌTË…³ªmWy6¹:\%ø­^^‚ùCˆ¨M¦øý¼½)9˜ÖBßnl¦’Ÿ|ä–[‚zøRLžcÆ¡%%1< z y?µ‘"È`оî¢f…5‰œº‹È]rÆ…³Ì΋¢zýQSѱ úX $w¬+Ó÷w×µÔšçÖØg ™w4|é/`RdŽÜO‘_{¶3hßbÅåMR5sÃÃNí'MòJPÿλRl\Õp“ª…Ôr´þªªtE—Ù`:ØÄ°ûÈó‚ô0E‹hó ¢àà¥au€åB É—\¤ð&ÇO5±œ€_gæéZl™Ê /÷—)DâçªïýÕ”vzŽZèFYˆBÎ×¢õ0Ì#Ǹ´íâ>S¤ªX¯Ò/=f.ôã¤ä\–§ÉVdR-1|¡zcìcà>>¼屺ƒÓëÕ™C*1½=³ºCqq®DŠA•O¹‹YTUf–•+ñ†)ÁðìG–ÚTþ‘ £ÀŠÕš  Åùrµ° ¨¤ôª "ñÇÅeôÑn™q½'pÃBY±Ð@¤ô*\¯•&[1…4Ÿ^|ÜG5ç ù ß¿¢„A2à4_ÔXæ¯úÙ¢  ç° ³ë° ¾q,¯Ã²ô¼ì¾>i£¶ Y™†{ÐÅÒ< £q}ϼVк~ˆ 8ËÊgè¾™?kÚ1>.• «#•RµnKѱóç‹è—K‘™š•ßP’vÁ€ª(ÃECžÿà*€ËyiÁ×-‚»÷+ü£˜ŽÙ`Áç×OVÌý®$›–…°¯êžªt!”Ì®í€4ðí„û_Bè4–—ÞH›©`8Šg½^ø¿‚×ñÿ ¼íû?¼VÐÊ»TÈøËñw=ÐäotÇžzz Øâ‹Ð&Þë¾mðiSI†˜‰d94áo7 +ƒ&ÙrŒb°}{ã÷™ë‡-G{Ռڂg/Urßa‰qS–RüßñUÛLø=õ«ècœÌSЊѶ‘Ú¤iº”Sl±äþ#±÷+Ä{|$< «Bclc÷:ïåç$˜ù@Üm¬ÐÓsÈ:Àk‘MÖáž 5XQÕË §s>®µì™°q¬C-ÙŒ?mz NKI.6¹!;4«³ûüØ·(‚‚ÀRe [ÛªwaŒñ׫ x CŸû|e'pÁöÅ_ÈM±°¹yrÿ§>e!nFÞͧçzßàOEø™ÍÄjeÐ endstream endobj 130 0 obj << /Type /Page /Contents 131 0 R /Resources 129 0 R /MediaBox [0 0 612 792] /Parent 103 0 R /Annots [ 120 0 R ] >> endobj 120 0 obj << /Type /Annot /Border [0 0 0] /Rect [371.046 641.955 509.319 652.864] /Subtype /Link /A << /S /GoTo /D (Options) >> >> endobj 132 0 obj << /D [130 0 R /XYZ 90 720 null] >> endobj 109 0 obj << /D [130 0 R /XYZ 90 278.072 null] >> endobj 129 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F55 79 0 R /F54 80 0 R /F56 128 0 R /F67 66 0 R /F72 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 136 0 obj << /Length 983 /Filter /FlateDecode >> stream xÚ•V_Û6 ¿Oôe2pÖ,K¶ìímÝÚa(ÖKŸv{ð9JbÔ±Ëéí°/?R¤ïœ4@Vp¢EŠä£Vü©U­¬Ö²6Õª=Üe|ûùN1•‚@ºøi}÷ý»B­T&ë¬V«õv©b½Yý%Þî›ãäÆ$ÕZ ýC’Sˆ_»Ý>ýà¾$y%\O¼Ÿ]hÇî8u~À #ü–ïÿ”ü½þ åKCyV˪6àW´³;ºqËrgåJIUÛY.×(t÷ËúT‘ç7P£ÄW°-xc¤6eΰËÊH¥ ™ÑÒ$iQæb¤Jì@±F¼õÇD+ñ<~$&¼.)œÉâãi:ž¦k¨ÁdmÌ*UµTyuºVÒšbFÞ…$Í«Bœ† æÉ÷|¸'êÌEbÚ7‘2bãñŽŸ ž%ÚæÜ,Ì„'‡#}éáæÔº kÇD?_Íb @´½™Ås(“ŸõF—¸àí bhea!sJKUÐÀ*1º•XS˜+1º&Äj£ƒ'á'ŠÅfpH· &§¦øúg¢Â¡é{"kf~Ú²N÷Ïti§õ6´éF×N} @%ﹿýájK™C Þì‚J–ºœÅ¾‹nYüilÑ-ÆÔŠ þKnjΊæ1ò=E KGß Žµõ~ØA9éÊr‚„g3s`¬Ø&Jø‘hÎ^7ìX¬Û ÝC¦LÛPÙÖÙ Êna ñ«óð@²F·õ££™A¹Ã!‚¹K¨Óà3fø±˜‘hèþ÷ múñ31›€Õu W¯¬4Uñ‘CÚ²"ëxα¯Z7&iö-xP½DÀÌ´ÂÇ$ÌTÐ¥$E&‡6QÖBhJ誚L~DÁrÖUB³b°ènAÅðÚ|ÁžËø½ŒWèÀõ^V$ævDt.K¥g±‹Ž\€HÄ»êæ™ÌR•<,—pºg%à/aî‚Sg¥Õ;è}wýZ'y=°Ú¼°šŠ™ }bmÀdé¾$ÜMm-âÍ5ó†^ oxý¢–|‹¼9åg|Nùòí'ù§¤›¶Î͸-b?\™ }ƒ¬',‚q¹V±OR£2ÑMˆsE›ÁdµS3XdãŽÔÆo°¾ðŒ¾~­%¶g”Û^ÈEÌ¡„…÷.©tìwd|à7Áo§è6þk K`Œ«k16á~™(ØJ£ §ž7ͼÑ^wÖËBº²™Ìµ ø¢74~Á–ÙðS7í/t¿Šþ¯ í}æîyÞ„‹Ææ ¡¡Õ0õ„YjxV›À£Hã\½ö£ Îdnõ7Ž"9ÿú­Œp endstream endobj 135 0 obj << /Type /Page /Contents 136 0 R /Resources 134 0 R /MediaBox [0 0 612 792] /Parent 139 0 R >> endobj 137 0 obj << /D [135 0 R /XYZ 90 720 null] >> endobj 138 0 obj << /D [135 0 R /XYZ 90 720 null] >> endobj 134 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 144 0 obj << /Length 2468 /Filter /FlateDecode >> stream xÚÝYÝoä¶¿¿b °ŒX¬HQ_ú฽ÖiÒ+`¿å”–¸^ÁZI•´çlÿúÎpFZi-Ÿ]$OÅ·Ôp8Îç´ÜðOn²`“„¡ÈtºÉ÷¦>}<òÁŸq|ÿá#¹‘È‚Lnî·s÷ÅægïfgÚÁv—~†žþ㥯uäÝÖ—*õ¾àÍSY?^þrÿRsA2¬}œÇÖv[æ[lª@$Q:ò)Lþr?))õÆ©ãűÐ&JFš§ZÈPÓ6úÒb… %þ›$‰KSÇÙ›çðÓP$*Úø¡šw¹ßÙ΂ɂÀ30 Uz¾*’Bñ(|oê㪀+šLÙ´CÙÔ=Éš5ãG¡”~SgG §ÝÅ¥kJÁÝYæ=_ªÄs'À/S¶˜6u¿{ó„1ÀGvÌÙvÍcgöÌÓŒ&È›ÚG-6¾L2Ä! B!#ÚÝE“­KëbkIqìmŒ¼8ò½¥Ás9ìh®³¦"ši۪̳ "ÒÒû žþTûUy)½–JïâÝÙª¥QÙOrв:²( ì(öLY™‡ÊÏ—ÒÐ<ÿZ3{˜iŸÜéûn·5‡jÆ“.È*Ü‘%l9÷µÀ´ÓÞßÈ¡&Ý!!Iä;­ìÀÓUÙDo¶üÛ²u(ÀAkÐ@Ç •šÄœñ%”wh(åÙ¼Ü17ü0 ƒ! mÈìDr›Íy>†ö0ÐøcYÙ5SÀî œp¬ÛUáɨ“êoAàŸˆ;NæÜi d*Gþí+û*8'ØáÌ™HÒe\^WUƒAñÜ“m®êØþ ýö`* _4±A”JÝQ›½»fardzŸ©+»”÷¼+sL¾Ý™››Ñ 0.Y¡ç®[ÄL"Žb°­a §rD\íÕÀëMÇÔ3A4Û¦.LW¬ìÏ¡U3§›ƒs /5†k‰ˆ¦JÐTÈa ^Ü-…–g‡\‹4ÃñknŽ (OÍåb5þ} üD ¥A6¦¢4øä”æ’&èZÃ1mà¡Íù‹š 4˶³Ã×Òâ¶~3+@½ ºˆ/3!U:¹« ŽÓY ˆr RMÕ7<â2*bäJæfzú-l^™ÎLbR¯¬IœS“NM¤ÎDòç zkÏÛ´†V¦u¸ÑУ@¹V-@u8Ö@4oØ#¯?c^Á"ç"îÀÞδ¨ ¤)üSòaÌRgÙûó_93;¬?ÏÎýËÑZóȹ(ãóc)•a;× žA½@˜ÉŸq­çL”ÓŒ)9ceHBæûv5´kPFGÌódÏMWø…­Ê} ñé»þ°u `O,ÏŠ¢Ô‘SµlLï¨ÓÓ~ýj™N'Eú÷S2 èRÉEí–Öî„j7|¸ ¿€V\¶”…%‚¡W¬†Î!l~2FãÀ‰)kjˆÀv:%}R)æÄ^o[Œ8–NˆéøìÚHWôNý`´Û®ÙcyÈ0K¬Œ)Èty8 ÖAœTq5‡™Ân ”sZQö«`zâK¾y­N&#ÇÕkΕï—á´ AKWÂA3ªY¤2µ§¡í{†|¥Ãs8»¥§V Dg0Ãà\žA˜§g.wFå%Ú;YØÛQ¹†Ãhg¦»Œ[€gT7ô"#@¬½áåKZ>WeM.îOµvß*ÞªÃ^ž‚"Nz¹ôø\m(E¤6T"ß^Ü_¦Ú»þþâŠûüÎŽfB˜Y¶È $TΖØÇÍ#D‡' s˜å’%!TP(›ïLëõœ„ÊE/RRès÷¼£lôCwÈ8¶«qY6Æ­2‘¦ú+ɯÃY4iEöbYçÕÁ%>ÍjêÈX„r‚¤Ý*¦OÅ”îuäÖC¡ábA© ò¹ÿtņG[[,ÑóÆ­.,‚ÿDy×.ô¬¾ýuL‚ìêÍë‡î–n^X;ð@ŒÁb‚„$H‚ÖÛü0”cü#qÕGØô)»¿ýöÕ0˜ùÆ‰ÃøÄ=q/¨±»D:mºa© ! «GŠ47Ã+c¿Œbpº\:ýï‹L×oë‚EQârÌ ÍÕV#ÛÞ°yñcÛ¸ØI è¸ïŠd¡Ž ŠaŠ#í±k- þ/$ŽÀƒ¾°LˆµÌ¿ÆôÄ&á/£E Ø_ ^ézú¢(iŽj?01Á‚¡@Á‹‡qÍkGKD,ÇY‰ÛC˜ö$?ö® sE£›«•Öt³‰H“ …÷ÝÛ‘q…žUÞ?]IïsS1á'ŽùC«¢ÄSó‰d6Ò;Ž‚ÛúÝE÷»¼+Ûà¦c; î‚(³ðp0GPBpƒl1Õ|¿Z8‹_Ü•l¬»­¬éío(©~ùXC®ú9ˆùM%ï†S SF{‡–3ˆ¿) sŒ±=†gŠÝÁǨ±ôu}wsë ƒº©}ÎÕÄå*ÐøÝÈ¡ —Õ¬JðZ_OE|‚n¹i!Ö;– <§¢W4ü,cš/ëïpÇ=½È\¼ß^úI–x³6Ýx†ÁxA‚Åñ"ŠÑÜØn¥¤w ,¦ßªhd_$8 ¿øìž­#¼$8Ò©þ±ÿ2yøÜ›.¦ù‚G £ë)CqÿòwD5mµ -À½.ô=·ëñ]KOx®‚N=¿Áå'B%§¿±Ì$È[üú£— B‘Åúüí7äG¯Óƒ_dá·Ÿ=Ÿ¿›úñ@Ï(ðEhbý%XC—rbŠÿ³‡¯L‰ºô»Þ½N¼_yöb¦ÿéÕKþ¾Ï^I& NÞxõ:1½þèÅ<Ë7/Üð¿¤r9 endstream endobj 143 0 obj << /Type /Page /Contents 144 0 R /Resources 142 0 R /MediaBox [0 0 612 792] /Parent 139 0 R /Annots [ 140 0 R 148 0 R 141 0 R 150 0 R ] >> endobj 140 0 obj << /Type /Annot /Border [0 0 0] /Rect [451.443 480.775 522 491.684] /Subtype /Link /A << /S /GoTo /D (Gperf Declarations) >> >> endobj 148 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 467.624 229.44 478.533] /Subtype /Link /A << /S /GoTo /D (Gperf Declarations) >> >> endobj 141 0 obj << /Type /Annot /Border [0 0 0] /Rect [451.443 89.626 522 100.535] /Subtype /Link /A << /S /GoTo /D (Gperf Declarations) >> >> endobj 150 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 76.476 229.44 87.385] /Subtype /Link /A << /S /GoTo /D (Gperf Declarations) >> >> endobj 145 0 obj << /D [143 0 R /XYZ 90 720 null] >> endobj 133 0 obj << /D [143 0 R /XYZ 90 720 null] >> endobj 146 0 obj << /D [143 0 R /XYZ 90 606.144 null] >> endobj 147 0 obj << /D [143 0 R /XYZ 90 516.449 null] >> endobj 149 0 obj << /D [143 0 R /XYZ 90 124.998 null] >> endobj 142 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R /F75 8 0 R /F54 80 0 R /F67 66 0 R >> /ProcSet [ /PDF /Text ] >> endobj 154 0 obj << /Length 2248 /Filter /FlateDecode >> stream xÚíYÝã¶¿¿b¢9-1â—>ô!qzéõÒì[ Z[¶…“%W¢²uÿúÎpHYÒʵ÷î¡@,°¦†#r>œ¡ø]ü.‹î)Y¦Ò»õáUä¨^q7 !q|óðêË7šßñˆeQÆï¶ã%6w?«}~4E{J)õÕ}¨”ÞÖ÷" ~Ã͇²ÞÝÿòðwXHŒâQÄàØ×®³;íÖñM6”"b‰N=ŸÐÈôꯃÐZˆ+Z!ÇuµâT1.móë’È’Eƒ¼á÷Ä'¥4Ñש¨‹67Å&¬òz×ç»"¬óC±¤%—‚eiæß|74:Ù³¬_²£€`–|pÄŸ6Ŷ¬ òøEç%`\ðÎâ¬ód”0^™¨UŽÆë1³mZ¿öàøø´/mtí‰mfhæCmõzr ôH.èݬ±ŽÃW>ب>Ù„hÚ (°ø…Ñ„^\†&©˜ŒÕ(¦¸N”óº’ÚF“Q(šrŽ&|"ªºMJž]Ü~]ëq$ŒL†TLPaˆ(žZ}µ¤dÂÒdÖÏ?_<*'À°¡3f1ýâܼ°„J*F¦„0Í–ÅVÚBÂÿ–Îr­==̼06FÇ)ÄLébnÙ 8ó8ŠØE™xœ1yVòcŒ)bH<@¨‰9öNFHü¯ ‰à^}|P‡ùu³½¶ÅÈ`7À«æˆ¥žÖõÇ£=#šÖP)’¹¬¶uÍᘛò±¬J3*OžsÂm~à Ƕø­lzW£´EUä]á7Ý.*“À¡›\-¾¦Ç ‚ÖQðÖ8€ÃñŒOSeCž÷%OÝ8dAº´if ©wŸ`ÿÝÿßþXþìÿå›$(V±À-;$‘ºþG1;Ç"xo ˆK'ÚY)±”²gŒM_SAão “—•ã¶592ìçûÞí±ã•=ª±~_òª‚VM–ãÂ5šÿh:,õÐm[ú…u±Âˆ=äftôl+m䡚Àލ%ÕP]–UþXy†Ž~7źʡ½ e‘‚â»mhѲ>öô„&ð‹`qØż3UZ±\.áWDÚv§ÐÁ p0h%F=ªç GÌ }ê|Ikš‹5E9ÊÂÅKìVÇËOß¹n¨uué·#Ýù‚hGö*àñ\/!2î‘ÐÿEZ]hºS8âZÐg¶”•Ki‡\Ò"ÐÒ(±nDŠw×[ó®jÌÅvW –Fón7y‘M-yC3>l´Ü§Pc'· •Ì„Šc–Åj*”«Äe2€ŽZ]híɶ¯hü´/,_ aŸ¼ª¨Sqs¹§·¥ióöäê>He95ê}šr ©˜zn•8;¤Îö¢fÉ*öÝŒž‘P¡Tfßô»=±•†ÖíLYU+z:à }gÜÞv5ÞòØç¼ó›9áP”–ÃÁŸû@ÈÊÑö•Cóéú>,_ª²Ø,'œêrh°(/.6bò\eÚf1™ïOÒ[1îÍu¸-ëÒ”yUþ{¯¥ Ín?Óô#.?G;…]¿Ý–ÿ^^Ž=_">I>.5‹çÅØèûrôåàª]‚_ 2àécøÕ\a…lé¾´9”ƽhïaæ|¼=ëù±ã-‘ A;$ÆH¿~†¿$󡰩—ñÕ#Ùù㇞~nÀ{€[Ž}•1­ÒsœÒ£;!|#íid\e«íý$:¶-‹ŽÙË;êqª*m- #[KëôYàí~é7»Ýï ”`–¼54|*±-RBB•m ¦‡FÎÝÁ(Æ£Òþœ JilFï ·ú´nUѺ W3Êí¥“ðì& “Ö3‰¿m;{vÅ3PqÞæ—òPÌT(±.^ÚÙþí:€¢‡Ãm_ÛBÿòw„-æ8g°Jä‹K×ç{Þ¥Ÿ$)ÙØŒ3ìëqQ€_/ÜM,<¸ÜÏr[ø³¦¬–D™ík,¤ ŸÀˆNidYüöL@ƒäï’ü‚Kß \ÿ½Œ™jlŸ ¥É ÜP(as69{‹ëÂþÙGCw¿Ø7ûORVKœB°è¦µÆ°PGv’ít}É|3ø_³—» endstream endobj 153 0 obj << /Type /Page /Contents 154 0 R /Resources 152 0 R /MediaBox [0 0 612 792] /Parent 139 0 R /Annots [ 151 0 R 157 0 R ] >> endobj 151 0 obj << /Type /Annot /Border [0 0 0] /Rect [454.067 351.478 522 362.387] /Subtype /Link /A << /S /GoTo /D (Gperf Declarations) >> >> endobj 157 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 338.327 229.44 349.236] /Subtype /Link /A << /S /GoTo /D (Gperf Declarations) >> >> endobj 155 0 obj << /D [153 0 R /XYZ 90 720 null] >> endobj 156 0 obj << /D [153 0 R /XYZ 90 387.152 null] >> endobj 152 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F67 66 0 R /F72 7 0 R /F55 79 0 R >> /ProcSet [ /PDF /Text ] >> endobj 161 0 obj << /Length 2424 /Filter /FlateDecode >> stream xÚ½Ymoä¶þ~¿bÑ¢±ŒÜ²¢H‰R› zqÒÆAs-`J.¸ÊZî®b­´Ñ˹î¯ï ‡ÔËš†íKSp;ŽÈá¼<3¤ù*„|•…+%Ëdº*¯B˽}Å-µõLâ«ëWükÌWË%`¢, JH×{·CsDÝ–5J{({;{@ã¶å±²šít­áÜzCŸìónOî˜õMƒ–É"Ðú˜±7´ †Î¬%$œ„8ÆÜHtd˜ÊǪ,r2£Y?V  {øs£ô‡§“§¨ò®{4 ã”Å"> B•°$N–Ž|FÆL;yóDI&cùkÔJ™äÙÂüät%²ÑéH¼ºº' <²*¤!‹0¸÷.ÊkbÎ?÷5Š8¨?FÝúïäÏ‹Ï?÷ƒ-‹T4éoÖ}ÆaÓ¾†œ‘a Êçqä•6(߃®© Ì47cÅ‚)Á_èŒ?Ty½ò~óˆ‚Kg€‚q(‚¯´&$AWŽÌÓf1ÄU ÕpnWšÚ¤²8 .{Íg€…ã°p€)ƒ/Ë̸C+Åd*½H6o¶”Aó¼EWøŒ’eŒGc.ømáÉFõ—€ B¥§'ÊÎ_‹S–ò±ÆþJ±.úß"¢ø€,…Â1¢žE!3&bE@fÏÍ>å¯1àåÓ4âàú4~qvwú£®×7¥’ÅÉ&ª'EŒRU†jÌ5¤§ xr©­D¿‡2d(ˆ$+Ø·Ð=˜¿+ÀˆÀ88‚1.Ìö£¼Ý Ì5øÞ­Ó¸õô¢xÙVj_iäêP®.Ð(¯­<'š ª°‚}ßÓêšJ#b!]@Ù);oM5ñŸÈ@oo¯..Íù/iªÀ„ÛC.ÐSv$ƒðsƒüû^[–)O NšÑlhš dŽB€dˆ"ñûwM¯Ý'¹Ý{üøí»«Kb]øÔ^TÓ €bѵìòª¾H“ÐÌñ±ÙBÛûÀâ>äÓj»6?îŸ^mÓXyBŽ‹Õ7 ¹æÙÔ„`zBuÄKsg¯8 rb8WÐÈô.ø[“P¿wãæºCβtÙüù(ã` úÕÿÆÎCGàlKUå-¿¦‘7åy±$¬ °ûò ÁßÙÛ3b|öýÄÿâ Ï~8ó¢PÈ í¿°Qgu…S3*=Rp 8q‡rù(åj#@d-ô"Ì6¶Qê¿¢,¦+d‚ ?3Ólý‘“ò§/Sœ¥rDn·U‰w7\m7˜ú36’ ‚ÆTC' i~©©Õ ! '»áx$Øh{â¤|éJ#Æ+ ŸrÁ¸á€^ÆnšÜ¤)ÊŒ¿æ°ð í|~µ©~ëjS4‡cÞê54G»~ßù¶Ëê\$TvRy.h-Œ)P Ü›€‚;1Ý.f` \•ì'}{wo SL^dQ5"šT-;sRqâ*ݬ«D1êNJÌœ–÷M‹ +ºž X⦬sÇœÖïh¸3m˜>½Ã ýŽR+‘@ÊAÆ{<ƒ@íBh+æ·y'»ž {nô§K½¯´+`  Ä")öãW3µ¯¨`ÿôKBÙ˜ˆ¢/$Ø͵ö¼>X©'ô=]ÌèKeŒú«Daa[†ÈeOZæU×u(w{N4,Cp¬@w5Œ Wú0€6˜;¦£–&¨hG9›;»î¹¸o¾±KmŠ1³>|qÒ£p÷Üà®çG´´’AWÖ…Y"Á`OgÁÞ÷®ì÷Dm°ëºµ7bŽÉ€“7HÔÚb( m~nhô±Ì½)- ñ¼ÂÑ‹ÃÑ §RYž6Š3¡éò­ÅQjô¸ƒusp€¼ÎÚ+õ#ŒÊ )M^†af5ŠEJƒ]«óÞôi0cð3VÊ\¤à„ÿX9>¦æÝ!Ì_· ?n¬P¹%#d!K³“Û½Ýðdî{bôùMeçl''¹A‡ØÎ"„ÜíKªVê]ƒ¶¢¶Á6”]¥ƒ°™ä“ Û€öºŒY2ÉõÕ£öžßCÍÒ­(MP‘_z÷5šúÛ½p~Ó3ÍLJ­übgg]£7ˆYpsw)%œ 4AZ9»#úv“KyYÛusû{ÈÍÝãž>Ñ•>'ñI–ʘ0×ÖÅKÓ^·¶ŒSRBãe?nß̵´¦‰Þ¾o ½ˆó…Ú~ú›Sñÿªý€õ#€ñtí§™¿Ù\Ãæ Ê ü 繆C vœ:’ ]ù ?” ‹Ó9¢=¦¡ÄFz4Ètã3‹7´{œÜ‚³šö@L×Z¢cup7€ªñ) \»×ű£4Œ®DÓs¹¾¡98¨÷xÄ™z&^‹¼Ž¢„eB¼0š.>-šžLÎ|\›¨ÿuä÷9TÓÝ%®(Ú¥ý”Îø&سôŠ!OÍ8\80¬’†Æ€ÞÞ^Ó»{É4³ä{ð•;Û3øž¾5x›P*+z €(òšøN#b‚–8ÐÐ$E9uf©F0u«¨5]Vu3Ûñ8ô=dá^¦>l…ÝS¹;”UH°;Neðé€õÍo Xú‘·Še[å†ÇП}¦•µ5âÜËı¯Âƒî\®Z+Š ¯ç¸›Î¾È+këfasqZäüJà£Ö÷‡ ØmÁ½!\¾4Pß(Ã4øýÆžJŽ{©í e˜ëòÚ2Ý{]ºè8MC…Ìecz*2C¬¸d«»r£‰YÖ¾ ÷ü¡5Åz·–R‚¢y}{†ß¨e]@tëEÆn9ÙèË/~þ¹øK^²CÙ3½¾ô gÉÔn2wéù/_Ü™d endstream endobj 160 0 obj << /Type /Page /Contents 161 0 R /Resources 159 0 R /MediaBox [0 0 612 792] /Parent 139 0 R /Annots [ 158 0 R ] >> endobj 158 0 obj << /Type /Annot /Border [0 0 0] /Rect [339.177 359.215 514.727 370.125] /Subtype /Link /A << /S /GoTo /D (Binary Strings) >> >> endobj 162 0 obj << /D [160 0 R /XYZ 90 720 null] >> endobj 159 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F67 66 0 R /F54 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 165 0 obj << /Length 2532 /Filter /FlateDecode >> stream xÚÍZ[¤¸~Ÿ_Ñ/«¥’à+›”lV­rQz•‡$ÒÒ]…š‚Z ¦Sûë÷\l hjº{&‰¢‘ûØ>>ö¹}Ç5â&†â&‹o¥¢L§7ÅáMì¨o„k…0!œÌøêöÍ/þ`Ĉ£,ÎÄÍíý”ÅíöæÁ»}~Ên*¥ýËM¨µ Þ7™ðOûP5»Í¿nÿŒä”‘ˆãÖÀ¾Ägw,»{7o¶¡’q”˜ÔÏ“ Nzóõí(´‘ò™SáŒçeS ¥y›ï×DVQ<ʾ_VˆHãç|‰SnB¡#øªH˜—²«¦¨OÛ²_ÛÆ$‘Läb%±t»yÏ<@9:†=6T4eQö}Þ™ÞŸû¡®F›F‰LÒlË¢Î; ®èL¤ß¼î[ˆ :´|™ ùÄ@¦‚šf®ß„Ò‘âuðšvÉ›-ó-a2DQ×r’Å—Ûâ!d$ÅKJA½âåਠ(—2”SÁ[ 2Rú N¾%D~1:æÏU‰^ˆˆŒŸà;¬|É48*ŠÒD¾²& ›S]»èÔViûZ¨–6øÓwß~Ë-Ï:æKp„*[ø–‡ãàÀbuÕÎÓItì±f¢¯’p:+kŸ•Xâ*!˜é+!æ@õJJðQª~hªŸ©äÇΗ>Øs¥.ÏÝQ|-&'¥v&¨Ï½&._RHˆ¯»%Á,O ˆžD°å c!Ä]´è»ÓÀÏ–z‘JÏÚ?ýx܆Ñ£“a{Ý–ÆÄXô"OGƒÅç†DÒóî7 Gº¦wºU˜Ò6ã㘌̘fæmç\n(û!„0ÂÅ6³…† Ÿäî-¡;¹‡Tå§¿!üýyh˜=Ì».?_‡<#ŒÒË䭲Ț׿Q=‚/L6¼0¦ ësMâ(6ú:ÊÐP…Ž(;ˆ2ðK(#ñ(CûÒœ…µJûOǦ#0eFÍŸ¹»ð«ùÒ19ÆO³"de!LüÑøc½(Ʀr‘²žde£P uÕ¯V§ÚLS—´/”Š¿wDÜsŽB‡Ái„‚^C#üàJ@Ë©FG‰^Ô;t@ô°MoGÂ9-ŒHÁ€·)¹t³9UOÖM¢ˆ¸EŒŽl’¼2U³ .U“ @EUü´¹ÌØ4ëòÊnm$”x¥;ý/òµ‚¨‘¢û€€éË+ 8înð~{ÝÓ…ŽŒœ-zÆÙQei¶tv(42«>RR$gÇ•I¶,)_Ú'ÞðEÎ>›ÖÐegçJºKgŸ-åÃ~ÄÝSÀÏSo×VûÀcùM)W¼]BÐKæ÷zÕJì û§` |؉¿Xµpv¤°[Yü‘B)Gž8{jH¤™jÜ„ÊÊÑݱMOMÖ½6cƒÝ[£»+ˆ1äe#:ÇavùÙÚñÚW\ÞBùþZ—gaœË“0ŒÎ¾N­*‰§¾žF«þŸ}ý5XãoÏc¡@ò*µbâ/@å¡l†þº_?y*0"qöj´Á[®†àh´ùd ŸD™Aä™?@½ÃgU¼ëÌ[#4¦ºïøSðãèÖM¢¨_~gÌð׳5/OÓ(¾<γô«?èão;“gG>™(³ïœSlÇßÞXt÷Û[(%8Jºðᜲ©Æ>-’ÉmøÓ|d³™ò!F¸w?äPsá-‚`0”s—* Ÿ·­‰ûýºöŽ;W?(JãøôǼ(ýÿ^ø ty‹ endstream endobj 164 0 obj << /Type /Page /Contents 165 0 R /Resources 163 0 R /MediaBox [0 0 612 792] /Parent 139 0 R >> endobj 166 0 obj << /D [164 0 R /XYZ 90 720 null] >> endobj 163 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F67 66 0 R /F55 79 0 R >> /ProcSet [ /PDF /Text ] >> endobj 169 0 obj << /Length 2727 /Filter /FlateDecode >> stream xÚµYYoü¶ÿ £(`¹ð*â¡«Ar4Hš‡ôÁAš•%î®`­´Õwóé;µÒZ­…s8"‡Ãáo†3\uÁŸºË£»Ô˜0·Ù]yú ÷å“jv‹_>}úì›XÝ©(Ì£\Ý=í—"žª»¿_‹óèú‡1&°|ØYßµ: ~ÆÝKÝþñô¤—‚T…0Ö%9‡³ë÷2nµ ÑQ˜Æ™§3ôéÏO³Ò±Öïì G¼³-eÓ0¹K2*cy¥Þýkª{wr´™q€­¥i°ïz&†î䘪Ûó42ùS¤lã†ða—¥qðt”E˜¼挴ÇZwç±~PA×r·r`ÕSݺ÷ ûØ)ª˜U;v(êŒçÁ© Á—-#Ç:ÌgÓ ¯õX7mœ…:Mçqc1.·‹½câàZ×Ã÷ ök|l<ë8Šf’QÝžÙj=I„©-UµÍÂôºîŒÂȤbÅãËŽÕ-êñ¶Ó±u&F<$\Ãû»ÀJ² à/ "úcõÇVs³Ð_ÇÆsÇâ¹a–@Ý#Sê3ý_V%k.St¯ñÈU¸¢ÄAÇ-똀™~à$mh’Ù©Ñ£À%œV)@$Á ã6 ¦Áí§†yCÝ–ŽÉTÔûŠ›²;ëÆõ2µ,Ú¶ý§¾wåØ ÑÙÂx…XoA¨Qú5bœ»äS&Š‚Åm  ÓL}`ÿàÆVo#l`àrèrèo¨Ã+Ž)îÔípׯxX-CÎE:rçyö9Ø'@×j³>ÕïAÃâ—Ý0Öå= ‡õ»¾>ÔmÑ𷯸9÷Ý¡/N! Œ1íTZ#öûç&(ÀüVwO[æP*´qìÇÜ{uC›­ç}ñ»îT»aì§rÜ—³Û\.‚9ùÍr`»²Í_{G—Ã"ÆD–†ˆ¾h‡=]*‘áX²úL¦?„„U¹°Søã´_qò<©›FŠÒÈä(Mpˆƒ/Vpa<.¶\uÏÇÅbÍR—Œto$Ú¢é]Q]x\ÈïŠÖº%pÁ× îõèz÷Žþü‘£ß™$ÁŸäWðCô¼a:³Y»~$ÇÎ ƒÐûÁÂÏuSð;¸"ìçÈ3lÝMÏè!òƒó î77’ª0IßÍt&&ñÃð໑mfÀh Æ-]u|&r¨@>Ú]âz{yŃðiM÷ Ÿ,lâ„eÚ0†…ü€'IöCñ`V6\ùåƒcín!ä0T€ø¢9€ëÇÓÀ}w:7¿à?27pŸŒöwy/2Y»{?aÚù;­áZÿ(ˆ^xœÅDqˆ”§pž%c÷|ÝîÜ 5›` }3ÛP~*µv©„žw¹®ö§-=sµ„ǯÖ3»Õ3…#¶+@}Ñ4œu៧²¹v)cȹõÁÄ(=q+¯ ñàê­˜ÂÄOäÌó_(@^è^êúj¸gö±޼Ò~ji}Šcš’͈Uxµé~ƒ„&CJÀ™FW—”ÀBîA¾=³çŒó4çZþ¢ Ÿ‰1q‚Ôr…fjŽã¨ƒ²œðj“Û…É”B"1¸sA)$}Æ|ì²¥;DœSA‰ZYTx…Ü„ Y¢p&wÏí£2s7?I–¨¹ÿ¥çl Ô9SI¤Ãγò:Ótx¤ŽzW3•‡ÖöV5½K·ëpZ}«TÑV¬Äe9þEâß®WÍup,,Ë©ç>f4ØÎIžÖ € PX¹Ï2ʃo2L=à±?u½Ã ZO˜úZ7UYô÷îÿpÏDYL𑖱ɵf`>Axã¸= KŠ+$…¹b;Ô –ØÊ¬ó Œ'ó%‡ ÿ–Çafçc¾ú%J¿*òjÑ`ÎÇ©wã˜Z›( «»‰÷¿¿÷8Q’óQ* óä&îñ½`•x´±zaäS íD ŠÕ×?AŠy'‘VÍ{ú¤Œ Ø7/è`WÍEFG’ñ@ÛÅ]Û\˜zÅÙL¢×ÛŠ”•Ĭ‡¯×«•)»]Z™Y0›¼`êU›ã ¥Qm Ç.U]Ó\@aÎ+'¡Î / @5Ý¿yL–/¨ŠQTý hO0çŒèmGÕ&Lmvë¨êQCIv*zÄÞ@XƒÏªe®•'«¢º7rÚ¿ÁÝ®NWG! †ü/Rù›—åeñä"O4}L³ÇüôEÁYpn&À¶¢)†‘)¿£ð©ÖöŠ}ì]±Ÿ ‚€‰z=ÖךõÖŸçdu| žVCò52³ànUš 8ÒüB¢ã[Ìà8~{ÑKí°·á™©:ÚØÏô¦2 ?»ŠÕï×*K¦òý-ª×¨ˆÓèa`JЪ} ¬U]r„Ãîý üöîÇbÊîAõ'åLnpƃƒIAŽC|NÃ"ç6ÌþPeü»täX‡pjºDÃ"~ó0ŸŸ2Ô²Ö ÓœSÃ×ÞíñðJW-Ad¯òß‹øk¿ÖüQJ•]WI©-/NDÂø =ç*Rho=%O‘à:³f"{³*щYÿʲäó%*@våöÅÔˆž«#Ãdn®ì“ƒä‚-Ÿ+*¿&@h©9xtœ9?b+Om+07¢‡Dxü}7޲ŽÿZô³ç“,‰I·¾]·õ©þÅ—Ws=L<ð¿x¼< Óô¿/†á7”À_ÿŸ_?ªé܇oVI¦:}»Šož)¿…<®¡7Ró&Ágî+zéƒÖ€”Œ]x¼ /ôm”¹r·E¹´³ÚÜ_iñ-,ŽLðõü}ãŒE\ªçyþc`vIqˆe~‰}z&¶à4”q¿ÉHDܱBJf˜Xœˆ‚ú(¬ ¤ÞÏ“ˆóu`¥†Í·ò7—‹±xá£E_ƒ(kN!¬aå­^ve|»°5o]xì²Ö?:À®¢š†ÙR{ ŽJ7¨ùÿv{û¬RDðB€7{øü0µQýhý‘S€œÃÚˆ9˜3¤Ga?ж—寬ÊOj¹Q´ÛˉCøû‰¼«;ŽÄÆP\óÀóIì+l[Ç7¥kK&ÏV™”Í8­ÍÄô°Q8æøL:[eÒ™<Î#uÂ= Œ›±>“#Z~Ö.úzÌä5ˆjÓ=X»[÷•²é»‹œ”î)l§3·è‘X ]ÈŠw˜™’]sá~Uò)†Ö‡‰¼—Døzê­ûàçç¹–Kƒ“<°×û‹üü¶­(Zg9=õ#·d—®ø•ÔßúGXX.ÓÇÍ:¶@gïQ9‡æ£kÎò&¡MMò@žŽZù½³?mý _{З“\žxåQYfʬK…žGþµ7^ü P˜†Ir øprE;øÑ˜²2%¨YØ ù>öFKìA+«b÷›®=p1{ƒ§%œå·µZþ½ŒXý/kX3 i(&»&Œkd–rªÇaóx²ø.i“5i_¯µ/#Ënjä…|~º=Òåúßÿ\_öñ endstream endobj 168 0 obj << /Type /Page /Contents 169 0 R /Resources 167 0 R /MediaBox [0 0 612 792] /Parent 139 0 R >> endobj 170 0 obj << /D [168 0 R /XYZ 90 720 null] >> endobj 171 0 obj << /D [168 0 R /XYZ 90 512.372 null] >> endobj 167 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R /F75 8 0 R /F67 66 0 R /F53 172 0 R >> /ProcSet [ /PDF /Text ] >> endobj 175 0 obj << /Length 2489 /Filter /FlateDecode >> stream xÚµYYÜ6~÷¯XD¸Qu,°Ùìp‚;ÉËfhºÕÓ²uôŠ’Çñ¯ßº¨£G÷ÄX 0"K%²ªXÇÇj}Ÿ¾ÉÛÔ•ÇÙ;y õý+-£0ì¿{õíVßèPåa®oîŽË%î7ÿ¾?ç¡ìowƘ þëí.Žmð¶½²àþëÞWíÃíî~„…¢åB: |ûÒ:ç²? ßjC…*µ™ç‹rdzõÏ»IhE_Ð 9¾¬V’ÅJ›˜·ù}Kd£ÂIÞ]ÃIºRÊ* O†)†ªkÝ–b6SÖXÏû ²€”‰Jlr³ÓFi{­(»f¬‡ê\—»yÇ¿mŠY•çùWȧ£\åI,j~÷34_×7·»(I‚ "SöH9uÕ¾tLèŽüN±©¦¶‘ ãIà]µ%¨Ö*¶ñ,(-W´‡gÖ-b“N˾ûì²öbÙ·Ö®ÇÒ½Bú},j˜‚†0IƒÎ•ÚÝ#wPº§}éÀ5ýÏ}G‰»:Ð!jtox†¹ßcËur°u2 3È– ¦”ɦGrIXœOw…ÉOöœ3¿œ#Nxú¾`ÇVPoLü£<O"ª0†òò-‡”!ÐWg*ƒ$¸:–õŠÒö¶¬ MOe}vží·P[¦Óç@[ÿ¹÷P¢‡¾Ag ƒ³¤WÝצQÔ·:F±çyèøã¦ëý>å¨E¸¿„}“}URÝÅ“§Á{ÊÊã}[]Ÿq§Í,L.ñâ âøIþÙ”ûÁ!ùc“¿2Ř<åÄ×àg1à‰J•ІA ƒtèýüå±èe­Ž ÅÓZ»—µy“ø2ý˜ÈpbÞ9#nd¡ñÌÉ…œQWוC¡¶êF𩹆ýHÖ{®vØ\EÉTÄØÑlÐwc{`D`i|RÞ4–‹Teá¢Ô0DTF ¿c¤aƒÃTO`â·²âÐÚ¤ÊÄAðö8ƒ•-x•«$O×®ò¬²‰ÊS»VÖá&”/Lô×(¥ÑRYt‚‹¶= Ù®azÑ€i©œx˜ªs Ð¾4˜Û«³‹ŽUœÙ—^~Ún熾.7÷IÌÅÿ‹£káó‘B.Ê¥”ã@à&‚œJÑËȻ𠰼åÅW ÇÃp’ÚydZÁ.ÈXæ±(g¾(g’·q´ïšó8x¨r^g…$8îģɉ ô¤¬ùÒ€oI4q…TŒ4(™RðEýX>Êܹ²Á÷„IðU%f¡KñT-?%_$ @þ´Ê/€Æ®EMèÿœ]ŸçÅù·j¿U™ÎÖ»d*…Å–ÿ2T5 <4VQ(a&nð¼[ï½Õœ‹£ˆÑ&¼,ðK&±ua Ù8³1—h˜¸Ùª»€¯>,ì „óÜð%tèôxêêQN§ÇÂQO'¢Œ†iG#ahJx5øIœ«O…F !<{v¥÷»/#"`êý¿¯¨«Í6ÑQ®Ub’¯NëHAZ[K·„HJ>^œ„¦X½Zt.ù9¦ðÉ |„›âflÊ]¹Šþ¦þnE†U£µrN2ab‹ióPí9ÔpŠHîDþ‘ MÑú 3¼á '\«¨³ cº*ôr˜EpͲÍv@ZçcÕ¶¡7…#îUÙ·ˆìb­14dèNÝXx|O«`La¤Q)€;v_ÖÜ&:Ugæ£Ì¦½íenñ :%༼§jVN%Iáö>0×¾hgA°ŒnhòØWÀ¥”Ó§<[ŸjéüÊ‚{qS Œð©mW`ÑÝÉÕ¼š:ùA*.l9}ï²Ò±/¨^¢C‚”Ž˜EÒÿǼjšLRmÆõ²ß˜ag´ñõV‹ÚÌMe£èœî©-‚éžZ3ØâêÆ‡ÓE»dÊÛðÙöT¤ù&·k^ؼ1Þúÿh/ɰøØûsÒÏcÁª+;œÇ^nØN°*Q)ð郻ÿî-€S0vµèç Øáfñšûf“®¹Ù|±|¦)·Ô—›šróÞº)Ç€d’×ÛM9×ó¯T/lÊ¡•ÿÙ"^SN0ïs[-j€-ñ¤QÙ¢ÇÞH÷Ëà “Îq ·½uÂÓÄEK§ÜG¬N?ŒÅÔz•W€” \ÓRSÓ›y¸±L\TM¬É¸*ÐVÙfeñ99ʬ_%Ê’©Ò#ùP2À¦“°ðLHÂËEÕ—ÂN¡Œ tMÂØºqê8nÅ•EÏþ÷fÞeñ­nöGvó²u+Hm¤Š˜Þ‹°–_ÎÅžãþ‚§Þž endstream endobj 174 0 obj << /Type /Page /Contents 175 0 R /Resources 173 0 R /MediaBox [0 0 612 792] /Parent 177 0 R >> endobj 176 0 obj << /D [174 0 R /XYZ 90 720 null] >> endobj 173 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F67 66 0 R /F55 79 0 R /F54 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 180 0 obj << /Length 1078 /Filter /FlateDecode >> stream xÚµVKã6 ¾Ï¯zYX»’-¿zk‹-°½´@së¨ÆVbcb;•¥Ì¦¿¾¤(g’3[ I$EŠ_?±©ù¦Ì²¤–Õ¦îx >Þ‰°‹A ¾’øa{÷íO¹ØžÔ¼›íîZŶÝüÎ~ìÔÑjÅY–1ù]K™³Ïc”Vì„Óc?î£?¶?ƒ¢ôZ‘à<;`×ëٵٹƒYÊ“2¯¹Œ£ÐݧíåÑyš¾áJ¼á–eRlŠJ&"“diÛiðª*Y«wÊ,NQž3up×Ï´Šà9çÌvQZ2 æÖ´ êK? «!ÈÏýßËÍùù†'ŒÁ<ü?xË>ˆÀ˜v´>"KŸŸ|Mü¹ç9ßM†”é{.Ц×csŽªŒy ij‰^V¯¼¼~º ·ƒÏÅ‚oÍ _XÕÁ¿C!ºç@3“šÖÃgw¤ÕNá-GoqÂë^‡÷èÞOXSpI$Q\bŽwëÔ!èS‡@xÂnP¨ëLz´9¯94Oƒ~ê”ýH%2÷cƒ*2 8yï€huƒÚº±ÿËæÂÒó¬}¨l¯‡31ñ:íL?Û¾I¨pJ(0™d²H1¥ãSÒ%©ê2)¢8/R(Pp^@XÁ XŠ2ʱ2g¿8{„üZ)Eð,M!JÒöçZYg ¿ÔtÜ­i"‘y¾È|ð˜ÅðnYå·È½­?îôá¸Ú4†B>ÛˆE^Jö«éGL ئ…O´€Jí&cÃÖ ÆÑ¦‘VŸÏ(U%˜Â¤Ã¦FB;Zµ¢Òéh¦½QC9Ú~!ÃdÊÙ÷Tl`q&îËÛ€ ã‘€n—ò⦜/Ê|>|Ñ#}8 ²¨‘Öï…íôßÂò´™á…kV Òrù \N_„ž"UùH¡×Ôð|Íh¢4ΘPÄ9Qm{Ã^b¥Á½Æ¬z¯SíÿÊ­~pû5#’'¸»Êe.köiÄ®„ðˆ¥ãŠ”µ4*x,˜Ûï}š¢Äsf%t¹>\„Ôòд®YtCšÎš¨m¯öㄽf19Ñzór¶jl•¡~Žî—õ­ûÚ˜É|àÛà©ÓãleýŽÏ$«/_ÞPªbÜ£‡eÍ>[¢/|7ë;Ð>ŒP˜ÔþHà 6ƒ 9+áDB6Kú×tÙò¦,L»*èËj˜Kð]4,º€žû2÷\E´}OxDµ¥NÀ§¸Ít ™P‡áDÃf< 8­Û`©¦I˜U¯>–‘¤•Yº•\žŒEË<B‹‰Ë¼d¿MØø±Àˆû~Üáø°¾ÞdxfWë†ð¢6hµ´z,q£Ç–DÑKùïï¼i|>on{ÀjUÕòëj–úËÑ^ú¡,á•Xam²|oþÆîÙ endstream endobj 179 0 obj << /Type /Page /Contents 180 0 R /Resources 178 0 R /MediaBox [0 0 612 792] /Parent 177 0 R >> endobj 181 0 obj << /D [179 0 R /XYZ 90 720 null] >> endobj 182 0 obj << /D [179 0 R /XYZ 90 630.606 null] >> endobj 178 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 185 0 obj << /Length 1580 /Filter /FlateDecode >> stream xÚWYÛ6~ß_±o•X%RGÞš Òã¥Y Mr%ÚfW‡#RÝ8¿¾sP²½ºh±Àr8qN~3÷ ü‰û*¹/²,®dy_wwIà>݉@mA`{!ñîáîÛ”¸I\%•¸Ø]^ñÐÜÿ½?è£7ãf›eY¤Þn¶Rªè§~ؤeôÜ3ûÝ´wHÉH÷5Lÿl;ëµ·CïXìÙúÃæ‡Aez©2MeœWXH÷G3î‚Ü•i¢Ê㬒³\&Pèîû‡Å=•¦¯ø7(Àš"N…’!y)c‘IV£6[•§är&ØåBÍ.¥û†‰kqö·P—2QÆYQ¾êï6K²X‚Û´Œ“*Øóp0ÎÝжœ†ÍVDßïCÆ â†Î0«]Œ¹,²äü|g=£é7iyfŒ¦5Ú…Óa·š¾ªˆË¢zÕp"ÏòYì-‹äɵÇY+‹<ÁáO‰(VË!s¥æû0,«µ«J½j¨•2›Å&o[ë1´'p\V‘u¼ú©7M ^ÍSOÞðæódküì©=mÊ,z\•… ‘˜(ì0>¹[ib솑 ×é¶½ÖÓ™ÆNÚU¬â$+!HY,›ììW´¡(£F{͔ú0ÞñîS¢=—k‰$I˜zB#Ì)X×pü@ÄPüE}ð,iÃ]æ‹MgÈnØNÎ즖iö¾é´íñb«¥Ê„Óãf‹ºÆ©=ù’/»qÐ˜úú\®rŽõÐmkhGÖl}IÖ+VDÞýE•DÍßäã¨[¾b4µaëxoúƒîkp‰™Ac??/Ñ`L»Zf/Üø·:Sry”[u® Þ(ø¼¶Áбª¢¡çÓ¹ÕÍOZ=î  Õe*C0PÀq (®òéo ZøH¨7\ ê&šn.QE¿À$ª¿àÅeýÇR[ç8Û€d“7Y"xbÊl€›ƒi¡[ìG£Ù{8§Há¹Öƒ—|2œ¡I•|Й½[`‹8¿~÷ $0^ž&ÿw¶²á"…úpõóÑÞôPz~D®™¾-^`êqÔ|p[CS ×ø`¼‚¸"‹ótiŸø67 >½Ïû•˜EC~ðnûÒfÛ'?§[’‚«¿©4)S ™l ÓÖñ:+’pÊÊ`ee@¼¬:æRC€ÒÒAƒñ] ÖâM?†µB¢-d|ÀÛŸ™Ù̃Ë%ø„×HM° |ÁOð)è"ÚfeÂuç,Œ9¯ óß3·Æ—PDAø¯ÁÿZÚ ªâ<pÎðUýv¨¸KîlÁV Ü½0jx„窢¿aÏö@_Þa⋆þôaÇ Nó$F%W öÛ ÀÔú)„·ì^ £‚e.ACïlC€œa7 @’ ÄŸ«½Æ%—Áaûqõµ‰Xªeæû&˜p<›ã)ÃDަ™ê ‘Û ›ÿÕC¹ý >`«….{ !ÐS“ì:¶¯„‚;7’'] !E’N=ì{‹±uêÀ …43z³oíÞ>Ò3½î %“5”Ak8ë4b'Þ½çeî~n¥„*ú[Z¢@F¹š·D‡KMÈD†Ö üù±é`<œÛ í¶¸AÜ g=oç}"> endobj 186 0 obj << /D [184 0 R /XYZ 90 720 null] >> endobj 187 0 obj << /D [184 0 R /XYZ 90 720 null] >> endobj 183 0 obj << /Font << /F51 9 0 R /F52 21 0 R /F72 7 0 R /F75 8 0 R /F60 14 0 R /F54 80 0 R /F55 79 0 R >> /ProcSet [ /PDF /Text ] >> endobj 190 0 obj << /Length 1140 /Filter /FlateDecode >> stream xÚ•VKÜ6 ¾ï¯äR R»–-¿ÒÓ6m½enÝUlyl¬_ìf7¿¾¤H{'m1Q4E~$?Q#Oü䩌Ny’„¥*NÕp±öñN²€ApcñÓåî‡_Sy’QXF¥<]š[—úô‡xßêy1ö$I"²wç@©T\Ún¼:Ò}\º¾'ñwÓ,()±L¤ùÖ8Qi"’øüçå·»_.;˜4Žÿ-Z|7O2c™*†›*”‰"¸Ù9H³X\ÎÈ\í ót ’ +€h¯ !„U§ .¨dïàdœåµÓÚ×$‚¥†6Äš^/Ýßç8¦~CŒvÏ$aÔ8+„=K<%Å B¯+ÙËÒ²P­Öšñ þ:4ÃÎlc*Ö´ÚµdܬcµtÓH;Ý_'Û-í@ÛÏ b–§`ËK&¡„Œ}^ ‘‰a²†$óÔêÕù,|n¨Ó3"µ@ í -+Vq¦:04<@ÐȱÿXÃùµgwãPÎqŠîùÓXvÒ–?~iì4P¸ [ŸQôu.³®VÄ¿-0Du!rW‰ûºî°L>Põ3ºŸ,”ÖÏmçñÁÑnO¨£NŒƒYßU¿Öæ1'‹n™S@S•-KõÉüdq˜¥)¤à­îGÊ ŒÄêL³ö$›§ÅŒÎ÷·ÝȸxOð}¹)t×<ÿIÍMŠnŠƒÚ‰Ö«Õ‹7‘žÂDƒîßrã]pTqê8^rê8Jm¢4Z¡—–¶•±‹†´élµnÑcåïƒûôEB ½Áí-@±ÒRA¼…fa¿Œ¸œ^s„C9­¦¦©ÐW½S¬,±¸~¥š°•§f½þÔó×}1™fe*Æ©èØ¯Ãä–þ™ä©ÙýÂ5[ºÊbtc[0u™c¬ÅA©á¢ª8nÖÖa–q²áAõÔMHDîó+äªíü G¹§¯Óã:ûrýÐcMW·»£•Â_Láø–ÂI$Ã(Ë6y.C›m¾;ò“‡Y’oæUÕyJàvífÓLÁ!ü€KÒ2”qþuá€ÑÝíB[µe¤D­MY;¤^¬ÿâ±/ ̼åÕóÄWat¬¡*)áúîêgˆï8júi¼RÁÕKÁqÎŽ”x+àÊï ¾‰v­ªúVÓ0ز4€‰ž=Ñ,çÆç[ã½ÇæÑàu[Ú6“=êIA)‹ÿÖ•¬Lv»®Ë>0=§á6€Di6@ ]¬lÃ/®ÊâxÕ?zš`òbö½y¢áí*ŒÑB0Gñ` Ȭ}YiºqÝ4¿\Ty¨]Å„àïÓºÌ+ zÞøÐž¹?:ñ¿»vëÅídÆ/ïùÎÞO „oU~ûö°iˆÛX@×ø†óŸÈ5¤Úh endstream endobj 189 0 obj << /Type /Page /Contents 190 0 R /Resources 188 0 R /MediaBox [0 0 612 792] /Parent 177 0 R >> endobj 191 0 obj << /D [189 0 R /XYZ 90 720 null] >> endobj 192 0 obj << /D [189 0 R /XYZ 90 720 null] >> endobj 188 0 obj << /Font << /F51 9 0 R /F72 7 0 R /F60 14 0 R /F52 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 195 0 obj << /Length 1942 /Filter /FlateDecode >> stream xÚ½XÛŽÛ6}ÏW,úR]©âE"Õ·“l²Í^`;M6ŠÍµÕÈ’!Ë)ò÷á²ä•“) ?˜âMÃsfÎ Å.bø±‹,¾PBD™ÔËí³Øõ~zÆ\+„ aoÆóųŸ_%ì‚ÅQgìbñØßb±ºø#˜nò]kšI(„Ô/“PÊ$x^|,‹zÝä»Í„ëàË$äJë4bòaqóìå¢{cÂù7LÂOlRü‚©ˆ³D:›R-#&$Ù¤&a’ò‚ðîÓãÀy¹ŽâÌ­üƒ}€“(†ÇªÖ—ÐÖq0¦Ñ/n±ì/Æw¦ ö°k¯`vƃùrc¶Û"x¬êœÖÕ¾m˶¨ÖÔsßL¬Œý3¶M·EUló’Lóh—-íø:ßoº=^M” ì Û.t†LD †¬o*0k›ã"bm¾,Lµ4{|’ÈþŒ“˜e:…vIS˜V!Ë’_‚˜±ÐÎf0ã2 ¦ÅÙÞ˜²,`OE0s]y³¢97Ñ,VQ³#’< í¦n~Ü£ë¨`fQÚïðÎj¨·­­có÷õ`8 ÊâÇ ö4a…'‹,>#²‡<‚‹k_ç“°`C“ž 'w¦ ½5`¬åð‡1¤ŒÒ˜ûÓMëíA9TÅ2§-ðõ#aÝn 5®pÖôö’†¹ð\p$è…Y»ÍG0U>·¸ãMŠgÄYèl2'ÐÛSuÊœP 1§XòpÚòXÖ‘wô_!ʰAÏ…¡]˜ZCxm×m¾ÂÓkÌ‹í®4cpr¡Ÿ²¯â ÖžöäBd‘Lø±>Èʃ,z #Æ7ye7Λ/ç]˜„A1ˆ /#•l³ìÔŸp†HDý3û/ƒ¼ZQÇ}¹2šl[7{ÍÆWàƒ v=áó¾µ1Ò’Ãó}aÝvÒ=GjàÁI '^ ã5:-Vh`ˆJ=Q£:ã-"ŒÉ¬ù›ë‡·WwÕ]Ý 1Î-™rZ­™È ã¾Ì{¾Ì4Ää(Ú‰EUtͺí'0Þ‚˜× þæþ;È_×  ì8’J·bæfÞ¹ÿùéÊ_ó‚„ðnþžX“ÛÍ%Qz;J™€vâ {°¢ŸœKÛ°Œ¤'b^ìǧ ûxCì]*¾©M•—Þ¯µqį-ÒIϯâÙ=Šv hKž7¹±rIÒñÉÂÈD"æcé’E‰Ò„Y—ø–ÅÎR[oôˆH©<PU¤B¡ŸKˆŠ£ØÒ³M²Ø¸6¥ÓœÒ¬ì]ˆ±"õ^CrᬨÅ7mÍô»^þK…g½¨Ð< 5TGd¼³c¨ò ÃXÂNÉIF’çÞ0ï~^ôñЬFE(Žþ̘…JOò/\õ…Gº¹J}BPêIBÀ¥˜¤[$ncýcuFȘkÿo¢Õa—lO $ý’Û<_›C$ÁbSos—ôÎE²eÒSyCF­Ë/U½-¬OÃó¢Àb[=÷·]¾q ƒ8€D¶¾]Qz«þ¤µœ¯ô€N¸ÁGqΰÝœ“—o‹fR%ü‹ú°.nžž)cd$ŽeÌõÃËÙ+ž¥=þ pãYâpáA‚´cC6ƪ¸À°4óï››eˆ¾›¿¼{ó»3Ö­å%ÕÔç~éO?2%9d™ž2U=šË}B÷¡¡ä·4f¸w„\횢ô5Oæ£[ }7”[G¸qø ÜœG:y·€{Ûý¤Cîu"^|¨àvâqrÚžv¸B«"}ÌQãȲ@èÄ~fvT>4þôPøÌ]陪H 5HÓ,v~¾èúw5"øÙªò ~vA¡lrAaIÑãÄÐ%.vÆí³os{—åPÛ¼h䋉†'{O/ëÆÎVv£«qæ0CЧå~&O¯«ÒS-Ь)—­//I' XÜ=Yú{ži>{;ü¾n:釣Òûû˜¾-öí¨\Ù›B'¡_©Hy<ý¯”¤}1’ ´È¥^÷ª!܆”»æ°®jº] ¤a´@oa]Y?3I{wÿä$Uâg—4¶óæ0©44JÍú#âçºãnŸÝnÚ ç!¸W›c•J•™7Г¹9¼ˆTª¿· ò¡ÂF‚¤ ô¦Ž¥zu¬–,ÔIì "“†)ƒÙ+0~ió²Üæ•[:ó>J·`ºCÿí1h’ÎÏÞí°ÚUòvÓvä]ß½£ÞétT`$C׎}ñ ñ؇м~l{íÈCHÁ@óP­,º—ÝmUû³§®ÿ§Þ)»³7õ¿OíÜéŸÿ•7•Ï’"‚ZÜÛ¶°ÄáAÆ´TÄ‹ŸŠ©<SX?¼YO\SöÜn;Ôì7¯Ö(£¢QÜ ãÅìøiµ*öu¾G;4_¥#8i¹YĬc<#qè, ~áA½õ_´LIÃ/Îxœ+G0ö[Bu}(V.ñ–íêüa F%ÇïGg“R|¬^¾Çg¨ˆÅ´ÿËHq/ endstream endobj 194 0 obj << /Type /Page /Contents 195 0 R /Resources 193 0 R /MediaBox [0 0 612 792] /Parent 177 0 R >> endobj 196 0 obj << /D [194 0 R /XYZ 90 720 null] >> endobj 197 0 obj << /D [194 0 R /XYZ 90 720 null] >> endobj 193 0 obj << /Font << /F51 9 0 R /F72 7 0 R /F54 80 0 R /F52 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 247 0 obj << /Length 2532 /Filter /FlateDecode >> stream xÚíœKsÛÈ…÷þܤBU…~¢ÙÇ™Š=™ÙXY¥R˜‚$ÔP ‹x”Tþ{ºq â^¶åÔØ#¡¼°lâP÷|ì¾Ýxˆ÷Ä,ç3«˵›-^ñø¿?¿ñ§…,€âõõ«?~gÄLp–ó\Ì®oá!®ofŸ»®—åfµPJÍßÖ7å/þG)…˜+}õëw¯þ|}<¼‘ò‚Pœ}+gÂ2)ŒŽ s𠥇Àšø¼mû.Í”Îdx—ÿ½4g–ÛöM¿k5ræXže:*¼^:Õ*þÙ*”ÉLæuíF‘3-t'ø}ûº¯¦ìñõ?]-„í_òä_âòk/è †¤³Ì 5ËdÎ„Ö G>5ÿŠW0e MvÄ Q0´á›pDvæ›[Æe~â{Îo§"ÁÂ1Ãe"jÿ™Pû¢¨Å°ÒPëÅ8j0}‘£¨_ 5Â1 Æ½i&Qûï„ÚE-†•†Z/ÆQƒé¨_ 5ÂÑ£f¼N¦jöCµ?‡M*fTFЦ™î2ÑvöŸX1š$®z-ŠLZ8Œ*`J@Eئ\ÆŒu‰P-×›b[.Ve}·¿ßóeýh%,9š ç~ë|aÄZ¦QЋq `8À—p $øìre?‘„Ý~[/6 §$ÄZ¦‘Ћq`8 À—"p $d†ÉÜ$’pSÞVuéׇZÍ—«bw%æ»E]<”çL8ÅxNÍ>*,(³L`0Är¦ÁЋq`> À—‚p 0Í2£ŸÃ}±»÷0,nõr_­k !9³F“=Iž *°!Ϫö¥˜WŪúw¹]ì··Õ/Ï!ÏX‘´<{1ž',1‘'ð¥ò$CžÊšVUrЫê¡Ú—Û‘=3#˜uä4œõÓô‹ÝaíêFK/Æiâ?ô¥h!-YÎLòÞ}Y¦½û_¬˜MY½' †ïÏ@_Š,Â1es.uýw·Z(Ví‚L0‘’0nìs& C$9 ‘^Œ#S#¾"„c@D;&Uêb²º«×Ûr±,v#„˜Œigé5cöÎVc ÄR§Ò‹qP`vÄ,|)PÇŠ²Ìä©+Öª^®7åHG£¥§À[FÒ‰—:SaèÄâ§¡Ó‹qt`šÄ|)tÇ€ŽÌXnRW¶«¢¾;wå„ÎÿXü4tz1ŽL“u€/…áÐS"uÉ\V«pÖ¹ªïvS“ŽH,r"½G¦F,¶/…áá†e6u±½ö+í€Èa¹_ì7c'¢¹·¥OQ9'ŸÛ‰è®Ši ôbœ Áð¥ =*7Œ«Ô%ô¦ZŽlŸù6YÒgô*ÂuÁž^ßt2(ßn¸i,±–iôbŽ}RôÄ0 œŽpÇtw³Ã›ÃfU-‹}9Ž™0 1ˆµLàãÀp¤Åxb œÆ§nÓý5^ßáSé.›¯·ÅH÷ 8sùDʧâc2߯_¸rúˆ£øtb2ž>”Ó¶Û@#Þ¼²ëú¬I,SϳÑÄRŽ¥JK¹ã)ÃÚ#)O,å2HHãgØ/þedßtÐ06÷žo`fô´ºøÌÞÓ_F›Ø{1RÔ´³ xb NGŒ¸`<³€‘f”—µ:1ÑBŽ)±ži(ôb‚ðÄP8)Ú†¬ˆÝÛËcJUÿîµùiWŽ´F3Í_Þ®9ÂEsaqž§qÄ(¦åBŽq=.(§#Ú1•ÇÈßÖÕ>Þ·Ž¬Lätš!V3 „^Œƒã‘£MôÄ@8!„ôŸ¹»ë÷ÝÅMªw‡‡M;Ÿüëʸy±:ŒougÚM[Ý£°ðÌ×Û$ÂÒ‹qX¢¦…%…xb° œÆaQ6ósNœM¾¿Ë÷åãǰî'”„¥ŠSö%-UT&7‰Ó£ tb©=†NÊçÕ]>ÿÃÅýŒªºz(V-~ün^no= àa8þ'9¿=®lÏÒ1aÔ—4ʱÞÂú$.€0jÚG÷%¡'àÀi<Àp^ÄvWþx1Àÿö×Ñ•fØZƒÏZi6ç¢eâòˆQŒ: ÑFBO£¡‚‘6ÌtÂû‹Âûðìâª-™É§Õ(5êH?òšÔiˆq\¢†h6¡'† át„ż{”×û}±¯–]WPl—¡Q¸?>ÏãМúýZÏcýcUÒíÅx °ÌãÓôÄ8lœ™îiüðBΓi"oö)¦/õ9:·,WîXGŠN»â3†Äæn›^ úŽpU¤ãðPãPØ~ÑvÊvp@äÃö±_ò'lüž endstream endobj 246 0 obj << /Type /Page /Contents 247 0 R /Resources 245 0 R /MediaBox [0 0 612 792] /Parent 177 0 R /Annots [ 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R ] >> endobj 198 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 628.397 297.029 635.371] /Subtype /Link /A << /S /GoTo /D (16) >> >> endobj 199 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 617.755 297.029 624.729] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 200 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 607.114 297.029 614.088] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 201 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 596.472 297.029 603.446] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 202 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 584.586 297.029 592.805] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 203 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 573.944 297.029 582.163] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 204 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 564.548 297.029 571.522] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 205 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 553.906 297.029 560.88] /Subtype /Link /A << /S /GoTo /D (17) >> >> endobj 206 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 543.265 297.029 550.239] /Subtype /Link /A << /S /GoTo /D (17) >> >> endobj 207 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 531.378 297.029 539.597] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 208 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 520.737 297.029 528.956] /Subtype /Link /A << /S /GoTo /D (17) >> >> endobj 209 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 511.341 297.029 518.314] /Subtype /Link /A << /S /GoTo /D (17) >> >> endobj 210 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 499.454 297.029 507.673] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 211 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 488.812 297.029 497.032] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 212 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 479.416 297.029 486.39] /Subtype /Link /A << /S /GoTo /D (17) >> >> endobj 213 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 468.775 297.029 475.749] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 214 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 456.888 297.029 465.107] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 215 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 446.247 297.029 454.466] /Subtype /Link /A << /S /GoTo /D (17) >> >> endobj 216 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 436.85 297.029 443.824] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 217 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 424.964 297.029 433.183] /Subtype /Link /A << /S /GoTo /D (17) >> >> endobj 218 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 414.322 297.029 422.541] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 219 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 403.681 297.029 411.9] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 220 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 393.039 297.029 401.258] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 221 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 382.398 297.029 390.617] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 222 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 371.756 297.029 379.975] /Subtype /Link /A << /S /GoTo /D (17) >> >> endobj 223 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 362.36 297.029 369.334] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 224 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 317.201 297.029 325.071] /Subtype /Link /A << /S /GoTo /D (27) >> >> endobj 225 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 272.041 297.029 279.912] /Subtype /Link /A << /S /GoTo /D (12) >> >> endobj 226 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 228.625 297.029 234.852] /Subtype /Link /A << /S /GoTo /D (26) >> >> endobj 227 0 obj << /Type /Annot /Border [0 0 0] /Rect [287.813 216.24 297.029 224.21] /Subtype /Link /A << /S /GoTo /D (23) >> >> endobj 228 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 629.423 522 635.65] /Subtype /Link /A << /S /GoTo /D (15) >> >> endobj 229 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 618.918 522 625.144] /Subtype /Link /A << /S /GoTo /D (24) >> >> endobj 230 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 606.669 522 614.639] /Subtype /Link /A << /S /GoTo /D (28) >> >> endobj 231 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 564.246 522 570.373] /Subtype /Link /A << /S /GoTo /D (15) >> >> endobj 232 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 553.741 522 559.868] /Subtype /Link /A << /S /GoTo /D (15) >> >> endobj 233 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 511.573 522 517.351] /Subtype /Link /A << /S /GoTo /D (21) >> >> endobj 234 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 501.067 522 507.294] /Subtype /Link /A << /S /GoTo /D (21) >> >> endobj 235 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 458.025 522 464.677] /Subtype /Link /A << /S /GoTo /D (22) >> >> endobj 236 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 448.394 522 454.62] /Subtype /Link /A << /S /GoTo /D (25) >> >> endobj 237 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 404.482 522 412.452] /Subtype /Link /A << /S /GoTo /D (29) >> >> endobj 238 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 360.316 522 368.286] /Subtype /Link /A << /S /GoTo /D (15) >> >> endobj 239 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 316.15 522 324.12] /Subtype /Link /A << /S /GoTo /D (14) >> >> endobj 240 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 273.727 522 279.854] /Subtype /Link /A << /S /GoTo /D (22) >> >> endobj 241 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 231.559 522 237.786] /Subtype /Link /A << /S /GoTo /D (25) >> >> endobj 242 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 221.054 522 227.28] /Subtype /Link /A << /S /GoTo /D (14) >> >> endobj 243 0 obj << /Type /Annot /Border [0 0 0] /Rect [497.938 208.805 507.153 216.327] /Subtype /Link /A << /S /GoTo /D (22) >> >> endobj 244 0 obj << /Type /Annot /Border [0 0 0] /Rect [512.785 208.805 522 216.327] /Subtype /Link /A << /S /GoTo /D (27) >> >> endobj 248 0 obj << /D [246 0 R /XYZ 90 720 null] >> endobj 249 0 obj << /D [246 0 R /XYZ 90 720 null] >> endobj 245 0 obj << /Font << /F51 9 0 R /F72 7 0 R /F2 250 0 R /F31 67 0 R /F8 251 0 R >> /ProcSet [ /PDF /Text ] >> endobj 281 0 obj << /Length 2083 /Filter /FlateDecode >> stream xÚí›KsÛ6Çïþ:J¡Ä‹$z‹IÝhÜN-Om²DKœÈ’†¢’úÛwA<ÊÌñØ™¤Îä ×KîïÅ.@ãAÿð@$ƒŒR$X>˜ßŸ$úÛO'X¿ƒÁر8žüôžãNHLïçHdv˜ébð×°ý3ýõäbjÇá„<áHZ<ò”‘ÎÁœIOp-iΦLy™ŽÎn×ÅhL3>Üީ׳ífDñ°.ÔË^^‹Š!ÊR"‡‚»b%,U#}¸ºQÿ÷ÃÅÕÅï&êÃï7§“Ë3õÞ\\]_¨±àv±H–4#%j¬ŸGcœfê%í|zÖ—GdpÙ‚RFQ’«X"’Ã`€(w#ªMÇŽ­ j{õG6·€yåIÇåc|Òâ Oè&ÃʉÁT•·‡z[íUœë­D7@ ÉL¬—»¢ºóñeÙM]®ËZz{ðd à”½¿8MÐ{žb—(Mm:nm}4»*šÄ‹³u¢s0y–#J¸CLøðRC•ñpq˜×%pöãå0ç¿FÔ_l°—»–€LL{)Á1ŽH¡‹‰ú´àz ˆ!îKªq$8UnˆVÃu=«Ë¹šÑûbVÍ¥8Vús]:U¡gþl³ÐS„‡W0ÀЛd¶e˜y2ÀѤ†ô.Äò QÐ÷ÒBk£à†3/ÇkˆBÔ—¤€)â™^©¦ðK¹\'Ågüb­‚|^ìçU¹kfggõ $^Â,rüɰSrö¬\b¡ï¨‹Ö8ÆÂ æ^Ž×‹#_ݪ' *6`"ƒ‚E—É4™$ ¤ÉÝ¡†€S:|?Êép[ÝÏôgX›¸rÒ/E¼-2œøsáÚQÒ‹.e_5+¾þ`TõDÎ`Š«LÙŽcùã!#*s½T÷…1L7(¸XusέʬÎ΋ùzVÍä4ßûä" ŸÐ疮ߙ4^ËCHRšI?IµÆ1I¹˜’r¼†$õÝÊ)0XgsÓi5’²¢ºÙÕxØíÖe±ð&+x¹­íÔJïÍVe¿ù…4¢ƒÜO#­qL#.7œz5âx i$êËj„g:rW#DkäÃn4&ùP®RͪöT"j†Ì¿Ù…ëµ´Ò…l?]´Æ1]¸¬ºp¼†tõeuÁ┺º ZgJgÛF‹B}¼ÜÌׇ½í¤AR„ßøÒ‰t?´Æ1¸ì°ðêÄñÒIÔ—-[(#'­NLö8®‰ï¶•zó±xø2ál+Ù,R6¼ØÈuUþ´y ³ü©ž&tPûi¢5ŽiÂåD¯&¯!MD}YMàêh‚Ú– rÄ¢Ü,•Þ-¥\MfkQ”@9lxØÌà €õV¼!Ú:\ýh·Æ1Ú.âÝ v½†hG}YÚ GIŽ[ÚLÓþsUT…mˆ´»õl®¿Z”Uˆ?˹ßìÁÏ6GØŒnQJŠ·© Ü,Š)J;׋M©±C>ÁESö55¢¯Ã×~k£ï Ðw¼†èG}™Í*š³ ß$ÿßups¤…\l (' ½ øËŠ/e½òJ¦(Ézm¦úº˜`udzqmm#XÝPû©:.P£Ž,Ó,GYn˜Ò¶eTHšmFvu3Q_ÜÊ9üP–oLPÂÅý¬Wè14¨~³¶1‰9ä‰÷ÌÉq’XÌ‘•XÊQJ„јY2¦«Âd݈dÇj„‡år%ß×®ú`IQ¦¬É5`uðîN@øÎßœøBzÑQï'˜Ö8¦$ñM¹^Cš9òõèP„BºçT+“u*›3‘í'YUz=ܨèuæ!ðÛ9È Ô˜(÷:¨qŒ#5pÄ{hæz éãÈW ©èµDìNçµÞÅš—w¶ó¨Mž™¨jc>Ó§hÎòfm:ÅL¹.|yÊdD³ìëIBi ‰S¿$`Lc)  {°õÂñbá&)¼ ƒ×Vš;Õ&j¬¦Èœý`Y¸÷ÚìO5» Eµ«Š:†Û=× ÑΠËá¯UV†¨éôãÖÇȹ1 °s¼†èE}~DP” “ÁmUÙå§ÛĽœ³™š³Gt&³Íò0[^Bþ%€S‚m7áØsÄŸ]š>MÌÜr/bŽq„X'Š~b®×±¸/K,OPÊ,1æ#f›9˜ol£ԇʹç0Ùʵ¶.7‘ÔG3N¼ì£F=øéôã×Çø¹1%Þã?×kˆ_Ô—å—fˆA™£ùñ(¿¹,±W0¹¯‘ïÖËmmø½Þ¥)îwëmÓò5{7 · ô¶êò:8²U'úþ"Ïè`ëôã×Çø¹1%¹—Ÿã5Ä/êËòãM9eø¥võ®ÙMÑ[g‰ä=zÁˆRòãù€Ù­3LúIª5ŽIÊÅL½;ó®×¤Ž|=ê áˆpýà×ÔÇÍVvO_ôd§‡åñ“|“ò¾¬g&cÀí†ÜñC}Ñöø7Öi¥˜<ï¡>s½úÇ8ÒŸtÂB½»j®×Pô£¾ úX”g:o¤:úÓ$[Öëº\ëçú&Å]Ý}’ú|ë}ü6ÏP*Òï¨k `5Áé…Õ1Ž`íÄ›zw²\¯¬q_kš@"×Ëy¦±ž–·ër»¬f»UðyuŒ³fÿñètG:œý„ÐÇ„à¢Þý)×kHQ_R$G˜Ø¿Š˜;=…/7‹â_¯ŽrÎߪzýM…Žj?9XÛ˜LÔÛ=9.­þ™þÀ endstream endobj 280 0 obj << /Type /Page /Contents 281 0 R /Resources 279 0 R /MediaBox [0 0 612 792] /Parent 285 0 R /Annots [ 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R ] >> endobj 252 0 obj << /Type /Annot /Border [0 0 0] /Rect [441.93 643.088 450 652.931] /Subtype /Link /A << /S /GoTo /D (1) >> >> endobj 253 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.861 607.522 450 620.672] /Subtype /Link /A << /S /GoTo /D (12) >> >> endobj 254 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.861 578.331 450 588.294] /Subtype /Link /A << /S /GoTo /D (13) >> >> endobj 255 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.861 542.765 450 555.915] /Subtype /Link /A << /S /GoTo /D (14) >> >> endobj 256 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.861 510.386 450 523.537] /Subtype /Link /A << /S /GoTo /D (15) >> >> endobj 257 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 494.712 450 504.59] /Subtype /Link /A << /S /GoTo /D (15) >> >> endobj 258 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 483.985 450 491.561] /Subtype /Link /A << /S /GoTo /D (15) >> >> endobj 259 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 468.713 450 478.41] /Subtype /Link /A << /S /GoTo /D (16) >> >> endobj 260 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 455.563 450 465.26] /Subtype /Link /A << /S /GoTo /D (16) >> >> endobj 261 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 444.533 450 452.109] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 262 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 429.261 450 438.958] /Subtype /Link /A << /S /GoTo /D (20) >> >> endobj 263 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 416.111 450 425.807] /Subtype /Link /A << /S /GoTo /D (21) >> >> endobj 264 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 402.96 450 412.657] /Subtype /Link /A << /S /GoTo /D (21) >> >> endobj 265 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 389.506 450 399.506] /Subtype /Link /A << /S /GoTo /D (21) >> >> endobj 266 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 376.658 450 386.355] /Subtype /Link /A << /S /GoTo /D (22) >> >> endobj 267 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 363.508 450 373.205] /Subtype /Link /A << /S /GoTo /D (23) >> >> endobj 268 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.861 333.35 450 346.501] /Subtype /Link /A << /S /GoTo /D (24) >> >> endobj 269 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 317.979 450 327.675] /Subtype /Link /A << /S /GoTo /D (24) >> >> endobj 270 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 304.828 450 314.525] /Subtype /Link /A << /S /GoTo /D (24) >> >> endobj 271 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 291.677 450 301.374] /Subtype /Link /A << /S /GoTo /D (24) >> >> endobj 272 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 278.526 450 288.223] /Subtype /Link /A << /S /GoTo /D (25) >> >> endobj 273 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 265.073 450 275.073] /Subtype /Link /A << /S /GoTo /D (28) >> >> endobj 274 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.091 252.225 450 261.922] /Subtype /Link /A << /S /GoTo /D (30) >> >> endobj 275 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.861 222.067 450 235.218] /Subtype /Link /A << /S /GoTo /D (31) >> >> endobj 276 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.861 190.087 450 202.839] /Subtype /Link /A << /S /GoTo /D (32) >> >> endobj 277 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.861 157.709 450 170.461] /Subtype /Link /A << /S /GoTo /D (33) >> >> endobj 278 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.861 125.33 450 138.082] /Subtype /Link /A << /S /GoTo /D (34) >> >> endobj 282 0 obj << /D [280 0 R /XYZ 90 720 null] >> endobj 279 0 obj << /Font << /F51 9 0 R /F72 7 0 R /F97 283 0 R /F75 8 0 R /F52 21 0 R /F59 284 0 R >> /ProcSet [ /PDF /Text ] >> endobj 286 0 obj << /S /GoTo /D (Copying) >> endobj 288 0 obj (GNU GENERAL PUBLIC LICENSE) endobj 289 0 obj << /S /GoTo /D (Contributors) >> endobj 291 0 obj (Contributors to GNU gperf Utility) endobj 292 0 obj << /S /GoTo /D (Motivation) >> endobj 294 0 obj (Introduction) endobj 295 0 obj << /S /GoTo /D (Search Structures) >> endobj 297 0 obj (Static search structures and GNU gperf) endobj 298 0 obj << /S /GoTo /D (Description) >> endobj 300 0 obj (High-Level Description of GNU gperf) endobj 301 0 obj << /S /GoTo /D (Input Format) >> endobj 303 0 obj (Input Format to gperf) endobj 304 0 obj << /S /GoTo /D (Declarations) >> endobj 306 0 obj (Declarations) endobj 307 0 obj << /S /GoTo /D (User-supplied Struct) >> endobj 309 0 obj (User-supplied struct) endobj 310 0 obj << /S /GoTo /D (Gperf Declarations) >> endobj 312 0 obj (Gperf Declarations) endobj 313 0 obj << /S /GoTo /D (C Code Inclusion) >> endobj 315 0 obj (C Code Inclusion) endobj 316 0 obj << /S /GoTo /D (Keywords) >> endobj 318 0 obj (Format for Keyword Entries) endobj 319 0 obj << /S /GoTo /D (Functions) >> endobj 321 0 obj (Including Additional C Functions) endobj 322 0 obj << /S /GoTo /D (Controls for GNU indent) >> endobj 324 0 obj (Where to place directives for GNU indent.) endobj 325 0 obj << /S /GoTo /D (Output Format) >> endobj 327 0 obj (Output Format for Generated C Code with gperf) endobj 328 0 obj << /S /GoTo /D (Binary Strings) >> endobj 330 0 obj (Use of NUL bytes) endobj 331 0 obj << /S /GoTo /D (Output Copyright) >> endobj 333 0 obj (The Copyright of the Output) endobj 334 0 obj << /S /GoTo /D (Options) >> endobj 336 0 obj (Invoking gperf) endobj 337 0 obj << /S /GoTo /D (Output File) >> endobj 339 0 obj (Specifying the Location of the Output File) endobj 340 0 obj << /S /GoTo /D (Input Details) >> endobj 342 0 obj (Options that affect Interpretation of the Input File) endobj 343 0 obj << /S /GoTo /D (Output Language) >> endobj 345 0 obj (Options to specify the Language for the Output Code) endobj 346 0 obj << /S /GoTo /D (Output Details) >> endobj 348 0 obj (Options for fine tuning Details in the Output Code) endobj 349 0 obj << /S /GoTo /D (Algorithmic Details) >> endobj 351 0 obj (Options for changing the Algorithms employed by gperf) endobj 352 0 obj << /S /GoTo /D (Verbosity) >> endobj 354 0 obj (Informative Output) endobj 355 0 obj << /S /GoTo /D (Bugs) >> endobj 357 0 obj (Known Bugs and Limitations with gperf) endobj 358 0 obj << /S /GoTo /D (Projects) >> endobj 360 0 obj (Things Still Left to Do) endobj 361 0 obj << /S /GoTo /D (Bibliography) >> endobj 363 0 obj (Bibliography) endobj 364 0 obj << /S /GoTo /D (Concept Index) >> endobj 366 0 obj (Concept Index) endobj 367 0 obj [277.8] endobj 368 0 obj [272] endobj 369 0 obj [285.5] endobj 370 0 obj [285.5 399.7 399.7 513.9 799.4 285.5 342.6 285.5 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 285.5 799.4 485.3 485.3 799.4 770.7 727.9 742.3 785 699.4 670.8 806.5 770.7 371 528.1 799.2 642.3 942 770.7 799.4 699.4 799.4 756.5 571 742.3 770.7 770.7 1056.2 770.7 770.7 628.1 285.5 513.9 285.5 513.9 285.5 285.5 513.9 571 456.8 571 457.2 314 513.9 571 285.5 314 542.4 285.5 856.5 571 513.9 571 542.4 402 405.4 399.7 571 542.4 742.3 542.4 542.4 456.8] endobj 371 0 obj [486.1 555.6 444.4 555.6 466.7 305.6 500 555.6 277.8 305.6 527.8 277.8] endobj 372 0 obj [388.9 388.9] endobj 373 0 obj [514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6 408.9] endobj 374 0 obj [500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8] endobj 375 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 376 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 377 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 378 0 obj [1000 500 500] endobj 379 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000] endobj 380 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 381 0 obj [656.3 625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7] endobj 382 0 obj << /Length1 749 /Length2 1192 /Length3 0 /Length 1720 /Filter /FlateDecode >> stream xÚ­RiXSgŠa0V(¨ÎE'dÂjµa `Dpá’{W½!¹¤ˆ–Ý‚T´ QÁ"!3¥¬F¬ ´V6Q‹Adëd). ZR Ž3Ïèß>ߟï=çýÎy¿÷kËà„EÃl ÅT†àÍñbЕN²¶öÁ Ž`¨ˆÃÃݰ$1€#‘wñpröpr!YÞ˜P&Bbbq€âm»DrXñ°á(ÀñX8ž¨Á@ÆC`\FXÀ]z!¸°%•Ä`ÂÃh8AI´%A(\_‡!‰ðM*‰ Q…i ! Èæ“hÛ1¢L(ù+D½]œ-¶ƒñKå—Lz' Æ#ÙX¼P‚Ã"€ƒA°}›º ~­Í ¼Ó%…Æ`€þ:„ˆÙˆ†‚œ ðA^ŽÃ(ô¶µe´ÁÛÙAv¯§¹œ ß)þ·êy3þ‡ oDˆˆ¤SétA$ΛÛÞ·zù¢< BPb˜.(2±bÉ A!X ÀRB0Šb8ñ Iø˜ˆ´4Lb"4p)´Œt7€&X†ïþÈË “&;¸8ŽL¢XW&=åÿˆ<‰H£øò®¾¼Á|„p†¥0Ô§Áxž ²*ù–ÝR®Ü¤åÓ˜¿½¶åçï Òï×|Ó˜°i¨&|¡ªÈhõØÊ±¿'-Zˆs.ÜÑÅ~’šêî˱Ĩ±¢ÏÔáO‹8² séS䦆žg™ZAw†:*Oî.ÿQ1}}êl0Ågç¸î€åŠ«‘‰uW‹3\\ÃÙE‚ÐìÌ'KîšS •Gœ³“Öœ<¡3Ø~è@¶ÞE»þì²díB™Þ™¯^î_ñ‚·*7Wl~¤70¼ÿÈbkZŠz¸ÎÕÁy-käô¸ª´¡²þ&‡öO‹–¿Ø-²½¥Iêß÷l¹T·~aÄg°­ÊbsG ˜–ïãŸÂ^ܽò²ãC‡êyAËšYím›‘þaPùˆ2Õ9çWs:Åpµ'ìU!œöŸ5Óýb}Uî®᫤P\ÓesQU²jåY7“äU,Ïû÷ËêÍ·˜ä¾w!ìaŠó·¦êsBÒÆšöãk ›Î_‰`–DuI§C­]3; µžk„U£)xúQO›ƒ0¯ 6ÿa]VÆ?ö÷ØS²óà9ë ¿´Ûªhmrë—¶­a_“VL<­–Ø÷ϯUÝ-jRs=FåᡳåZS:Ã¾Ó 74€>9.¦7_8Ê’ 3Œî›+È=Ùp½èáúÒæ\Ëôä6ôòëõ©ÝÌ ºîÛ´±“•Ÿ#‘k òò¿ì2yÜìB¿öDež•­šKŽtX80&,Œ ;œÔ½(’ßÛ×¹ÙàRT¬¨ÚF«ñ×ø4Ýùçq\Ï+9ŒY£œo×Èi07ÓFaÔøGñÇLý%úy©}Ü_^º16@?î[îHô3Ì“Œ_A}vd¨ïhëõ{ úÅ´·(X%yUèpÐY¥}Mf;eD_TÛ\>e¨¶„²v¹UPÆøíôŸ=R#Àïþµ¼žW£f/>}¾8$¦†üé´©ÿ‘ã\ ±¸iȶ({fÎÍ«î|ò‚¿ujKÛMrâ*y&¢8¨×Þ?§ü¸srÂHwÝõ¥¡?x¶ ä&ûÆ(ƒTãùÙÇI׎ê˳øÆm¤¹aMÄnõ‡[ï©öª•©~‡u™Z=ÍÍ#öf@ ìqO‚H”ü(•Áð×RÕPx_¨ÿPÞø¾ŠožŸ°«ã-T:g[;?ñrºÑTGYm~¢"Å!_"W}¥}Û˜YØÓð‰ï›uj«pËȺy¹oìÜ­?¬zÁçu•qµî¬Œèk§¯™¸®m0#™Wš÷13óC_íþ¾ÍeÚžOй!†õEú¥CÑã&úqÆwz)|jT±Õ-ò`©>탾Oum¾û$×Ãg6¹!š¼[hÅhDjðÀ~G}‹´K5õÎä9Y÷døù#E “,u³ÔAžµ:ljKNK 1ºš l4¸hhù¨#‘R;_;éÆmZœlw3% ˆÌÊ´çžRð3©å9©I"+ãnOãC:|ÓKìßg¼KójS@P®Ó~¦±ë[[MVÞátv7 ê_«Å=Ñ|y¯ŽœÏòÖybÒµaZ{k™2nþ)ê½á‘ʧ—nÉy¼Ãî鮱ǮÜvo1ѱw®mu4SÿÜ+BA endstream endobj 383 0 obj << /Type /FontDescriptor /FontName /TPNFOK+CMB10 /Flags 4 /FontBBox [-62 -250 1011 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 108 /XHeight 444 /CharSet (/a/l) /FontFile 382 0 R >> endobj 384 0 obj << /Length1 1619 /Length2 9996 /Length3 0 /Length 10902 /Filter /FlateDecode >> stream xÚ­–e\”ßÚïéNiéîN锩¡†‘î•îîF:¥”éî–éæÌïól<ûy{>óf¾k]ñû]ë¾× •º«¤%È(r„°r²q ¤U¤ô8¹œl¨ttÒ` Ää(c 89’­\N>!n!^T:€4ÈÉlkm0J¿ù'ˆ éÛZ˜9TÌ 6@h 3{€ÈÂñ`HÚÛ4ÿÉph]€`W %*''ÀÒÖ0ZÛ:¢²ÿ£HÁÑ àÿ÷²åG§ÿÙr‚] ¢ŒP‘oP‰– G{€%Ð •]í„*ùÿ!ê¿‹Ë}´·W5sø§ü¿¦ô¿öÍlí=þoÈÁé#¨€,`ÇÿÕþ[œÈþµQ€˜ÙÛZH:ZÛÿ^²u‘³uZªÛB,lVfö.À­-ÿ[tlÿÀ®"¥-i ËüÏó_›êf¶Žm§ÿ”ý'ú_ÌùÂÐé€m݆lœÐ@èç¾ÿW3YG ¥­#ôàå˜Áf¨Ð'J¼/N€­£%Ðt‡*fgsA )èH|V 0ê?ÇÉÇ `—ügéßÄ`—z!~»ô Øe^HÀ.ûâç°Ë½'€]þ…¸ìo_ˆÀ®ðB<vÅ‚jQz!¨å‚jQy!¨Õ‚jQû @µ¨¿´»æ A»k½´»ö A»¿{!h?Ý‚vÐÿAŸcv³‚j1!h¤Åˆ“*Æò/„NøBÅY½ tÓê/ügÓö?ÈËýº¾dóþ³úþ«4Äú/„Ú³ùò@íÙx8ÙÿŠ€®Ùþ…P_þB¨1û¿êÌá/±Pg•úG<è¥4äø—ÓÌ8ý¹¡œ€`  #ä%…ï_k¶ —qqC«8A_ཧ/Å Æþ²Í uáò2–èú—M^h¸ ômzI€¶z)Ç U±ÿš,ÔÄ ôWTïÇ¿:׿*Óí¯cƒfÿÕŒ ZÞãÅ%4Õþwíÿ}kHIܽX¡GÍÊ•ÅÉ ?/‡Ïÿhñ †î_2ôîù¶²…ÞT@ ;Ðu~d!l—ÜZê+›?V†À+eÝ£Z×5ÙŽ4 k_ôSÉ™i¥Vï®< ó7ÂoJ·R—È6oa¹“瘔é§ß®¦¿Ó<[HõÎÒT<¶¨¯ƒ°¾5N]òªM¬ •&èôfžöäª3Êhï -QÁ|7t­ÿžÌǯ'—fÿ.,¤–ž›J;Ź4œ'lÙ ;!~y4È×. ¹™yñ¨í#î]>rNüÓûW–Ã:¦×JÇI›w1¿®qküK"7?樤êGU>˜.QfpÚŸ}NŸb8g¥~ípZø:•U`p«†LÌS&¡ÈaÙÚ^@õ¦&¦ŠÞo´i9¯ÍÆÔ@õŠâWþ ™’üsC¸§ðÑZý$fTk' †“žè³Š1ý í³"·RÈ|ôLˆìce½_*…KL æ®\aU¸U6µ:íôv(«ÂJÃÜáPâ¼TP/*Ÿ¨MAŒ³Œö©È¦)Š,N䇮º2ÙxlUèÝÛ÷YQþeÖWùÌ‹/àªñ¼B!J–ôv²êÃåæ/ Ž`k%1ú7 ±W\¤FïŒiõt##vX9­ò{g%êÊkF¥Ð9nuÃDs”OéŠy!+lj¬ÆªQhÒˆÚ£~<$¤‹bônß\U+õzC.²þ K?Áae¯ÎÃ|±ÂØFKŸÍ+§¶qfYÍ`“¶èl"Jç¦Ç$ù’l9gs =éYÎ,˜ôš’ÐN6!äÓMùÉó[î¥Ô` 0:«¨¼³—³Øå1¶Ù‹lŠ~˜í—G_®{ê%æ£ê½‰9Ùt€ÁÁÛ‹ÿ¥dþŽç-þcÉæR–½|–ØqNŽ¶ß òû ’ñŒ=¾5ý(Îd€_ñ7Çw£Ó'à¯ßYÓ’>Ò’y:s~`Ãÿ²‘ëÂÌÇ€U 7Ä…ùmc'0`ø4“ ÜèŒÇâGAÃíýqçEütG—ú’Ÿj"˜ûå–pû§“ˆo|0A ¦K°xŸYæြ)ó6>ëA^HKtî/ˉʖ€ßòoœƒƒ5òd—¯Ê„éö*¢ä8ªŸ¹f<**CúU‹®±iMÃE?YÛðïl1—œ¥…b°È»KOw#é9þd‘ŽØ¶)d†b¥þ.¶½Ò\°-¥LuoiƒóÑæËRÔ?&{5X}F¾Ew1 º;x‚5üóïˬ·çXÁrµã…g¡I઻P¯$Öò)œV¢·dwíG½í- ÊM˜æ2æ*Þ=ƙ؀VG/úÓURAŸ}îïqb¤¶³œ²ö7,Dë²Úì&IcË˺¤gË Á¢¿U¯vÄ“ß2~f®Ñ^ÅêôäD±XûR^‹[,ðíÑ®âs^hÎ !7z²ôh473Ä$ØùÇüÝ4œ&V•½'ÅgZ̪á¾ÙØjJ†ö„7šj‡vfÔÎs‹,Í¿ÖWãʪ—43åûß1zƒ|Úû¸'kÏײøtoζ…ý'\(¦ c ¯Ï)íYý­§ÐîᣓsKìôÅé‹Büf/Q“ØW¯¬ôh£Ï+àdˆ¿aS w]JNàÉ–™¼y4P»F¤¯7—"¢@YÌß–(úãæÃRŽ÷iõ;Ö§•LžüÇŸ)Q%Ø0ŸØù¥b΃@QÈe‡n×Q#GÅB³)´p€{l‡ËBdnô@~Ò{¶Æ´[(°ŠŒQÃüø&Ì{µÏbŽç¾ô ûq,³z¿Ÿ¿9­c8©a­H HfïĹÊbO`™Iñ÷âu] öÙ¤n³Â÷»Õ·f‰{9˜} ìB Ä’²é^0ØŽÛ/;žŽÃáí)„}8Ú‘²¥&%·ÒÐaV…óêÌäÑ·4™?]ÇÐ '»‡É°xs–¼ËшL&- å@f0„#9øÙ'Í$TdçA36|ŦÀ&¿YÂŒä=¥ð + ˆ,Ý"å8²:{Ï”ýSÕ¤¡ñõ°½ÍV³*³à!û,Þˆu;D¿PÇù(=ç=y[†–q±½®•ÃI÷2Îu÷Sw=š;#WŠ’´ÇWÌ.º<¿XÊžSkHŠQ’`…Ë»«Tãbg®¡¯"Ùa¥@:ˆr©ÐSaŠ7*ÕHk…Â’°²Q+ÊÊi®g3ŸÕX±»è¯Çèøø®KöÁ 2êº )|ø¹Ë[Tf¤o/ì}“'d„ôí B¬'ÞÛ8ÿ$Ç€]D— íE¦ÏëÒ\‚mÞ©J˜Råæ ÁU\ó "ÈÊü< ÇØ$ØZ)îõZ3·î•DËŒVxÿÓùe¥wñ6WÞÔ«|°Z)ªÉѬ§Fmr²³¢£Õ€ƒ[錢Ly ìI“ã½ÉÞ9ù~ióDhŽì;æWË9µÍTÖÚºŽte¾ñˆ±{r°ç,óï"y=!•ÉñZ„DÏx!ìo[|é‰!qÔ9iN5â*D¨_Ö¼®mØÞ#×E'ÞÏUŽ„h’­Ó½>cÇä¢\ûÊœ®—©‰ïsäv¥qò©xP›l633¸Òà$«01rÛp¸üꇞìöªî¹(“1êSºÕVý¯"½ùKVû+~ßzÍij¼lÏø«_¹pËoøšE˜!8·?)5o³Ï6†vx¤¼»Á!öD}ÖQeQ\™èÓ¯Wôv©©€¨Žb¬"Œ¶òB‚ŒÁ’ë–Q%-©!×XŒ˜qä»×™‚ÖF Bï”ñþ€Ä®$Ì;—ÿÚ‚Iú2:¨YÕÔ…<~dçÀðI°Ø“z÷¼©ƒÚ¶K<³¿„ˆ·ÊôÁøZ¡OÞ¹èŽÐ°#Ї,Í@À†)f‹½h®àwüínEÖ>‡’S#óÛG÷ÒNnÙ޼òª R2S½G®h ºy¥Þ˜¢UAqìWOúNñUKÅ\SɤÃô­m#}¬ZDW/æ Ò0Óà9vÅYœjs·RZÞGä ûHx—†ÔÜt‡÷p÷]±ºóQeÏ»¸v sµAŒ_#ѯ};„rZœW»Y¸[ãQ‹é¯Ý´¿pö_8ÜÖnÇ}ƒ±ä¦ÎPò'/sû—˜Iê«üæy|k`£3dàîÕt¤9ã¤[ö"CªV²Zž[Cnvo<1ÅÐaqõÜiRÇ Í)’ekŒ8žZüãz¢¾‚„°3Z¹mßÁ¹Qn½æËÿ R€.‘—ñ VjJ>O‘hð:\+CÆæ!k|ú“cù½§~Ÿ uá J2Ó®°™s\Xÿ@kSÐâX'ÍÛV¯oœ·RzK÷müÍqÖJT„‡¾Úƒz&,,pÂ…Ä`_Î3i©{êÙAE{ʶA1Ó3ÍšSÛ”~4Š[6“In$$³j±³À_8û—oFl@/][þ¸;~òˆI(É[)«¯ÜÏŽU¹?gÂASg¯‹†\-Ošf¾=„/×*.áwí[Ÿ×Œ¦ýo½û#üCr|7`ìÖÙ*ŸzEN€öìŸÊïÕþ±<‚‰²=/”û%ƒ&qKâÜŸ@'ä:~+éù†TÕy“z$cž- ­ŽÆXØÇ­W¶Â‚< Õå–ÐÙÓNËÍë°kûÙ˜›`Êœâ¸rÖݲÝ]ÚïÜÆ»3‰hô!̂
ŠjÙCÒr ¡0Ìà†×&xvë1M3Ê×T·wÈVáUrC.›¯we Á;W;ß"¦ÜŠ{æö}£`§í-¡ ŽHK˹K˜ì§'ºÜõU‡5-g.=ɶ~ j·Nv}EBò0 –6‡ÖUÇŽ è$išhÿÍì7‰Æ!X¿¥^‹V¬ „Ú̱ù_Išps »í]ÄñEóÂãoí¹Ä’þ³Xü¬øÃ`£?f@ýªÖZBcκ½R~¡ïg†…'0Ÿ­ûH¥¨éoWä1¶cŽ6QÌw:J…×êÏëh…›¾9O•&ÃéóWך~þ|¬¤•Õ¸.'ÁNAz²¯«7nK“^Ñ=Y´“¿¸ ZöšüÃn¹Ý¹›4'}uX§CH»~zŸxFÊí.¤:ºh†T&€?NËà–œLú}õ†EK*&nü°êÛI¡F˜ªÚyZïayERC¹mïõ ðFûZsÄ÷G¬ÇÃï8£{lü{@˦qÌy**÷™ZW­!I–Ö{GÚ¾ %£©&ד˧‚¢êÒT3ËPÔ:¸@Øw9Dkˆ³Ôø—®FrT› pkY Ýj±7ü²aÆcBõÛqoöWø×[®–|qIý˜Éª¹a¬ÄйgÚ®®äøÂiÙ~ÖZL-~$QáílÄ¥× ì̳PãÿRpÝ"˜c*¿òÝá}.¾/ i%;ê2"!ÏF¢²4ñNêBV÷ž®^*&àpEXŒ[.l±ùU]¡d„)IâârZ¸—V«yÀ?<„Ú)õlÉ ûé=5—|• $‚Ÿ·w@DZ×¼Îyù›Dcþ~1Ý›Åòq늼ôCg—Ÿ»˜ÄÉ:5 •'¬qZ˾ީdXbÏžG(­î>"ý|Ës¾G„]õÌ£–*1z?íæêù¤Xš=WpoNzõ6¶%®3q&OguØeßYÝéj|ŠŽ. ¸Â)[ áÉ"jÈô—R¹qÈ|{Ìy3Dš„[vÞõ«N°Ñ€£ ýÊö€líµòþéªWϬFw q£TòÉŸš}õ'nÉV% 3äUç¹[ÝwªÔ:$Â?¹»Ø€‹ºÎ?#¹4rjžé‘Ü¿kvùVí n-Gi…y¸õrʺ±q¯px\¨>¡Q²­Òyr6T3ÚIêµ;[=v®7%0´ Úä0g~†Ñ¶Âh¨ã8˵”j1ùÌò¼ËFð`\t³\aG3H‹ñ2ùqáÖý­BúlëÖoKPÍq#cL+œÍxùˆ_°‰¾ýsKe½¬XÏ 9e0O'q}±ÔÓWGM<°ò†®v.ì¦Ü¤ ývRqWKp#Gû ÙÞ=2ç´*SIÂ:³úhÂüGì¯?§À÷Ò9Íq>© fNæäÂ}dãPÿƒ£ŽÆŒd`@´Þ±g™y¢„‹ÞhŒxxBNW8gà”þ¹‰?ú{üÒÁÛðÒ¿ÿ½±æTFÚáNIö)zé^øGºÆ›è¡ ýÎÇðGõ¿›êoÐWUÂÅwŒò!"ºÚvÍ1MÆŸ;ßvpo™÷g$†ì¡<¤ø•˜#ѺïŽWÏ,;=dGþœØAƒÏY<¼Ýœnom9"aÇÕ EÞb•Öök™^†™%Ȥ4ë®F‘ð¹N¦štÉe9K9 ˆ‹3-g6!ïd$7]4¸ ”—q.‹=É,ž­ ¬ úVÕ®”Ã}œ»2àÎÿ–æT=Z·õpvÁ¤ýóÍ›7œùFM« ûê[ë$XÔÜŒTv¯D59líº¨ùû™\¶üZªev^¯ _!³Íýbù¬€Væk*‡Ì ‚ý1à ”?~Œý]\Z—ØUZC±ƒFîoëô™ÑioöÓ¾GáŽS›¾/|bm|¯;Æ!Ÿ“^¸öô„h›F‚ô¹ø§Rcy¼æÛQ‹¸FkïÃ0PèÏCë⛦ˆd¼‹x‚ÇÕ Š[x¼7:'ø'ƧàÚ~5­†jÛw¤#•ˆS²Y†kÇ «@쾺‚Ì"Þ4îâAàT[´ŽjÏR=*¶oÇ¢hXNºb¬¼ÃÚØÝEµÜé(ăz©c+Â<^ØôÞ90$õ’¼¡ˆW–.2kCú·êbõ^ JW͘ÊÄœá»xÃ|˜x¸t8¯½tÐ~kÊeõ_‘ ÃÍk”Åï ,ÚwpÏ\±g£Œ¿íþ%bqa@²ñ¦5}¥†û0½lNþ$Y"PD£UÈM¡;¬ŒS´EwôÌ¿ ¿}®§œbÇ|–ž’šc.¬³tޏy|Cñð›C‹s¢^ÛÿÕþ<šÁ¬ qJ?†=­a¾€½øþ9”Y UnM7Ê®£°˜h9jœŸV[Éc–"¾€²?OàþúAÜÏï«Q»Fb Ÿ.zlžK†â$çK¤Ó`p¼¾CQ9#*}¿vš­£,6ØMÕIÓå­M.”‡¿í;ðû~)uDô–þÉPí°"ľÍdSy‹ÆÔš®áÏ™‡:ÕwƒS…¸5—´s ËwR' *µ“üiF¦º¸;q¥ÒË/Í8m ªËí‰_Kä%Ñ®]°9›&þæÜoµžôJºHº¯eJ“¹š)wñ(¿ ï£ «yÏÏ-‰¥kP*^Vµ°MïTMamÔ£•ÄToᯠH³c’ó7˜œVÉQ ½¦P=D•À!2‘PTl !ÉK<üM?üVîR0ŽÂXݬMofG"®*JˆÒI‘m±CÚ"âGäš^‹R•§^üºOE`ÑpEö”d’‘ËÙ .8 §Œ_ÞKËJÞ+.Åp”ÛÄŸA~ÔþµegÙ;²‡©@«(þëE“#G=QÚ³Õ¶îÜbÞ"î}ê7D®_Je‚HíÏ*."òW‰¿ø õ8ƺ¨Ö-œ"²)ƒ=^ŒÚZìW¯±Z†—øD|x,UIý½¿ñ3¦ãÉNzSnÆíU Ëáûj¼B!Çpt㟢1eIo.>ÀP›¬uw^í •¿šö.¨çî§~¸d3™ÆOm «Ý*VÙ3›Zæ2O»à©ÃAÒuIö9I®²íoo%ZîòÕï’»2DXâž­;‹ob4ä·LŸ}ÉF'6(ê`Žmüu‰òÞ| ’ÂFEUÀVæ¬pd“Ka¶êÛ‹Id¼@:ð y.§†8ÅàŸ?h’Ιîë€ÑØ ý2EPBo©×¾Ž­°û+Ç5„Ï÷ÍU[(Œ¼SM$¢ÓBž›ì/f¥Ö[±†c$Ÿå¥ðï\]¥éý“£´,Êf¹ÉéûºFJmN’»ÛÅ-+SpÚàü˜)Åòÿ YçæXláÖƒ(XW#^ó–le™tÝŽ$ ã*¬ÔûóçH>1õ"¢È–®æÜÚãüX*Xv÷Mžèà—ä¦ýÞéRM¸ÏUîÜ«8挵´_ÛJ%-„vÂü)ée* ¿\Ë“¹"8*fD€LgxïÌàgj¢Å‚ùvýLƉ•ûáhV1rBkp:¶7¯Ç³ê+Xx»‚©©9®i&.T2=ÉD±©Rº\Ñýƒ¯¢&%^,ÚäÛ«Ä”V9ëDQÿgr÷ð#GáV鈹º'èXßùÚ÷Yìð,˲…뀪ŒÃëN3ô»åØö8"?_¦rLZX>ê÷HŸ×F’\ê¯FLfµYØ%ÝU'rû-®©t2Ê…¤A=ÐëSe»’ö^U4'³ ѹíq k¶Ã1à>%¹yð°¡ÆQ´}e¥(Në{Lpø¬¬g›Q­Ö­3¤ ®4PTqó!d¼Î¢?L&|ªÕsÒ&mb±Å"§2k²Û}MÞjÓ‹—³cl×w£ÙmöfN-Q²è@{.ÄÎ}Ðú“2Qd Ù͕߷³©]bÇE“¹Á&ËIŒ}îtƒ÷µO%G`ï)dGu6¤VkÆÖ ÌDÇXöh´é–ç‹a™Ž¿v(\ý’–9Ȥh»Ñm è÷/ž`Âþ`–8Š•[Nú»¬œƒ€sã¼–¿mðÊ2túm„ÊylRúbØØ#Eûœ5Y¸(Bx§!(Ÿ5`Lµôª¸ åú6åäéŽÔ"Šõí“Z„7r>¯›­s‚ó(*:5-º=aÝýÚ ãsK¹®’À7œÑ>6,ÅÎP â*žø  áQŠ5¼>âa’ ß/ØÚ4}'"ŒEÜK³ZÈ7ñáé©%™Ï³q_}§u3±˜ïd·(ûº*§´˜ség(ªÞ|nMº¿g)ª°þ£dDœJ!$ê‘P°qkº¤¿~wµ,~+Y”÷§êª®¨tÉ´'ê)NQû$×2ÿ+àŽöm¾e]ÍÞ¸¹BýœYÉàk§šëTå€1ü_jèFDâJÏ5þ4ÆçTÕx·ñ’NEQk£k=šUb…Õ²±Q“ «·?öJç’M³™ÌÏ7efr<Ðó>ëf@$³…â÷¶«_M~gDZ¾vpd ;—¸1CÕ{WøËÐKÓvòU=c~Ê^•ˆOSñS[Y8D£<áù¸´’×(KŠ2å‰NЉñ‘ÇKŠ~ê[F´vÌ¥$ž™ E#lIºÛ¶NcÛ^÷miBU·ù,Qg1jèb!•Ø´:Í«xýD'8^>›6öã™"n3EPuâ´Ly§¬¡jÜFŠôt\t“,¿·ªipG’¢‡…*íÝEÿ!Q)ö½oµuí,DzaþQ\::ÎAÙÎ’oõ ­ÀóeÃ}ºWÖ» ÏAÌ”x²xÙ­:-)ì)­Câ´<¡šØ Ð^ÃJõ;øÖ¥ÂD¸–Ù…k ’ 7íáÔ&u[>rDQK!ÑD©^Ê›Ü\è\¶¹WàÐÐ1ž°!o‡ä‹Ós8ÍÅ:1&SX²¹Ä¼åuq뎱£Ü*ð$Ò$½ð°´"¼Bj£©挶nPƒ×áÓY÷©eˆ2󱆑PÅëpgÀ.½J¤u-ÂÕR“Á˜kzW7?ô×ø’ãþ! ‡Óðä©=U=‘ÍæÙg÷Xžçg6ßÀ(Ïô=ÝOùdϺg¢‹l~èÁaZkáÕgÁJnïùàÉ@D¸ÏϾ¸ÿšáL­ÍmÝ9ù“«ó–Ëî¯ã݈d†Îx2ŸwÃUߪ/ËfÀN™šé:qÓƒÁs»Iµc³µ™§W.“»0 ˜§+¯¥ãE6f…ÂàBdoùðï¶.Uwܳ„¢*X~,ï\ •UÙ¥v.—B 4´¯…\]…TGiZI)”¦öxC`*Äè˜ÔÁf,Â4Ùf“¯“;µ8…‚vØ•Z&ß-d¢c”\4rh®—>8×FäEIÊ(ÓÈ¢e¯ÔT‰š3 ݾQàtCªšÖâ:!0þž î2¨×˜DO*Huk»ìUú¼§‘ðíD±$©;\œ–¡À\ÇÃÛŒð¤Æ„¼žØ°4£‚ws¢g§ Œ$›wm¹Üh'b«^no ¥l8dá0ÛÔ÷×u´è>çsÀ=}n¼£~Š˜; xrdz½ šjœFûnjnü¸÷ËG¯Ð-x ; aØKµ8HqŸï€GË/<Œ¼_<‰MTú©z«íOúŠjóõtì 4³ç¹xÕ´°vÌžXöèQky›¸´±zÌ]÷¤øF¡¹Ïr4áhæ ·Z‘?cböW3‡âÅQ¹¹Úöú'ó¢ì'0'QoMÖïÃMýYqÜÞÓ¿?h"7.âWA gZ;+‰ÍS[èÔ튪½LÔ¤ˆ%ûH‹•ÜÌ÷d^¶3Ÿná4ºq&EIôä·åÎ<Ø8Â/óñƒ§°øAB«(b³á¨Yî—òçåôÔ@Z%­Ö·Zì.GѶ8Ä'°ÛÐÅØÛæ†óû:Ë]âèÄ’\œÇâZ*X°é´XÈH(¹˜qY¹~!Iü4>¦?c‹Û·L“Dֳ娑…‰¿NmLŒ<Ä\á˜y´¿ùÁŠFoË$8“•[Ý  8"+Õ³ ³7:mßDkXŠ£ OøÓÀtå OªÛå Ì?ã7G¤¸ ¿«þs‡l%*‘ê´Hµ»4@™R2¨Ÿ]ÆûýÈäð‹ ‹e9A!Úd;eYAÚýa/žéÛvEU–‚!£3Y;|z C¸Ým7ù¢éUgšWŒn£X¼Ýž!ò ™}ä2&ù8%tÜž8ÒSæ:Ò±ûἆ­-ºN‡8[Â’)ë’ˆE·‡;nüõ¨ØóÌØ&J[ÓTš©YX‚˜ãÇ®öóÄÔÁ”Òú+rðÅÛ³ìš_Si¸øýÍ"§V6`¸Ï€‚XgŒzÜÓaWvÍ÷b3¸M~&¼ÈšYMÌËá»æ_S¤5§@÷>–?t#A£C*ìæ×–FÃÒˆ«Ù½éM ãkâß—mèÒ×AzÕSi ì¯YÞœ<2?°k IÜ‚ð oÏð j®sMS“0â´t!,¯ã3¼(·âèIÎ7Â’GóùrYÇ›âƒùË]²¾Æ(|¦Úwá£PÝ:ƸàG‹¤!èdªˆ¬U$V*1"Äg%Õ}˜û*1ì1m,«+MÆ9§›\3â‹#Bò ®Ï_ó´"›þõ&ìÍeóV¦ÝYDçÉd¸1\Ú&E^ãø‡YžÝBßõB¥RýÙ'Á>ݲö¦·~šeÉBÔŽ7G³˜v]`æ'$k=à j4Þ)‹û"×âQÖÔõS¿v~MÍHG#vÕè Úq’É`ÕrOz,⣪1ÃÇ@eI’{¢N®~…ªz•8©F¬ûwÙú”‡ÒûF”ˆ!Ÿ>ïy~<ôÒ ë8\‹p,°ÔýF_;ÑgD˜C]³ë4ÏéO½Û0¹èÞýV}Á»­Ò*…Ë‚šG‚|Û_ñSJøqxBs™€Ä¯[ìZÃÓúG­'¼}Ù/Ïèâ¦'”Ì|ý¤è–uÏæ˜¬ÛCqÐ}½zF2† ‹éõâc%Ù‚ÏY²!è½AÂ&gØ'”ïø{½^ïºWôTS¿">™ABf-õýëŒn”·'"€“ ¢MþQ]ž‡z­mÕšQTkG"’%ä5Ì]< ïR¸Í$7å G´½ ·²à%´B*Å_¨ëÙûŸ榈J?˜V•ã¿}¥íùvZÆm²^ÃSíg;fÞq:ôÁÍà|_˜ôJ‘ÝD‹ù—³^-u«W» tÒ H‹L³í[i•&ü-´G!û4iRw>¬!„ÒtO¥ÞXá»êaòç'³g†­Ê5ÈC§ ëº_?‡˜3™ôfØF«ø”Kà“Ÿ`(žÎ W­šJ‹¡¼'‹>*‰0ã3òß<·§¬“õO¤^€ÕÊjÿ²5p÷#R£ƒRš1²÷š´]¡4ã^Ñ*r…†“Bž@´øu–Þ»Àäÿ³Ê_ endstream endobj 385 0 obj << /Type /FontDescriptor /FontName /MBTAZE+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/W/Y/a/b/c/d/e/f/ff/fi/five/four/g/h/hyphen/i/k/l/m/n/o/one/p/percent/period/quoteright/r/s/seven/six/t/three/two/u/v/w/x/y/zero) /FontFile 384 0 R >> endobj 386 0 obj << /Length1 753 /Length2 981 /Length3 0 /Length 1504 /Filter /FlateDecode >> stream xÚ­’{8”YÇåÒ2ªÍe7’íH#“Œ™aŒ‹É`Z¢(”iÞ3¼™yßéõŽg,Ñv/[ë©5íÔZ·.KŠV…M¡-£‹.*™Šžj¥Òm£‹}©žžÕ¿ûœÎï÷ûžßùœïïÐÂ#]ý|âéÊf² P,±Y€Ú³X4:=€ű9 ›Ï÷!*9à¸OÀupy4:Ä•iš˜Dç@ưˆü@¥ ˆ%dTP=¤9ˆÄ¥($Ó˜À_.ó‡O¤€ù0©aÒØl€ R,ƒ‰(Fsfa2ðÞ§•òc))pÁd Á1y@ Œæ6§nƒËÿ5º¹P%—Ï“(†Û8õY]¢@åi¸B©"!Ä8 l´4¾‡CU)FWE¤DŽJý±D9®l&Ëã}M¢jˆ„£¤4 È$ò8’‡2š„òo„Ã-pAHð¼9.F;R — •¦„€õI=³?Å”Iª±,&‹Å¦„Ôú¸‹uY&ÅK®'„$F}"*â‚t6@1ªTSÄnL '©#€rf%ámx®\/তFƒ#ÃyÚç ÀÕé®îàÊáRY^€Çe­üPª"ˆ‘#Ÿ…²ãc,C)!TC)MߊK½×.ßqt}IfPñ¥RFÊí¾µçO¬;¬õfövx[^%ª.FÁožZ¬³XŽîŸ¨é =à†È¸wlúgèÒ#ÝÖµYèÆ[3 wF~ñXڷİ)¿ñä—Š¼M÷ôS»•U.o8¾¸z¤<ì›WdÛ·Ù¸äzëÛg™ÉYÍwôæ¿ Ž=Z|þ±°\¸ðþíœsƒçâŸ~OÓ¤¸/¬ÞémO¶·$߯ågç‹®i}Þ˜±jYg3½+yª>æ7~H¤ÀtŠçÕ…Z`0ÙÇAã[S*~dÚu™ÁïrÐŽk­^© Ž-xiWZh)-±“ûÌÝc;Vœ\\§ðÅ6tWD¬¶L®¸Äñù™­¬Ê¥ÏOxK:}‹ñóø×¯;þʶ­{,Mw0°9híâµË/ÕÙ¥—qžekre£Îa‘$iû=Òß/¸Ã|vv£â‚_gFÍ+1ˆá_[eÝúûFG=‡ö@0 ØQ0K¼Øåjݶ¸ µÑ)ìÛ΢'ŸªËÞÅY" ŒíH¨ºîÒTv¤¾xŽUÙãx]µPX<½Úoë ˜äàk5Åû«‰þqÝQ i«¾¡Eó0éx†%wpÀ~¿À3¯åwÏEÍ]Uß>OûL“ž5vÉ[™£f¦{=2:Z–vÉ«¬Rwæë;¨ ׈ÉûKBKÖ+Òúùf¹¥üŠ'l£‚ŒãÏý«OËò‰Pîšõb&£‘¾ôlY?91'üuQ“XäW[w#°îƒ驜Úï–r½ãßµøî›¿{OúOYû¯{ØoZJ˜w¶uñm•Aßk2‡Ö¾l›«2·ª>«Çî•jÛÏÜAù]kŽï¶P9úÄpò­³-¯¿ûjv„+ÇB•Î’/rÙ<¦sŽÔ)ʬéˆuwS€$ÑYo£[ý%znƒéj”Ùë…$}ïÛÊbÍB·Ìî¶Ù‡=ȰWE,ÒItT>ÓÀ°ÝøÕ3M÷ ⇼+Á¼#[¿[…á‹_úܾ<¨Zeu¶osóÍcîb™x(627a’,u•Ýñ =Éa§¶ÕÃáÓ2ÊO<âÍ5s´3h_ðönn¥õ˦CCW¦E4l‹×ì§ä÷ß9 Í+;ˆJÍ‹ÛA×Åã8f®KW¸,ùqKDÀ³ÅOs0¹CÞ¬,}qRÃö;½¿fÒ‡ŒN öiý4a}‡ª#3$+”ê,ÞÆÖ§ ½BÇŒÍêXýgMÌ1ïæ‰cÌhA†7Æz™Nh¼©k*ã5×Û1jƒí—›h´Ù°ÎÉ1¦¡Î ­c7ô—[dL¾p5¤ ;\S19qYûý7çöü ÈØÐI endstream endobj 387 0 obj << /Type /FontDescriptor /FontName /CUJHND+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/period) /FontFile 386 0 R >> endobj 388 0 obj << /Length1 753 /Length2 981 /Length3 0 /Length 1509 /Filter /FlateDecode >> stream xÚ­’iTSGǤÔhØjÔ´.£6GA ‘€­!J1˜Q°†¼—äIò&EQÄC]Y,P .¸”¢q©¸¢ˆ ˆà‚bQƒÀ)µ@íõxŠ_{æËÜ{ÿsç7ÿ;”é"±'¢à@ ÕzÒ½èÀ tÀ÷4Bá©a‰ÁÐ-Ìt__°(V l@›Ëa±9,xXŒ^ÈZ0›ç6$b® V#R „­Vá=¤%cRÖê½W©K‡NhÀRX«ã`È‹@§‘jA,GPuˆI€Ê0À~—†bc>”â`µ‡³‡1Ý a¨R XF cøm0Îò`l«TKTCí‡ú¤.Q!Jý{¦Š‰ÕÂj Ä XŽ”†Áïà„0„ĪFVZ‰‘rQ¹žt¦ù.h ‰­Td¥ÎÃ(4’÷o˜ƒÊqƒ—-Ÿó~´ÃE‘AµËô10 }TÇô1n’Ñ•4/Ž ñõa9â²…¨ƒT, Q«%z oÅ`±€‚uÖáÄT/ÓâGîLajÂÐ\Ys5  å Ÿ>$ Ó<½iÀ“ÁÂÓ>€Í¢%üG(U«aT;üYp;>Ä2w†u°”ÐÔ€Iý6¬É:¾±$qañönšÉ9û6ÔV¦˜sü¼,ü\o«OÔ-ƒ§þå’â²9è¼ëeÐa*$c="ç/ÄÔ”».‰ãÝ sÅ]RKÄ*ÛKªTy›Û›¦µÅœ˜ÓuofßøJûÒÅÏéì"òË´Ñ% ƒ=‰Ñ¦kšÆfC3Ÿî"D”/΄CŸ=Üvõï>VŒ5í¹41"·ï‹šÈÕ÷oF·s|·íöw¯ä—fvÍ.©‘4·dŸ7ö-šB~îƒ$Íã8;åúäN“ï6)¡b[xÛ/?\`›rr€”ç˜}›²µF·£¥Æ¤·[ï°}Ie¾ÜŸTMòÿlê1®UéÒÞ§Ñ8Ö¥õPˆó”’¸ÚC‘ŒÎúùX¹©ÇñPþ¶ScÝ{;Œ³ü‹©.{Î`V®¹¨Ÿ¬Fd4¯c‡šJ7¬½Z%ÒµÜns¤õ>- ¬fÖ…»O~Ö“ÿUá‘=;Y¡ì6í„Äì;_vïÏ1ó6µfpœÁ½§µöÌ=Îæ˜ Z×ßó”“|–Al’‹¥»Û~¦ê ³S¥]Y†¤qyÇÌÀ·ú›“ˆxí·G»3ÞŽœkJðŒ/;S뾺ÌãURÄÀ¶šSã«zòyo–›2ÚŒ/Â÷É´ÐqKˆYË ×’"U) BÊ8BMr5ÔÓ2zšÓÍgLb&;m€÷ÊŸ^NÈ|K¢Ð»²([CÙ m7F¶WÕô±·ÎkaÒǬï·Z'w¨Tcz-NÄx÷-Á† ®¶ÖSüAáV D›¥OðƒíÒVÛ(¦­óU¿jÎ ön§l]ep0O$éì*w”½vº{…X8 ¼PQ›à;õèb“àk4]ý|“…oTË)Ýx½¢quÄwël®yÜÈócrKØ¢®ãQegìëŸN_’5“{‚Ê_ʘ¥UÝéîýî;ÂÒ°-‹ZÂùì·èË„•bUÉ“ÇWšç7W;þZosËßoGY]Jâ(à£1§“3CŽÙðk7»\ÞÚºï´òÁ~O&?jc»s¼b&B¸å}Ÿ#ðÙö*ˆ•“§O êžðûCýîQ–<$•Ÿ»žY^ôºem`ñ·¼'{úMšôùŸi›UyŠ‚nØšgXÎÕ·Ff§’:Uß ™a¯z.×'¶ÞsÀ4ì¸%˜(,iS8¹]wÖæQüCäÙ¾èÎ/‰’}é•©+ަÎGŽ%úðÚ/ÍlÓf]M[TÛZ?gJþ žÈ´èMÅ&Ûº":Ó!ý&;ɡΉØ^ÛçHn¨o4»vD ÔÿcØØµ endstream endobj 389 0 obj << /Type /FontDescriptor /FontName /GPANTX+CMMI12 /Flags 4 /FontBBox [-30 -250 1026 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 65 /XHeight 431 /CharSet (/period) /FontFile 388 0 R >> endobj 390 0 obj << /Length1 750 /Length2 984 /Length3 0 /Length 1508 /Filter /FlateDecode >> stream xÚ­’{<”YÇK #EºÉ¥ƒ|–d.44”vÆ¥ƒ %´õš÷Þ̼ï˜K ¢6"·í*†¤Me¥’R6J¡u 5)j´aKIH‰®b_Ú>}Vÿîçüsžçùç|Ïï9fÆÞ+&Œ#®8&±¢‘iöÀ‰ÍvcbK¥’ÌÌœD$AqÌ’ ö€Æ`Ø‚ÕR>°¶T;{º=N2N¸0B„†„J€¹“ŘÈ0ˆåB`C’PD@ôàB|ÀÁ¹("‰ &Ÿ|ÆNˆ"FD[˜L¢ÑŒr%  A1e É ãáÀîK– ¿–¶ "1ÌÇ1- ã?ÀDñĉÛ‚åÿÀšØÜUÊç{B‚±öcF}W†(?â_.J%ˆ°qa¥ë/llF¥‚‰U7 ÄG¹L,„+ÚR2ué—<*vEeìJ¸¡€ñÅÈxÁà‰$„}ãï5n¾?Y~ìxÍB1‰o„Ôoâñ˜ö-&,¡2H%S©4BH¬¯» îrÁ¸8Œb!Àšn ‘Š Q‰VÖt:ˆ¢ƒ@d0…Œáâ Œ‰<\D›*} ‰ÁàðXžôý;X,\eeÍVÖt¢1ÕŽìèÔèÿ¹R‘Á$ã_…pãkÌC D†pIÊœë·9ýR|~ŒK®â”ª…Ø@ž×P¾«Xî@îis˜uOTrÛ1ÐÙ¥³-Ð>Ôç~†óèz—˜Ûj¢8”]tj´f[ü–ÉQëçöý¬R›S]9SØ¥\Ø),±ìo5jßR®ZèÑM³;¦×—45ÿ~Ëç71aÛ;”š°éÓC¤ 9eiÈÚçí{ë?ö®Âsqå‰ÚyA™Cº#J½ÊGMaiÉÉ9ì)ÍòÃT ïïF-+l¡Òÿc5Ç^ÝÀ¶eèæÆ>¯Ìº3FS? ûtù× ì/WÒã?Ü~¸N \öÙÃ&gXÓ˜ñÚµ†»ÉÚÒLôGæ¨>ÒÝ[”Uq0ròe‡êÐò¬Å3ÐüP?ã”I…9W_n ¹{^ÃCçèªà‘”ŠnC’ù… “&÷§ß›ênò¢ôcóbRBVçÅ=9öjQdÁÑõQ;¶ü•`Õ<Í÷£òØÝ[.ú[÷U ³“ õ_›®Ï*ØÉÐ1sι“³= Ûý O~L=éæì·frÏÜwšá1³“£2<ü,žîs Æq¹ZÕ±-0WQ:¬(fIO6OÚyý“—³œ«8C)l³)]±õJþö„ÔÖác—Ü(môµ47†kÒ+¯>™_˜ímpl!Æ#GHO °—Ì'¯O·ÁùyRQfWãz¯´ ‰óëû-^iz}„{bm€ž­a8îrª$Nçfû¿%7è[´›é%ë¥A²µQo=;䩨\y¾Òì¨:ÃR3<‡÷zÁÁÍšÛ&] έN“÷žkÖ¹— ¨u¨àüH½ÓŸ"7íðªKr½mÔ2Íâ™òžé•²J¿+ÁiÙ¸Í/#Ó:‚õ²7>½È¼`$ÍÄ¢«, çZÛ¦jä ífðþ¢ó%+œ­ó“¾Üæ endstream endobj 391 0 obj << /Type /FontDescriptor /FontName /PQILTH+CMMI9 /Flags 4 /FontBBox [-29 -250 1075 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 74 /XHeight 431 /CharSet (/period) /FontFile 390 0 R >> endobj 392 0 obj << /Length1 2142 /Length2 16039 /Length3 0 /Length 17189 /Filter /FlateDecode >> stream xÚ¬¶cxä϶þ‰m³Ã &¶mÛvlÛöįĶ&v&ÖĶ­ Ÿüö>gÏìóû\ÝW_ýYµê®»V­êo“+(Ó ÛÅlmœhé¹Â²JŒ F:!Xrra “¹­ˆ ÀÈÉÉ~|ùxs±²p±2Á’„míÜÌMÍœ”ÂTÿ$±­æF6Y'3 õ‡†‘@ÙÖÈèäN´²(ý3àt:¸é`ÆæFNC ©¹ ,ý?–$mLlìÿ;Ûýï ÐÁñÀò_6©&mm¬ÜÆ@Xz9ÛÕ€^þÿ°õÅÅœ­¬ä ¬ÿ‘ÿ§Pÿϰµ¹•ûÿ$ØZÛ9;²¶Æ@›ÿ›ªü·7Y ±¹³õÿ•t2°27´1µþ2w3w+˜;™L ¬ÿŠmŒÿ¯‰Êý˽´°˜„Í¿Ïô_c æ6N*îvÿQý'ù_Ìø‡?ªã`îÐfø(/ãGâÇë¿éþŸµDmŒlÍmLL¬lwØîù V€'#ÀÜÆèº}¦§³±uú˜ø¨‰7ÀÄÖöŸecÐ þú7±}XþCìzá?Ä ùCœzÑÿ;€^ì1èÅÿ€^â1è%ÿ €^ê}x‘þC^dþЇÙ?ôáEî}x‘ÿq|xQøC^ÿЇ¥?ôáEù}xQùC^TÿЇµ?ôáEý}xÑøC^4ÿCOoðbþÈ4°¶û¸;-ó¿Q–OŽmjîhùgâGªáúØ„¡ƒ‘%ÐÉ hâô'ÎüŸø¿ïÙ>\ý‡X?ÄŒl­>îëÖdù'bmýÇ#ÃGÙþ˜bþذ±­••Ã_.€D?2€ÿµ(#Ó‡*ÐÚØÀÑì¯Ø‡Å òwŒí{ç{ÿGú£&ð#Áä/dùÍÿÒüà?ÈÊüºüqÆøOà8ë?é¶Îoä#Áô/üÐÿãŽåãàÍÜíÌ€6e|ÄþZŸácëáÇ![þ…Õþ{kGaý×Ö>ÊüG™õcª¹ÍïÌ+Ù8[þóûjú—ƒJbûÇ㇦í_³ÿ)‰ÝŸá5ì €6ÿÕ,,ŒÿýïVaùØÌGKšÛÿ%÷Q û?Íô!nïlë46´ú/Ef–?ÿ§ÿØþgä¿ó9ÿ'úßÉŒÿð_ÇÃøQÇ?%ú˜ä´6ÿïfý'èò×!±~ˆ8~üfþg_¥u´ú¯^düpõgYÖz8™9ÿjéº9¹Úþ5áCÃù/ü8Y—¿ðÙë_]ù1Ûí/üwÿ ?ŠèñÇ܇’ÐáßKý¿Ï!![7OZ¦‡ ÿÜMÎ’rzÿW¦‘³ÃÇa:ýëÑüqÃþ—MÌ?X@ ÐviÞÖˆ;È"¥)¤ÔG4ª ‚ú“isœ\}÷l\àâ·OVE#ÒöÔëuOåéhˆûûD®/xŽí^Šãbþöq©¿Þö]ô÷Ó=Zñ4®ÓeÝ÷ìHOÚšænOY?ÉϬ–&j d]žä)PЍ@­ƒôh»4ôd±±kˆ¥[©†×Q0+!§Ú—†±„®¹"'ƃ¯MúX„B·Ð¬\Ù¶;£>åCç&¼é<`Ä¢µ1+mS£+🖄"#Õ¾÷W dL•ûËÐJ#’Ùh!ÕY¸¢zÓ—X¢a²._ZÛ5ˆ_ÉÙt׋võ˜iôÌ ¤ .ãóm+¢?ÿ†öx;$?r~o—Nð%Ûô»ðBJpÊ‹VÓ¡Ò‚ Fhµ ÅÒHϘB÷`D¼ÍTÅô%±ãO|÷tH×ô.r„5ßA~²¢zñ‘7„CêäQ8ÊÆÊn$”‘îWÂr 'Œ¸ÚŠq§«ÞÔÑR˜RB‘}™‘Uõê"G]C±7ZP*®Tnüîã¿ëŸè4Áj‚'‰ÁŸ— Kïi bÏÀ»_Y‚('Šˆéâ²ßÖ@NVÑÎW3âéÁýV"Æ9öl­¢]×ÞŸý3Ū<+QÕjîšìB=à ¤i•«:Ž0€Ò-†[Èi r„­:ÖH¬OxÈaŒŒž›ø‹ô§hû¼b™ôÄ3„Âg úí¦3²xõ õ4ÿSK• R*{òžÿ$º¤â†¶38Ów†×üFg-ŽÆƒêòRÈ\Ü´—Gì,û–•Û$…Ç™W­^]CcÉ’1c ‘¸XÈMv@ï#Ò"Í•PutOtX HGʃß}ÞØauAqŸDá7Û1ÎAv£ÆÂn^¸/—úA>i‘è•­ÁÔ(jßa͘†ò­tº-Ï„?;ÚQíýÐ`h=Œ ëc²˜¹‘oçl#¯4I{˜Æ:–‘:è².I[e2dMÖ12v'ˆ¼6?ö Áª´rkÚ3¨Jé¤ajPp¾—Ä;Òœ¾gã³7ÍVò•µu•¦~|»Yä¦L{Crü!R?‰Q„&N˜?”7îÆË×@$5±pΰ1Ù^D| ±¬„ÜÛg™„z øy2·G· ë‚ÕWU1ê5˜éZfݼI§›lîÚ õÚq;¥!"çíýÍ-ú8Í«B4ŽÎGÚ3îVå¥.ÀgÙH1󫑉p+z&·ö«r{ËÎ&²i=âÌÚ—ÖkF’bvaeˆ9Ú£Á&ôxËW‘ äiГ³w8tiüŒZGw%÷ã7ÆábâÞ9‹\xd3¼Ò˜«cùb'JP]ÍTat¼b?ÊžÃô94 ÄÀU?»¦“ËÖDÙ¶¶"b‘À<ï{Ü&_×K', õˆöd^æ s.zµõwQGiŽž¦¸nDî‹çÛj“»0knûŒÜ³®y¶Qݓ׃ðl³"²Õ:Ü3,‚R#íÛ¢¹ŽƒûSÕ×Bh¾"/Ýðª»ëm›0Û3Sê ˆ¿×Ü:MA’bÓUb½¸XBR«slS‰J_ÝpGŽ[‚ó+Èe»AŸÌÝsû‚‡¸EÖRŒy c³Àµ,9Úç÷wÄÏ®°ˆŒwj‹2È„¡W¡îM„_~½²ßØôê%yK-ÿÆVȯ-nîù 9«iòâÑᓘ)™‰Å§šEˆö;ýœ§ý”¹uÈOŽM -µ¨%9z8ïÞûy9† \ÏOuÚð‹xlì2 Eð£Æ:¿òÕDîÜÍ ˜w*a¶ïs;8ujõŽ_&8oYΈ,húZEç„c[q¦ Ëßç¦N‹Z²»j.|ÛõîK—“Ü%@ÎQÍ€“1üFЇ¼Ðµw4%-‹„Ö4æÃrÉz׆—*5Š{7»/£F>sgöá´•Ÿ£ Þ'š IRK i ›‘¼Ú ‡‚B(­ö‘9Eø· KT®¢÷ƒ‚Ùé«}ñÂ>O]«¿Ù¦EP:Îq¦:ãYº¼•ŠbÆ’è›åw˜·J¼óÓÏŽÀ!·k'ÙÓù2J4~És|‹ô—A¸lJÌ €§xçÓÞ†0V/$ÍOõ³9]ò¬ ¼õ‡ 1YØza¥ÕeÎ5üšµ$è›^?Ô—8Ó¤fúîè~å±>Ø8ã¡ËËG&͹`ZqéI›&C#çËP€y¾=m‹é)XLí®M$›ÏŠä\i­b‘‡ÝøX­§ž¸¿GIn5K@ŽHùÓ.b¤†OŠyE4éHóvê?êPË‘ä*Ä´›­xõ̧ –°·ßQ¯Î‚,©‚ŽÏ…­ž–ÑÛåù$r~Ð+1¿CH­9¤ßæqúÛHÜÈâÌy¥ÐàZdCgñòÜiÓ&èM3>•jaÁ§YÕÕÎy·^;äŒò'ØE ŸVW&U†:{?\MoïF-Ãye˜u²&£ð.åŒY§Þn„·YfKKÊ%Œrû°÷öÊúÑ8N‘ ¼Âx.|^±€¶Ì[9ÿ­èºÆ€ÔÛÚ"ÊÌÒ„ >/Ç„c® 'ßóv)”½Ö–ïv¥¬Äš³ëœI"wÕøÝHV­RM©jPQétuà–­:k$(ôÞìÈèüø€ñèrA˜qñv“Ñ0Fÿžù~F&Az üM úïÑÍùC‹ÊÒ£[EàaǤÍ<U¡ÊéY>”½/wÑk¡(¾Í36Ÿ wp ´î"ôÛÄM“‰Ëà¶CŠjLWäöý1ÊæûJØ‚ŠF¶¸×¸I!éŒÓodž=™ÇD4ëIÕÛÍ44$úmśܨ~ bY.ì%O“Iê' ´mÌ ]IuÉ]†taIîrk9ªlª)¸¿VE“ÄÕ½¾£¡>Á„ º~ õć”g~G›xBÛ>Fèö ª*DX¡Õ¢iÀ…\•AL\Ã%ÊЕNŒ8i KŠô»št"«‡OÔ|éŠØ8§ÍÃÑà¡¶9G×Á– ûtïñ¢Zâ[_‚©>‡œj¦…•ç?5:€Ó£ža|X–®f¢€IB0÷àRŸ-ïayD÷¨a™Ñ+ó¨p 5r-vUo½|.·ÞQLÙ Ò”9¡{ªby«œÁ¯ß[I®¿øo s#–leRéÛ„ÊÞjl[ƒ'¹µgÅÝu36õ`iëu ñ¬löñÒÑ ìžc­ï¦½Ä%Ê TLØêöæî£©¾pˆ¢}K¼½ÉH;zÿ}êú*¹K*+øÊ’m3Õr»Ì«HÁZQÇA¹•NÁàéAË÷È¢­ëO¼ÂaîRåmßM×qцՈ>GAå?/å[©Ü…#¯hº^¿ì"’¶Hþ{)¾I§¾Ú)YR§uýáE»õœÇºû ÝtÚãZ°“7›ÒÝN_>ÊÜü;4•r=vLóÐì›Y#ÁG¿¹“äç3zƽ»ú ÞaVJM+÷ë™!Eb¾î1ÊbeÃÖ+‘c'låjÀíF4Â,ƒ—5€S cØê‡P ö}QDxùúˆì“ôÎzYNàh—G”ü. Ùqv|ÛÆ*ßö˜G,›ÉÔ,¸’@Vt ìôÉJ¥ØË‰…%«Ç~çMPa }¾ûïWq9ÄïïiV&ÈnVV*ÿ“‚¨¬dV†Å*Ø–äNÚ΃Þ+‰aén)`"öQ×OOE™OÞí2œL7Ûrz£Â{×ì0cà1ÌR|~¹ °Á‚••˲㽇—¿ä…ŽÙ¹~yËÅ88;’ùš™_v¼J®³üi ’U®tIåúu%" 3öj°û³#­½GF½ çD(â>›ìBp>€ÅïY%fÏãÌ’³þj°wܬ‚ŽÇÞÀ™3ÑË™Ðãàü ”¾ðÊ™þá{´³ÿ -1ê==Fþ`8…‰âNõW V‹ŽÑ°~“¯Õ¶¬ö=U5…¶4~{ÝjCû®¯ât?+@À`¦j”ÁÓ¤-æÝc4˜¬¶ßã|8e<×zñèSðUh" =È/çÑ¡†Ð!οF¦ª~Æ“¥üœèNφ»)K|5†vfA5­Ç Û›/›ŽV}Š_èdè­B`žvFE‹Ê×kºw¶7ò¸åÒ<ÁCߥêIÛµý„zXÜV6$9l„ÁÜî"ž/cU÷(ß0¢azs^x:7/Ðqš¸AÿtXûm—1àż‰¦®" Ð.Dø&˜>ƒYvuÆEBRJºç!œÇ“¥Ešðå³{ÑÅAKQòqë¾Äèê=$PºÍûçäWˆy¹!a.Ò!´‚²s}‘ %Æa“QT«ái÷“#‘PúMD5ñ§“5FÈLíë|¶ÕÀa7µîE¬ÐÂXxÌT5ÓÉJl•űˆédÚyIiwúQ A¸å2:¼Ì˜ÜFGÌ]¬ó¦(hXá°Â`à?w=4“¤¾ê¡Á½WõmCäy!Ð=¾Œê6Ç&¼:ÓóGìgB˜QPýxj^;«‚=M±wÞR÷’ãö!ƒ°òÇ®ÞE%²ßSí…`1ëÌí6ßáðzj‹ «ÕuöŽl\¯¤.ÒE­#°Õ2ë{B½rGäøp„;å d~?ΑLDö9IÁäÑ\_n¶¡–—#+4îÝ’Þ¤ÈÕ\÷‘–þJ¤¹l$ÁjÂÌsk$Ø[»YTjç9ãï†Ôh[2$¸ …)n÷*¾ƒy:Ò4!.rQ[CR› ]ØL¤ÒGú齄ևþ­zÿu cf¶‹%7v¤ô¡5ïdwgä^ <öF£¾¾º FSö@Š›†øÜ’ãÔS¢àô³oÑËÒÛ‹NÜ$XŒo@Š&@}TBÚÜ]ׯ.g+Z”k‹Ä¡S·¤bR×߀ç±ÞôâfÒà”¦™¨Yj7Á P©p ¹à§ãPòƒ¤ÕÛêàŽ/ó´Ö/yÐõ¡éµ‹«—eäzPí°‰¦°‹ÏþµT\_ÞFÌP[¡ôü¶£)‰c\BÚ(ÕíÝÀ«d‰)öý³V8†îÞ Q¨Þ|ŒôŒÌ4¢ÕO{¿âÓ'pL’‚°}‰úaûR¬EF¼00ÆÕi=3;øfž§þä€ÅyÌ•Q³‘l¢¡øR¹:SÖl©—+FÓ©¦º|¿¹Á²pAOœ½†v€þÄ…šKCÈ9‚»‘æÄøcD5t3îcpÆ9Vi×/÷Ô¢AcR:wÇKB¾nî~LX"Åéòhâzú貟@×¥Q8tŒð+ûzÔÓ ©ïyGÞÐäË-¸ê.hç4m†õ _yÁ¿F~R)eÒ³ Zßí…ýôl][eSŽ&Ïòþx ­ªAD¤û«©r "=c°ŸêÖv£æxðY ÿ:UR[s¸ž&‹ ÞÐ*eDÓoåõYuœTvÂY*®›<ŠÖ@wq\ ~©¤ØÜE<ÈzI=±G°Ð¾ã3•–qj{ä|]E[1¯!g“ë:Ô§SmÍÄ×Td¬»zô‰y(øòfµ0x«s뼜H¯Ù¸±É)<èg^m^;Y~Ó ….Á³/ãâŸH¡(}Ã7áCít\ê'x¦ûâ³ËõA¶¦3Œ»¨À³kŸk¸1©ÖànÞK‹AöRÀ{¨Þ•:¬´OLv­÷¾ì;2‰¨jƒü€yhWí8i»â%š ÖÐb$`l^vªê±¨csC‘ ­û–IB¢z·Å(xT,TfÌÔ¥ÝÖGqø§Æ \ºÙ¢ø*ÞMÈPtÀ*¶Ù@¯‰[öKA(³5¨þðs7Z„ÅÀŒ,£hzšÅÝ„¿ëo¾‰1dï1Ž© +Š;_½3žPʬå_Ú“ÖqÕØXH@Ó$DJ§çÇ'»…3&,!¢câ¨?gŠÜX`[é`˦z¬3ãUqŽ){ئ‚5‰:a4}Ö§<`P𷘫 j¾‰V°ˆŠådœŒov•啪žÀÓ¥=ÓÜÒi§õzys7‘ªô”ÑCà{ˆnVá}­òB·°|y°ÜÌ.Ûˆ’ѳL€pêÛ¤9Ÿë‡›Ëxþb "´¿ªmÕ¸°í¤ÜpÚ-²Dú…óÓÆž…ö*ÔsÒ~m¶0n(¥ ý!{ 7ò8.À[Oiÿ}òt—­Á™OÐ¥-¼œ#Ì sþ¹²-›Å@"‡?¢!ø˜WƒxZ-î<#å~húµ¨¨µciè T¯é”q¤&yδüÒ³»õÒø0—¶…”‡î"Õ©î‹w@\Qh´“ó}œÖËÏ:„»%QÉVd3îx™Q1}{žÅQtÞ<ÂwŒ3aOÒ·FˆVÃ…/2Ý‹×e>š:?ÄÄG_ 9J«l¥vö1ÏcjqéÔoÓº¶…¦o/|,~ËU]R-;<» ÂÍÑoy+¿ÿž,Š0ÙêLxP±gb±\Zuºßk<ï-Ì+,D‹zû¡ŸºAu¤© m¯¡3¼ˆÌ‚ªìÓ>Õ vX–ûÞvÀ@惱±Ç€X.BN(X[!Ú7«Œ žl‚³cÕ‹{yŸe‹"f{›õ¯Ç0€µ¤Á@á‚ê‡1¥ã¬—Ÿ6Ö1 ý4 :BkrüÈðB!‚–„9@Ûâ›ýÑs ¶1Æ´|ßcï“MJ¥) ë[Dv€a ùôÊ+0eUÛHË‘S pƒ\©:g§™€»RÔÉÒÕͯ¨Ò·Ï±¤¢‘À$Öu§£Ø)e]›¿¼ƒ‚'ýt9Z⩸¬Ó;A•pQ#刡%¿Ìtâ *®C‡ÐÕ„¶A¥(÷±‡žßvî¥ø¡ºÔŽìÙÌ'Ï ZUÈ2èàÔ¯5¿v0ÍšæÇ5(«(&àg^tŽPÏÑOrnöÀ««°2½8AÆ Ò(θ†ÜÃOÄó·0—g7*tWç÷5†îo° É‚f?;l–é%éÛôé’äv9áòYIfx£aêÔ è³o)£–ÂFk&d`šýGå­¶ G‰¿†·˜»<ÑÊÑáü¸ÓØ‘n  ü@)Ùçfóíl2à8Jeéì9·U«Í‰,Äܦn:¨™Ì¹4"EvšàjA×½†y…é õY•M6ÓÝú¯Í‘ ÏÄŒà;ü$ã4/M¾w"ñÖ,nÏ‹Àæ¸SµËG©ç7„žª¼íam÷ÏRxUáJìC=S’©Ò"M-h~HÆD¿g0}^L&Ò¯ª“ÿ A¡ê šX¦¡Ñªm»ýä•‹á=Û³1^X–@MÈÖ6âEZ Zh6iµgçº^^ÆRôU>üºCÃê_¼¸;ÇŸ7‘P¥§F³Œ˜ÂrEÈ™‡Å¿}MÎ9ð‹”P{g©¿NU¸d/eÐàÝ'„ß³Ùà‡&±ë=.sHÑ;„ÐMÝ2’Tî2ŸQ`«…ºÙ~jŽyê&Âõ¢°œ|˜«±í%+% Lî_?öEèV¬“r¹õŒ†Q[É ‰ó¤J º2ë…+»Ÿf€¬T|·Çî”$t dKY Û¨Ý#Q¦º9˜¼ì6èæ‰älÁ;K^õ€ï.]íZñ1’©TŽØÉU Ûç–•ù™ ºN[Tíä–1b‡q&Ü‚àaý•P³§‰Ôhþ*Û^EY×€Ñ òÃT¬;9bÂj¥‚Ú àHjyx…ÆÅ:Ö.îPb±yûn»·¤mµÏ”ŠsËŽÄbPu?|ûì™&´3y¶G°â9®¤·”‚_hYj5&ª!nI +·“0{WxŸ¼//Ç<¬2\H^é TswdÚ¨ï&"øBD%`eò÷%C öGãþhHŸRƒ~— a Âa2v+QHä j§ç cr¥Ã1sˆÏÜv5þ ËœP+=Æjh­—_²SÊøÄTÉ)Ëü9J×TÆÎ@ˆnrkÉ¢ Ûœ[„î,½¨AžO=Ùô·Z´gêГDßÍ}zxê­ù+ûÊF4äPàdRêe©Žî©Í;6BŒV_ǽ3sö4øÔ&mÛ»¶î¿H}Ý=€rJG˜äD—˜iá;"Z"8ë— ýNk§–„ò8$n‡U”ãhf𕛢†K¸vÑú²ÏìØ{–ÈÛJÝ›£‘Ήíþ m{_‡®Õ äÆ-@g𲄻¢ 5ì×ô†Ó#ÿÕÑÛ3PEwK?vüÍ ¨¹ôya]ð(”ëŒXo^ò$d>cÕø ƒà$¦®¸=—Bbú¿hc˜øðÉð†f˜}ù„>)/÷+¹Çѳö±;ö}~¨ýu²D/cÝ B± ÒZw§ò- Ó6ZZz6Mbã@r{Íä«n¯ò2mihdTXÕÕ¤$)‚÷8vÔWÿ¸[Ü[x¯°B‡dF)-¡nT}{ º2 GÜ!¯çŸqW8<+.N~£²Ã’ͤ‡Ž•pa±RÝ‹V|Ý6pWpÝúZ$åVÓùÂ6;ó,Å´¶xyó»ø}ö:[Ò$+ùß—[± ¿´ßTcù>Kˆ.Ëóë)š ¯HÔ5NR…Öôàºl¥Ø²½ˆ ^v¢€;Ð~ÕÞ NÉŠb}¹Ê|A»ž[¦ƒ3J˜Ìœ„L*P? ¼ßO¡€ê¼•½ §ëÓ‚„·ëíŽûÞBe1—çx óE²shõ¤ª}îtƒ‹¹<ÚG£S‚E'pª™#ÀlÙJ-]¯ò‰ž‹-÷1Ø,3µ(…4%%Ý”|¸!ÁBægql§  âš>‚=‘šl<¹onh; ™+TæŠg;sýÚ21!ØÅþæ'ºûë=qŠÙÍ\=Ðãg@j`ûCÓ,B´Œ“oˆ§_ïßóð °*C/ëöAÁæ"›™k÷HÍÖ¬ïw»CPêÌ–é)ÿSîakLöëK3ÿZ”ãÛ‚h¯ÉIèãü÷Y÷s¶,"ì`J¶5¡Ðq„¾t¼9ñ¸©¾­±:ô¥=þ2.Í$V‘öghNM!%k'/iW×ô»Æmþ3ˆÞe`‰›³†œÊÐcåçÜ,í»…W(O–²Dhz :½öå>  î„£s¼_Ç÷¦vŽG"+Ýáq½Oe˜™…~C‘úµuÍÕŒò×µ?±2 ã5õÉT*ëm±,°£L¼ÅÜ5C&°øßk¡ñÕMä&ëUЍ5rŸ/³—}ó›¦ÑaÓMgxs){2=9ÓÏgÇWús¤É â&›ü{µ5™¸0E¶Ÿ4’œÓÔÄcÃÈ’<·ŠåMBYæô`z[¶×möÙ¿©LÑwަ]Œ‘äÙÁ|þ÷ž;&¥˜3ö|=HôvÆDúg޶ˆZh÷mØwl3‘Ÿ#ÇË{º‰ úÈÄÂʪÄÉ‘æéèKí¿2×’ÆÜ,99Ǭ&Æ‹ÈäÌÝ:Ø[š=áÄÃý/zHÙ²£gˇ_~w¦L:ÒŠv:WûÁöºVó¼XH§ ¥Ä&’»_;hP+ð¦ÀÍ··È+Ó¾«_Î×sVX†®aü‚ï00ÃÝÍÇ[Ö*oÇbèÔ¸‰¦ÝZSš¾»Úà$ …>öÀ¿\¹ªÙ.SÔÓ=Ì|¹D¾‰²üö¿¨ö·!{/, ›T¼Kl6®t/Sœop`pÑw½v(³Š-=:s©«@+~V7`xcß‚ ¶ÝL þ1'Rõ˜ ³Àž½QkI9‡'y@øµ~šw/õR’t„Õñ×)$(ÿ»{Žô†N/‹0´Žê#A hñˆþîÓ¬9êYœG±&æ-—T·ªEŽË£`«$i‚s£yòl8DnQH[õ 5ü:ùñz™E™½³’—òެ‰[*oߊdÅœùöç„&R¢˜FZø!(H_/ûW¬€/„Ý¡AÝb’ÈÑÎÇñáû… ÐlF·²…¾±€h³fïÕ¥…jÇ5DÈïç$ç%*Ïñõ£‰âÌ“wíüÕ1vqYœÄ®?;CoË«®‚öˆDDˆY4Ó4žjúzóÎ `:Ž $Èt”M8—}euÑï%˜ @Üïò¼0z Ò~4°Ú4—‹ "Ãì _/NÄ¢´{7–ô‡3+p`Âde܉9ùÁ®Ì‚}ëIB8`4dòŸÔV\wÆšè íå)®¥5¢$&=M °]T¸GCíðiý€Tl4]‹Ú¸×/ÓÍ]¡9´¾=j>oÞî^Ç=-4æÌ¤ s“ô÷—e?ÓáÓD8üŒÑ^©\,¶IV(jUd½!òm@¯1ùö#zÖ R'qAJ ‰Îøƒ-ƒs •’¬ô’añŒÇ6ÅÄ…òãç^ÝÄf5ÐTb¡Ü»P+ð!ä8’GQlLïÀ ñ8Æ—Bgâ’J… ‚nëÁ@ãô‹%‰¤r¤X7ë‘J’PdF Ö†-ËÇ:ËfÞ#–²â¨z!ôm ÐÈZƒÐ‡RZnoˆcHäFô¾Ø¹f¶¿ß«„SŽ…¤iÑ­KwCòÔ#‚W¤ò® „Œ{†Õíxä³$ô8éQ1u¿ð)m/>n´`{£¬@8U+íWL@ŽAfÏÓIb²AWj›]¶P}³¾ð²²6sÃN&¨#·«.‰bâš#Í;Þ?›3)¸ƒþ&5ôö›žã µ ‚#“cü„cWfêÑàiuyO¥‘/âþö¦åþ:5êvÓÏËñäÁC¡ŒdOêù="~‘DVºH¯-Äeß6«›{a`zšz)óÛ]ù ^m¯Ì±ìd¾j›s×êÇjzéÅ7bÀÄUgÐCLPqa«È7¼Fzµ|†¤„Ðt¼®cp)ØMpn`D—ÐXHÂJéKPLF=/ѤZÛ§ÁH6ábVðð¸«H °t‡-»¶¯  ñ"73X`ãm?¥¾¨6bCÎVÔAÑu+¦Õ¤:DŒ˜sÂû¶Õÿ"R,Ïý û…·&ü4’Qãç1˜ hS±Èñ/Ä_èp/§\{˜ÞióñaÄÎ7Ék%”Ó©ˆIš¿äùòÚT¨¿Ó‚WGJô°úT‡cP”«Ž …°ëåõ½}ã*͟瘓pŸê4´_|D’ãåìago-Pa~û†Ùߊ°}æ x‘cÇôQÖtZËOvÍBè†SÓ~+RË6£¨Óˆ“÷ÅñqõïBwßÉ2#>kÊ!udиNî *j¡r~7½Jðƒ}ö~}ÑðZ"[rq‹àbûî8kàG5M˜åV—V²8M~Y¿ë©¼ØEG\ÚSRí×Ö=sÕm÷ûu÷‚TUõ“' f»HÀ:ŸÐ œEýdÚ¶÷#–{Œ‘¾|`ƒ©Š©)ßÛ{6•¹&ÊµÕøHhHìһo\>NH˜,y˜¦œÄ¯q˜—syuq8ßø•~pR´²ñ2Û&~R£G°…7–)Ë2¨Z9£nTq•‰ŠšI,CçÁçÁ‚ÊGõÞ;"kÚín:°“É*îE]—$itHw˜½18:ù6Ò–Žô‘R.Êm04±-ÛU ñ÷ê³ú¼¢c>ãßè§ì–ÆhñÅZêݽí¬ïáQÃÂ+1q©È}|ÔÓæN¤ËµiÒ$O‹ë߈'Ñ(·ì`KX=‘v”r‹DîrKo¼ÄKáòR&Þ}.'ôeÍ„å;œxC}§çuêÙÀ¥Gñ[_]à¸`¬OT{BÎ7!ÛS‘;_—ÆáÈ‹C„e ºÚ| QÕØ%²¡t$5œL>ç]>ø¸$¯Ãññ«ÔÏœN¥³ºà–/ JœqfD$š;'›^m·mLoœStÁCGUÈ?íâ³¶ëÒ]‹+ÌŠ¤>cªqÀ{-udžÉôu™c³ð‚¼ÔdJf.öU&ïŒ qŠØÇ!µ‡Ö?õžB'¹(ƒÀ­¥*ji«UŠå%ÆNÿÌ@ÒÀ× m 3Æ4ÄÑ@Íd3k’ìèU)BÍ_ÒZ,BÈöñQÎa¸éîæ³½c&©$ÈÜ0¾ú—âº7G§Uk¬Tò$IROnàRÓàÆ‰Æ •A>›\)fËÉï-8âî]0ÈÒ8ñCìøÈÙQá%$äÛ‡ÑP¡Œ‰–£Y±ÚG_iŽ×§è<ÌZ‚íJ¸S›>S_Øþð¬~ì‚M¹> ‰ô楩º$ÝmdbËæ¾ì†^Ó“.QõåßÂzÜ>rSEp%ïÙ Ï5˜¢¢ÐÇ/V ?ɹ©å­QѱeÀËý~tTh^ý†9½åëroB0„œ‡}AKSѶ\ÔM×¾¦Áƒß­?¶ŠÉŽv½…«]i³ýkH+¦¯¢œÓõ],f°!`Á`œ ­²qæžfú汃ŭ\íÜw·:þ¹ê…g‚4[µ–×# å2CÿH\ÿë;zš=Äg¸@þ¿o-w ’wïR‘ßøÂCÌeµ£»}ë²J²úB¦2oÜšèíž@vvt›€_ñ¨u'2cÎ=Ÿ&C¿tÙý %TÍò•!CøÁPE2± qŒÑЙf8îgõ7ŒRò߯¨›æµ"Ž›xª­×'ˆSóàH ¤$DI3þú†e¸Uw»š3ü¡MåþFX9íüŒMRš @*„œ—+GGÒ¨1öù Ïc£žAkQ̓àΣêñm÷IöȦÎÞ«„XƒÐƒõÈZü‚0ûi­¾¥ý]‹ð•ŽsØã°ÐKd߸.Ž—/V¤ªæwf¢2d1“Û§H#â,}·ýƒè*9&9‡á¹ ®Ýq%¤i_Œ¤¦ÀqÅkƒ/Ô"·ß½|àî,€1³Š„¤Öõ-º©1}î[•SÈWRÿB[çè»6µªƒðLq›/|"¤zÝ]'sÃ]¸?ÏN^‚…Þ\L»´ßåSÇÕ"^{j&}´C¥ˆ=+ˆeÇñYTö—ÊŽ!‹%'¡å†1æíÖBm÷/%gb)a)×…VËãmÝš½;Âû†“ {_ŠÊsœ¾y MëMÑ+¨Ç(%%.åŽÏ™ Øî>Ë?8CÜý@IÙ´†%qbÈà?ËœÁÀËqîÞî³DhRvj†Z†@°mœrÊÏ7el&ÿÄÓŽ¹/^ˆTm¨ 1†B¾¿Ú¦g ¯VNƒGÆ–»}}%R>aøÚ$Oا/-•[¿ÔÛ6§W1mµÖDøíHGÎh³DÊÍèž›÷ÜWÀ£ÁpzëF¬àÕþr…Í¢'nÈ/:XP¿…•æ@Ž·¢è·0‘_ç*š™@íæ³†¿æòj‡îjØOËœ®Ý¢µlq±e¡{Ùó–ôžŽÏY{ªA˜âc Ì›·´YtÏaZË|jí‡Õ3lÝòµ†¨çfuÔn•K¿š¶JŒÍCTpÛŠ/Œ×•ŠIÁAÍ&ÏZ“W|>êØÚ‰ÕßX5õHšKþr9|¤®ù5 ÌŽ&ì«è6_y­{xf0Œ‹é¸*ö½ÀA% E+qéå/z ¸eó-Ú°)5D—ÖÕ—¨ pVz@U|cÓÊ&U½Ñ‰H$-Ém‹ýC,þи6鸣oTø‰3ê÷ñe$­¿I®•´ \|ìÇ8Ï1[jÕ2éþ£3²Þ+wrL_çç‘‘ÎÖ ¬<ãÒY€8®¯~ÿݘíají²¹’ž-wᘖ%‘f§Û¼êÛ¥<áÆU¨ÁH¯Î^É•Ì V ûÅïÄó»U ‚‘Ç9ÔUëµ}Á§Ë-è*ó£ÍflÐÇß›‹ÏL.MKù|Å‚>•[¦ °’~fþpùêļ6qÇáô‚ŸT2¢Î UeÔ”ô2eiÇ¿¹urÅ4‘nãµZ5ÓDû›ÉGo=ûkõ,‚¥³©M8ЦЬ¤zœþ¾{‹¤†Œ«|D ´¥)»[ö­Ë[$ü±¸¥}³®]÷&u„±Î £ªæ“Í3}SeI)â«‘ÐfWH…]¸ºž:c>7vç„.C!Sy2Ê$ÒÃÎ*€–¢ÇÃÀ¯¸-R´N°‚P¶L¥2×c[ÿxWýë“=Loê‚^1mœÈÅ׌bbtyd_/y(pä¨>†NŸª³ät“öñ·ÏWH$½hcá6ëàÑýkc8A(n&—ãùÙ"Õ0O^ù×Ùƒ±¬ j¼OÓ\ºbfTdùýÜòë¬ÞŒÊÂ3yñ«ÂÊû×_–OÁ"ž@ö»2Ù:~l¢ú~Þ^¥yXñˆ¶ª)ӆì‡LA¤i^œŽ`ºŠxZádú›†áñâJ›×(âÐŒ(EÂΞøÒ²osßȪ|Y”Ú ´ãÏ­'ÍKý^c©ãÂЊB³0¢`š†FŒµi³:øÙbŒNÀˆ!¿8S÷n†H@®?Iâ%ý¯¨pc¿¹üEˆÎ2³A$ RߨÕPK­Ízâ- !bõ1še¢#y dÊM^dÑѪŊÛâ&ñíWõ‹^é/”%¸væê/òÊ4^µ1x‚Y9æQ :oo>œ8ˆú‘¿öéÛùpx+€Wu„¹¿XÇó·ìÜð%p®Zý”Þ°>9Ô°¥íŸ§H°Á=t™Äçð8\\_Upöºì¹sR†|r‰c2À, é1|9 Ë9L«Xn ¾§¿µŒ@±_ÐÊaÒu}´Bå&®^°¼|G<Œ€.ê^ã„8cV鵪BÇ÷‡h†$×éOÕJH¹V› <+2,DŒeä7kñÇ’!ïÁTìÓè†ú¿ÚÚ} ½ƒê±AðØèÇ­Œˆ:§~lv|ÊÙuñ‹H<Üɽ]×zu¢Dtð§WµW:OdJÊOå½)‹]oÈÍHlø®Ý¥Á‰.­ceÞÉBãá$Í.0(ÈÀò@ÇôÒ $’d SßÕ]_/_‰WöüzpqãÕÔG¬X=–¾b˜ÍÿBdçÅÄ}Uˆ<)b„ÒC qNúe|¥£âHºo&ðnjöµH¯Œ$? \Ó•—_˜ÔYXy¦=ò™®fà©À¯{ȳ‡VºÖׯLz+AäkyèæÊ',¥”ŸAçE­j­?‹Å–SÅ C¨jß­y‰—в SUmyÂcP4ZO²6œäð¥ Ëñ;¥ó×ãQˆ§Yl=SÝüÖ†¾{ !ý ªÿ¾d1YÌö¬ÈÆûÙVóseä¦m©UÖFw‹È‘A ÿw”ãò^Êà"·dÕØº‚ŒMšv²5i»ONïÓö‹dû7´;R3ß‘-1&,_²E ,ÒgâtþÙ—éзB¢uÍM- q'OI.!ZÅCÄåy™ÊdιØq®°PdBþ9s*j4sZ e³ÛÖwŽ Il=ÍS>µ ¯˜Œ‘áší†™»*ÁOÞÂٗѳä¥8â•Þ#G#˜3¹µÂŸ1[F¶Å–ò+5ŒŒ`‡ŸcÄW ¸cYƒäÞD1ßJ\˜šÍW 4Òì$—^’oñk=zJ?šê}Qé|ÌÁÓÜ‘Õìì­®àë«qÕ‹•æ7/be Ùœ šwÔéö@ñaM]»'ÅA$ú‚X½L—½–?åw¢ë!ûÆ—`½²æzD[C—XÚ<[LîÙø–¦³ƒ)€Åö”ã3kä½îœäbœ ¬s¦.”pk˜ø¸Àh]7zl0’ÁP<ŸÍÔØMeGåÂí€ïRj£Õ ôný ^”€1¡wÝ‹`÷½æ-å$¾zs[JKžZ¢4k5ùx|Sàz°¶'Z,L/µ®:ŸxxYt©${ñ}6‚âï1çíº¹Ü3"\ÍTÀÏ.ÔfÿÔF*/—áÇ0mgµJyƈٹ€¡Á™èATõÛ™Š(–É«ãHΈùô¦;5àøhµÌÏñµO9Æ39.hê¢+dƒñ¶ "ÇY+¡È£ YO>›ü£6LFÉ’ê=ƒ,b‘:˜¥šLf÷SÓØ,Ö¨œøÎná¿Äã=—ëmÜ•æŸÙ^äé–“fµ>©ã‡8¯º²lš«æ^ú‰~y^6éy¢+@áõxÂÒ6Œ*™·±ÛÉPœQ–ôxüÀîkÅFÀØâ æÞäsb¨¿ŠÏQbš 7l›rµŸ„Xâú¤(§Gù­t".å‚“«Äio€z*R dÂ'kZ0ŠÊ]j ùÑ/Üæ‡kO¥×® “«há:™(d›DíG~G ¿‚àÚþ1[!G—†ˆLȺ5–ؙŃ ÎØ#~ûˆ³ý#™dÔs@{ˆ*!3âÉ· óò^uc" ü¾¤/9À¥‘ØÞz­N°k0WÂT† !@S<†äÌføaÿw¯€3¥ª Oå"Sö!/Š>Vñª\6·À”·¡¨ücÔ[§)9‹é5»Ms™çìcßɸ5VÀàLÒ“Æ+vj÷ª\uÆsVœ5çë›E‘tK#â«Ò8…“Wâ—¬Ø!ð)II–Ç`'kÉ¥@ð¹Ìsœ+*,_ž@Š&óxC|ô½ÂT숥6v©´ùÔë+ +â~ÃE'è!¤·wxÞÚhš-RuS¯³°–ݯeV/¼ªËæ4„d˜a¡“ÆæÐ^ÏE¼o0¿fF4"v?àôĬt?ºT+Á·¤`µ¬G,ÀÆÒÒW„ä+,~BQrsÏ&1€n¸öl1mþèꞤÚí¾ÉÝÒñNLTòºèêò ½CÄ}Rú™?“ÿ6‰7ƒI­¹Bm»HC®>djáZN”¹m*ý¥ 5LÍB Ü,c×qÚ¼ÇSü qÕP¨Ôîúí·ÁâÅt)ó.µj’ ƒëœ¿æŒÿÔö'ãR§–•Bd^ÒdëüþýØ5É tûxÜ͘.ázoý‡'h” â9†*Ø~o¾µ$£*´úÖÕܳU¶?——ºç„0e|vÈ0Óp•º?µ¾Ò_š`QCfÌŸþDÄz¾\TŒHä©xHT+ìk»xU#ÜBï¡2aæ##ózgål¦õg×è‘Ö+Öñ¯º¡[XU¨–­Ý‰{¼x=/ìª'ŒC4Y„  uó{sW]õUkvfÆ ÃÇX;OýÜ`øikãu!‚t¸tvàafˆkÞ^þuT ¿Ê!f7cÓå§k§H1G"/«›dúz"#€—ã·N\ „ž{-º‚ÍÝÐë{áöT‘æ`¹Í@œ.²ò8¨š!c"A|}Œ†îÈ-mÁ°•^%õ¨H—Ó}‚4štdp´‚cµ0<"=§\¸YÔ‹m|j¯%7p·¬‰BôÍå :W ÇTüY…:' g•ê7ª#±sR/m™º®¾Yºñ´\6¸á”ÐüHxõ¶úñ2ý7ßïLKÚaÑ8ªnúø 8‘…XwÃlÑB֞Ȓgó/l?GfVªB/¡Hùå±× _,TG!㧊̦J^e gÚÓŸ†Eϯ#ÇFXé/“Ú_æÎçÔ˜º J.ƒ±öÈ=ªtÒ­¶èLÑ|…J›l¨£»‡©Ï²N:Õþþ|h‹¶×Xz~™ÝøC§¼êvHþv”Jý•4Øòà&Œòz1” ²Ó­×òšFN/‡(ñý@ ì £Ð0ëàcùÈá‰ð¬5s&ü3„d!%:.^a,¾_ãd]ÞÆFλ¶Ã “ó?q,žiY/Ⱦµ­j‘CÅBk|Õ òL÷‚ì<Ô@fÉÁtþ.Å‹Ûâ0WÄÌÖõôá Ð~oDd²¯ªp<:@ÀB«á„Y*ªÖ;fö3Vdy'»Üšì[‹ÁMC•#Z.îäw#Œj*0às¡ç£®ì+)K’ô£¾íj4/ŸÍáëpd½Âð´°¹+rØE‘¦'>} UÀxõmŽ¢û";¤ÐŽxŽYÊl\áià(+Eúg±3ukêÊ»¶ò¶ÿ/¡^þMÚæÀ¸È°õ¥V¸ÄñTaMCLÇ+¸tKBKúFûÙ¥i:A‰á–}Eì~‚’ 4„j´ó»PSø7,ÿöºKÂjá¶ù|, Ÿ%è%kf é˜*í½ya" Ý#ÖšH§Ø‡þGöÛNÙ Q†éK_p®F‡W~=ü”ÒìˆO ad–:6fÍFÍBž¦à‰m܉:»ZgC= 6Ф†i;Tå¡T¯ý¸z®?@fhöÐÄT§ãÂ1…Iðnàí—TÓzG;ËŠ¯QÇ'þ§-æ™ð–‡Æ™“EÃÚçðé·t• góÿDò·QÞ,8;ÁºCQÀ'^ÈÝòoºÇÌl·5ŹY…:+ à> endobj 394 0 obj << /Length1 1444 /Length2 8303 /Length3 0 /Length 9143 /Filter /FlateDecode >> stream xÚ­—eX”í¶ÇI%Dº†Nééî‰abˆ!¤‘î”Aé‡îî”n¤9ó¾ûìW÷>_Ï5_æw¯ú¯u¯g®giµtŸK[C¬@ 0ô9'(@V]GÀÃÉÅÈ(ë ²„ÚCÀr–P(€GD„ ín àåðŠò‰ˆ ˆ`1d!Î0W{[;(€E–õ/'!€´ÈÕh ¨[Bí@Nˆ@KG€.h‚Â8ÒŽŽ¿"Ü: 7«Èš‹‡`m„¬@¶ö`,®¿ô(ƒm ¡[»;ÿÛäruCˆ° D²­!`GÀdƒÅ¥AÔ!”üˆúïä –N¥GÌèÿX-ìaÿk‡89»CA®uˆ5Èüß®† ISYÛ»;ý·Ujéh”Û:‚Üÿ:²wS°÷YkÙCvKG7Ðßç °õ‹@Œío \º/ÕµuØÿ¾Í¿MZ–ö`¨ÌùŸ¤ùþÍ<¿1W{/€ 7'77Âñù÷7³ÿ*%B¬íÁˆuXººZ°{ €Àl ò€¼z¹8Á("€‰ÀâŠõ×e ¸¤ÿ:ú ¸d~“€Kö7 ¸äþ!!n—Âoâp)ÿ&~—ÊoBTPýMˆ j¿ QAý7!*hüCˆœº¿ ‘EÿBì—åoBÄYý&ðâGhBœœ~{óp#¤[ÿ<.Ð?ˆ"׿Öâ·/€Ëæ·B–½Ç™!î® \lÿ@„»?щýˆïø"Ô;ýF„VðïRˆ¶Áö`Ðv„xÈïfÁÿ0#´9ÿž ¢7wä²ùÝŸÈÿžºþgÛ<Ù4Ńíö[É_òý¡ áî†ØÙ߈j¿Ó „Bí\AÌ ÑÔòG¢;÷?1?!Óó7ò"òÁþ@D£Þãÿ}ed ^>Ïm>çEÔDÜŽ b'¹ýþÃèîê CÿþC<Îÿf{ÄÃy€X3“ XðëÔºÐÏoäó‡‹ÑÙel¿ÆiÔ´5cMÇ#;öªº°-V]—d>ÝDߤñ¼¥t‹lòÕP8 t‰K›¸ßô°ØÌð®§4:ÉP‡m8Óý ÚÅm¬?Û@Ö]ìûœd\Ðuô}7W‹ENoëñ<-R»‰Ç—öÌ`A!#… Gý°j&>Z¼4—Ïáüa žxI h CAo^‡a|cŸ;†4¹\çc|H¼7ýE‹l¢áÓYe#ÒÙ’ÜûT†‡[õÐõ£B*`«ë ØDŸÅÐéUÊ& ­Èò¦79"”W÷8ä¨o2¢½c4[,\7çc7·+P™þÈ}”)«ƒ 5ÜmPÝÕSXèO±ºÑï40ijMˆÚP›œÆtŽè"£HhHŸ3j<³À¦¤]œàEEƒT\UÄÛ&PMs[_-,-ÚÙ¹7?6ÿAÆóYúäi÷@&§~Ž•ØÓ̯¤|Æ/—w,¯B…¼Sa³åÖ2äIߣSM¨ð¶ è²[âgÈ:_òrôí…gvÑ÷Iߪ|Æúé¶C´H(Ìñy'útT²—aÝ(©îFÍù,ƒ4‚.öLš„˹S˜âÂVCiúÞ(cS3 ]¦ Ôî‚“øsßGÃG18±žº2'Y8%\\¥|SMTÊ–þžVÎlÔŸvº®¸FØþÇ[Ë…µ{ŠüdÔ}Gb÷s†G°A1>Mˆ°êR–sy³1GÌ­Ð;½Oµs¿úÞ®¼þHº¢$—(R»Õm‚úî´QYR,\åY‡yvl=Aß*OzYÇ C!fgÊ|dG›NKŸd¢ÉcüDlªÔv/’&”w™©¢ä”|ýb"dÄeDÇ}ÛIl{ãH‡Bq6w®€¬Ñœ@ XSG}”‡csB·å‰³d$^¶£ãžO(„«§ìB¡U™S•ü´^¹Ä,¸<›_EJÄå<úîrzÒÿ÷“ÓÁ—m/] Éëñç>䣆¹Évút:¾ª¡×e~N ž¸-ÄoáÉxCÌñÕìm3½ýO¹¿mìå2Ž ýž_ÌŒáA5žÉü/©l´|Fe3ᦟòÛ@V9üR¢±’ö½2?Š¥{IwP•æhªÐNùX›¿HàBËãñRÌ‹ö|zûÆðŽÁ´'ÔÉO™Å/?IÕ$¦&ÜRhc÷©°z4Z?]×~š× îc¾ÌeŽlâ€tAz·« ?8¦Š”zBÏú˜jË-êsR3nš¸©|zI¼å©§}ÆW†ž™ÎHÛØ×ÏÇ7áwì–?ˆä8¾g' •zUÏTÒóžâÓ/Ä‚—VˆCïð îô||»<§Ç˜S¦ó½©4# …h¸9d¨¿0gàX›¬„Îk©>Z¤nÚ2ÂŽ Àbœ²Õ_A²´.&vaÒý|]Yð3osìéûlY‘ˆÙË<ÒÑ¢§4ìé Ä7ÌÙÜÅ—õ^æÏÊf³îQç:&_6vè[ì•ùC%û›sÁßÊ÷‡ã[©.ù²Îý.|/¸ Ñžà³ìo¢¶')ôª¬°Ïçßx9©<ùvß±­?Rv£¯Î‚žœegƒÿä<N²Ô}Ø¥ ¥s’¡|Øû(µ·ÙÛ¸›©qÕSÙ"„JcÏm}ø›l‘ûÓ„£Úæ„‚K!R‘Åa¸tdqaÖ4HéI}M¿g¯Äó’ð€0 ”CvF}"¬¸ØiÃSgÍAQùíÕa»‹ˆ3{&ë>5 :3?ò¼üéHŽ›ÖeˆÄû :[°°Jÿ£<ó£XÊñuŠ}~]Tù Œ.»O†Ëºð?Ê^Ô_iB5äU@[f4£NÖºxÝ!ÖWø{XŸ_¼œ¡¯fb¦êóØD=ÙÊ·˜cQGn)¢^ùè3¥Þ9b8üú-I½K=gMȇ[½x§§ÆÜ- ‹ãZ….òŒ¡ùÖš\ŒÍ+Rºç}7«ÖzF鶬þõ0*¼p^¼‹×2[&Uº`y³Î‹÷â¯"‡4yµÉÎQ§¢yß<–cجþ)6 v«|XKö3Ý’{äM@—¤ëüöçV±‡ù î{ñuíÓÀµÇ*OãlÝNí²•‚07Xj¨lj>øMã§œÃp¦½Y—É43©ZgÒ¢^ùÚG–5ÅNJZ¢ëݳÀ‘g¯~¸jù”ôÕðÇF©ƒ¡è[;(ÙJh–v5Ë1 ˜CKÆÊÇ8Ä…1NÆš´QýíÚ´8›­ED#ˆaIiœÛ;öLß5ÎQDqóùG¥ÕXDªž,¿øH1&™í33¦_á)¨ô°t±J¤6êèð=¡ê3ãe›ÅK°üâ  ÛãÃ_(Þi„ÄJ8F˜ìBt˳kɰ£×ÁüEêIvûþ»9ꧯ ºžÞÍ3ŠN%ï첪,¨[Sä]˜5ˆØL^ØíÙÊ©:‡Yöûh ?@ñJì¯$6¿€cŠFú+`»£âùJ°åPs§g…TüÜåòCóƒâQ-tv^…W‹ÈOֻą]‚‘–†}2–7 ÆøBòØ<°GõÇýÏàŸt‚„—ße åÑqˆÓÕú¹qHõ}2~=Ø«ÿF"ö}0»bsDÉÎÕ‡›3Ýôz”âŠâuSÂQ·¢ˆ´NAÓ™a‹®$ã«¶KüÌ¥~zzçg”bq™%hþlâ–b™7"¥Ý-ð‡æŒ“CeÏGÙY+±Ï/K|M¤è9òG _~…'´Têºövƈ: «AÅ?á{z9êøÁ¿”Édu u¯Œ$ëùP„î(~”¨køÙ}Û‘/ï¹C%çFži²š³/`Y­\U=2š,ÈrD/<#}4/«QRÑÉòÚT7Ör)ò«­×ÇýÎÌÉS øF1*goÏvêvÛ 4t´U±v)\Ž'£¾^‰ô´jjºÿ}Xgʵ–×äHÕ3êÿ¦ÒÈ"é ´‚/ó ;º%±¥h 7wu$R-÷à »L i4GEÿ ÜŠæ9>ï¯2ö@öL<\=®ÿq‡~jºJÕO#ž“…¯¤XU{`ûsÔ^ƒ|Ÿ©ÐÓc_>àZPž0&ŽÑÉçl¶§™h¡Òu¾Âz,{¹Ñ4¢¤ëz„|ò|qk„°Xp&ï7fŒMšprHxEãºá0Ƈˆ­ÜyÒ˜þøK­œÚ_Y\1L®8ðŽ“«È$Fß®žRlΩÚ`£0À·œ`Éëà\"ÄÄðqÒèíÜ &Ú<¢µTSêäî_' kIësØPÓ@¤E|‘b÷Êþì>rñqÜBTòjÕ·¦Y›ý¿:¦èê%„ÈIq\.iæùJ£vµ7p‘µWwî ¢ž¡·&³/—tWçÇ&ˆøw¿¦‘Šs§,ÇìUiÃ$³!ªÀ+«‹àïÑi²ª.EõÏ¿HüÖGX˜î!Öànµ¬·ÕÄ¡RÐW’©$ôǤt÷úîV£¦­<#riŒ5Õt!Kï®Í«ß§ºµµo$‡œ÷pF&êï©9ÿ¸¨ôÓh§©R' ¤~È9V~>gÞËqFx•‡¡Z/Ö§– °Å†V¼èÆSz¼ùôl6{zÕÌ tÄŠªK£e£ôU½Rý¬o& ý3n%-jã7‚SƒÓFLpžóP›yÚ«ÜVÉa’eM¬…J1•0«æKZð®'úPñ›Œ_u´b¢mä)lï6?|mðJeªŸ:ͲÎK#íz’L¬OMîùJëô¬™ºëÍóØ¥ \½~SY—~îÊG¤Ùúª½Ý¶Ò†ÙËÕÕýähb fÍe6fÛl Ö÷”3x$çm7ÓqÏ+ O$ÏPÆ»sº€øzN7KÊÅÚýŽ>Z äFÔslO@⢼G¡)Ó‰…0ûÎW–ÌÍÞ\¹èZD¹(¡‹ßd82æÂ@¹xo{~,¦ar )8¢‹å“eŠ·ÒN«ø @çMV¤Mî õ8íÅî’¦ Rù*oª»GÝ^*ýn™OŠ„½\൵–è-`f‘F\þ$¹6ºòøÄÝuäuOƒëUŒQ²]p(Iµžôð S_ñBxjCùiØ.åî™$¿ÙÅÇÿÞ'ç¶ŽV¤²R~ŸœëÆ dø°ªË(rÀ²Ë³üÞ Ç²q3áM(âF .%…~9 ë>Çù²ŽÙ£‚ÙpAGФ†Ó´¶õ‚$óJžQRfñã¹Ýj0pÉ%稷R¹ÕåkäZéliƒ*Î÷ Ň3#²1Õ7ßÓX±d°²j ÞhcÞ‡*ô‡i ¿©Š¬ªNûxáLÐ6šú ÂôpxtÄq6µú3ïUúà ÞXXþƉ<ò¤l [p¤(øÛŠ»u/#”¿D`Io§40‹]¨£çn®N—ÁÓ\g.§gà—O)öÊâàYãÔ‘®HÓZz6Zæ“Å/-ÏØ'¤k´)UïáRñ7Ÿ¦|å.Oý¿p ØÐ€ë§tÚÒîAÀä"³*ìxLØ×}Š^AŒ0äß³ïüÁ ÂtÏ rã —nÃä.š¯†W•'jöD™î¢}Ew(l‘ĺW´78W²«¾„²,qÒ9B©ÚUÍ¡Tž<¥ãu®hb À©²4HêŒàÃãi•óS61 ¿FLN7æµÇÖЮòz®(ÐVSàñÑ”^ûªz Ò)“*®mwŸ°¯T¨ÇŸ×ÏÖÎ}y«Õ\ý.a¶Þ°÷hzñ*0ÿ»øûí%ýh=ÚB«ƒ&Û L™Ä/æÏ÷ØüâJ†S¯:xʲ§A9b±â±»±IÝ·“Wˆ:7e8ãM¯Ëƒ­®s¸T/úÚ-Áí&5Bcb€ÉÖ–€Dĸq_Ç ‘ƒÉ'š|ô6ç#Qlümï3\¿nLžHü+VµÁÝk¥ë٘ˆ˜ýЃgÕéërùzàXzÜ^Ó~@ÙSOl•ºÔôQÚ»Úâ Z[zW>"w…õIØá±Jn Ý‚³ôhÊçú2ù­CÍhn†¯ûñ›ä‡ÃRhƒ¾œ½-uNÒòlïÑóh,á{p7ë¹ÝÁÑú*¢a§C••«æùÌ>¤Ç»“2r*¤D¶éô~ÙæôÉH3¼¹à5ÕÙpVF`>w5ªÏÇÙwÚdU>ù0lSêÑ8WÖ'ú±­¤OêXÁèô„”3g¯Féœð l¤rq4³bÙæ^Æ÷‹Ý—Ä`bQ»XQ?1hÔ_Ì—ÒþÚ+:ôn'|ðk øÀÿ]½˜}•Í}ºÃ—ÒÙ4§\ÿbÆ8%iÍ.æ5g¹ÔyH“¾Ý®Øªõ`ê²C{°®DØ¹Ýø§È~ö÷iE+øà[Þ|6»ð{ƒPcî8$7ÓÕk§˜$ï§càõ¸&EÎ}C3ôñp6,<ôÑÞæ»)~—}G‘4µ÷ôc‹ìùéóü—ö×Ñϼh–VjWàë¶@¾/|׬¶ :3¿È=´d4_¤N«Ýøë¿ ¨t6aW{Ú—ªhìÍ;’¦ÿÜýPøîâ>Gõ¹÷JaË@¦|O ˜¼‘W•³Qxõ,Ù8¿aÉõìèѱ…”k«ëiÐ)ªØ,mñ×LÍòÑ>1Ÿ,õ\W†ðŒ9ß#÷`…"‹ÃigioµMd6@õ컢0 ®ÿu¦³A™šàŽJå~†Ý4kû¼'+#Á,3~Ï6ädjqÉ÷WöcC”•âWƒ!‘xÇ _7Ò¦lXÕ†ï¤Ö/ EÞæ(–òƒñʶµb‡Ì‘_ñhó¿/Uú^UUìY ê[.Û¥6.¯»â&ÂxË¿žÏδ*ztU$QÔéVõЊ9øS ÃÖD ýŽ?=Ý ^öš£sÓ{Ë©¿¶í—O3+]¦XO›`·¤õÂÝE4ú-Š¡†¥t‡¯A^ÉR9†îý„Ög‡ÐÜÖÆÔÏa#/ïûͪ³çÚæ‚,LLÏæç›ü{#îÝÝ”©’îÚl/ĈÞh :¸kóÌz›ÇÊ0‹Z•‘½Œ\Òwž6 ÆçA‡ŸÌïǘuoJxWÓ¹/`KÆEÙ! ~»ç€ãøa)jšëù"%—P q\¶‘¿SÿvÁmÐ*F‚3ÿr•ã½Óªc òÍM ³Eâ/ó‰!9Þi>@‚%7´ž@nAt_fJ<Ç«Þ*ëTYWTŸ£Î­I­s(Õµú…ÓÁi,§¨ñÅØ>é!þ±Fä™8ÇØÜϱïIaá¸(PoÂDQb€=Y8%üd8û—Í‘ýp¹)ô©³p …-|ÑÌ)5•êínÍBÎݸü›ûgï3RP´žnuÚæþ$…¢™.àç§ÊEX.ðGꯙÿjÆ– :1ô‰'nÊs7º›Â~Ó¥YÞê1>5HÆG•z.÷ÂÁ“*ÄU»Ò€ðí$‡¸»BÀ× Æ¾.jë.êò‹JóîZ¸dY|c”†n™‘nVýí9öWÙ»k£­ñ4ß±X!ÔÓ“§›eðä7óg¾!ì>¨8س÷…¡bx²=ó›»MVßGÁ¼¼= <_ÎBÜÝY@÷w R¸û×Í„ o ápî¦q©©¡Ñ¤ ¦NkÚÊÛJIŽ…ð'6ÃRÏ[õ¢^Kø«ŸÍ81³‹ÑFdE™>JHWv—Df~¼Jƒ&Lˆ9öûH°Y5yOzfŽ„×M`åÍ럮,˜Î¤ñº.{Ú©xV/ Õáñûñp:«{º–îæLgšJÏ›TdúeÌ‘G/Ϙœ‹Å ø^(¡^R['Oßž¾$ÑerûEùæ#ú‘‰AÖÔ+lI‘ó¡2½bӀˣ·W:tl㘷!8½ý^_ÓÙ¼³ó j©F—Fp»sÐRÈo¿àÔ³e9ls'“”b!™;2Ÿ–ûÚuUáígk/Öä¿<èõköúXSÄk=„µ`;aG}•v®³ñ1Vþ~Õ ǽhåe KB5æïýÑpdãÄ)ÕÇ#~ ‡m~3¢±=Ÿø¬“aèu–àWº¥8†ŽMw$˜º;*R°c=åN~P¢âºE®÷Jìö›,)­':'/}ÛduV¯nD¦Z"¶ €x3BS/ûfC£Å·ï$0s©ïì–ÏÚœÅbrDT,kŸ$2‘¯ÙïÔ °邃ù$r’NeŽ@¸\UÁ‹– ™ÖuYNÑâm~ª»{9«øcF†êÜoµ“ÈZßeª¢ž<5ƒVwÕb€˜Y×dN ©Sö%ò»•ÓyË4q"âãGæ(÷W“@‰÷±¦Ü­¡s õ7t šÜñœ1)éåQÃc@е‘é‘cFß1)5düŠ ÇÀóD¯~µ6yñçÜÉNBäýe`ÛCßɉ¾¿`À©í_8zqÔ7Â/Íúi;' bº£Ã‚†¬€DÞÛ2xßóó*&rEàã²ÙCŒÕ–ÉmÏnILg@û•Ò}?]’t×À¶XŒlMöy4tqÝ çmE3Ñõj>–zf§ ÿ„à;‘&޵ä>à›[¼5ÔŸ¢Ouo\&î1€’k˜ó'k¥#‘TX$ +;2/šÔw¸óÖpóõ¡kË)ãA'gpØ+º¯õGe¨.Q*v‹ð+=N6üÀ;9j9«e.¼“¸ÁZ`h•ôyàjÓÒŒ¨ânϤ‡ ê“O6‡ ³­D­Û¬[تÂuètWm_]e]v  5צm³hx‰”3CýßÇùý­ß TÔ·L}!kG>Oƒ„Yž£æ+2y¡ÂJO#dË&Üâ(y>œ<Ò{x$»*ýëÝxd)…†61Ñ!°áp 'Χ%Gþ4"ÓÙëY×®‡Ç¼[Í“ÉGéC‘ÃΧRY“ ̘+‘òl3ûY¹9’sþæL|3ö×£Î#AFDÕö(vqFTJ Á왘ٛ!Ž·Éá¯%}1ó&!&M/y7^hÛF'I:yà‡æá)¨¥æî™¶  öÀ''£éQÂ&æ/R=“˜È ÙGÑ?äh*ÃBW$øXÐÂ÷ÁÓuõ'€ø1, RmG—:ï„!ÁW<óåzuÉ.$—f$?#j?í~"I"ì)SŒEŒäõñó6J˜éøFF[N{ùb’÷‹VÁ)b f6Ì´ôr 9‹Œ/ÁÚ³¤¡–S_.ºpMžK ÷ Ç|nÔŸæºè°LÉÞ—©’4DÓ]Ãeá ¹ÉAáINy›Ÿ3'ÑÔ2â¢ʙЖ[{þÖ®ù¨ [Øš÷æÈ€êC•ã~Â&ÊTí¹¾ÌnŒ ›R(µuŠÅã3–*3¡öæ —¹{ùˆ…‹™„ZRqÚGéU\rïfn™i#¤’j‰D‚Åå úF¯¼˜õ??Crº ú(‹dò­1âÎU^Týœp5ú]$GŠÐbܽK}·Ÿì‚:˜uŸ…4zº%Ь¢~ƪI”áÉ8—ØQû®üEËÐÖGqš={ÔHL{Ãã†JÂÔ;î`Ò‹m]½2š.mzßÚ¢Žñ¶Mb×\)½`ÎÅs™0ÿZ,&¬ò?¼NïV endstream endobj 395 0 obj << /Type /FontDescriptor /FontName /NSZMQR+CMR9 /Flags 4 /FontBBox [-39 -250 1036 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 74 /XHeight 431 /CharSet (/A/B/C/D/F/I/J/K/L/M/N/S/U/a/b/c/comma/d/e/eight/f/five/four/g/h/i/l/m/n/nine/o/one/p/quoteleft/quoteright/r/s/seven/six/t/three/two/u/v/w/y/z) /FontFile 394 0 R >> endobj 396 0 obj << /Length1 1172 /Length2 6243 /Length3 0 /Length 6965 /Filter /FlateDecode >> stream xÚ­—e\Ú²ö¡w/Å‚S<¸ww)žÁÁ­xñ²q×â-P¼¸)îZ\Kâ7{Ÿ{NûžûõýåKþ3Ïšy2kÖ‡0Ðhh³K‚ –`9¨“;( VÕVr€\ Ò0°…ê$cá…„€Iw7<Ï/ÌË%Ì ¤¡ÎÞ0ˆ­€YúÕß"€¤#±²p¨Z¸Ù‚á5¬,ÚP+ØÍ› éàÐúû„+@ ì †y€A@ ±rX‚m Nœ;Rt²†þ¹;ÿ;冹ÂM˜á&_àAP'olÁ©…÷Ãüÿ0õßÅåÜÔ,ÿ.ÿÏ”þOÞÂâàý¿ ¨£³»P…‚À0§ÿ–êƒÿeN ‚¸;þwVÑÍÂb%édã° qðòÿ+ q•ƒxA7+[€µ…ƒ+øŸ8Ø ôßFàÃûǧž”ž‘’ëÿÞê?I ˆ“›Ž·3Àõ[ý3|F0ˆÀ˜‹ƒ‹ Â?ÿþfò_Íd¬  ˆ|-øø0˜…7|?àÄð N °ìwÌÉáuƒÀã°†Â0þ¾T.§Üß¡/€Sé?$ÈàÔþMNýÿüF9-þC¼Üpr…Ïâjÿ["à´ú-—¶‚::þ>ä‚÷ý@'ø„w·ùáçmWビ·³-Øé<ùùœv ܰý(àtøá^#ü²8ÿ¨ œÐß½áZ¨ÓNð_ïüÂÂþ@¸-×?nËí„Ûrÿá¶<þ@x+ÏßÈ ÷áýþß…“’‚zù²ósعù¸þöÄàãòÿ„Vî0ØÉíŸ _Û³5¾è`°Ø caj%j—Úð®ì­ì‡ñräW®é%¡Ãíaué"+"Ó°Æ10Õ)~¾ä#^Ê¡r'Èšo¬AÒ¯ßW›3l¿›èU~†6ê±ÕÁÓg¹}ݸŽÙ‘» Ô[άNjt«íÈU*û@²Ã¨çes³goíFÖ0Ó@tÛ)&¹-*É`½½Õ¿†nÊC?@ŠHßd\>.uŸ´_ÆNŠÎUEšI»Gçzåe½>‚Ì´§^0HzÕ4N¿ŒœÈ°0=Œ$sv“Z–ãÐicÃw0bkô)^ mñ±?ºîå='M:^Û9¥¥7³Ú%BCªÇ7âÖ(^^?./Q­ªbÜvq>q–M±ðzO;Ú~þ¼úoÖo$»¾õÀ’:$|l¨ñ¶ÜD®¥ˆ^«û?îH7‹´E7mž*µŽ`¬F!Xb!‰Wƨv­œu?©mi€¢‹‰xé|aµyÊ ¯ÒÁJËusJèøÍ d¡f€öéy»Ã8¥tÍ7gƒþ&íË…úÙ}ª¡ò7+ø†Ÿ·³B–*Rfš«Ô.µ&°pÅwñd`ƒ±Sú,Uì²%˜W(DòT›=t«BݵÆR#Z©ííöƒê~Ù};T}oÕm`z (ÊS[õ/]ª'ý ·Ës(wë¨øG×~a¹e|ÕÉô•!VÕV·!©mO2ÜL«þ5þ=&‘w¦Ò&yo"ªúE" VM=üŒµíûI|B1°¸ÛôóUw2ü±ƒ2z gœEi8Ÿ½ iApØÔ@M_5ŘrÁPA@ø…k¼ŸËÑÔÕÝ+ó¬5¾œ—V¦,râq?º.Öx|{è'__1+páëx³CÚ‰nÝT¨Ú( sÁkÀg[wÅ:êÊÁRÔª¬â¼A-¼PÕóÅÜaöíÍ!µ*á÷òlÙ:Ñ5tÉÒ1äÉFÏ.JÕP¥,”ĉï¿0™ÖËÙÓ óú¦¤*â@êòá %󻣄÷‹a]Ÿo$Ð=Þ—¦ x½8Çm~Ìœú¸Ò夗g±9ßö­DÑî’xͤ GE6&"*³lõ‹9$¯I.§îià×T´që{à<¢uŠ}õ$BàÞól<Ú´‘âÓ ÅëÃ'A¦¨­~ZË¿ðF^@×õ©ÚxJ¸Ÿq·&âPÐoÈK2G˜Ä“í4_cÎ"š%! £Ê0ÌêKœ V U-ù|‘Þ“¼É ¦ÃýŒ0ÒÒe½Í{TÕèýž!ÝŽUÀA¦AKs|ûS;¤ºEœïÚÕƒv ±f¬Â¿Rä G(Ä<$nj@«¼ó3ìý…šYºMo’•½I—Ÿ£v&lRá E™1ä]m¨|Ò©ã±­örl]›~ˆ’†l‘âåyÏ\ƒ!UI`¿ÁZq 2§T‰à¥F—‰”ƒÈÐÞY¦)¢L±3ΚtÖ›EuMì39Ó—•¤ž.µ:B éµ%eG;߈Æ9íjŒ]ƒ$Ï v¹ÖJ±Ôa{sþš„÷÷>¹2ƈí²û¹ïè²CqGÄ Þ‹ÄA-ø_Ôc]ÙÞM¹.JÉf7ºbxlfbÜ{&¼}Ì%ΣxÀߢx ¹`f P2'ʼZFB_ѶˆÓ¬úü`нàÕ•xòƒlÂ^þÂn$&pµ˜%ä$øêæ=ø²8œO ¯Þ'ŒZü'ÿ‡£“C»dŠ­Caã÷ó²%”ÖÔŠô…¡ùÅqïÕ7œ\ØïF‡ùʇë²ðôKp,"¬éîÒ6ŒkËè§sQb«³·b†á’K±Ý!6Î<®C•¢\èë³S™l}I%}”òtí?Õ±’ Š˜zdº_'S1Žså²NTÝg&³Š?ÜàdƒŒ”egH¥{óï7^Ì ÏT².Zk3Æäë,iöÅ6‰û Ì`ž„‡¾Ù·§½#ûš>£-—¦ZL*)nREøž$™óVH'Ç·cŸ©<ÝÔŽIê8bUÕ3Ù7Þ%Å“i1kšjÌ¿×tßfpùÄOEâÜ!˜·ÂjÄ».lè|±Å»²íxuNöÞ“¥O/8Ř9¾N9¹æþÓi-ƒî›ÉŠçÛ¥øˆ–žß+²Ìq^C.¸Ÿ©d“‡õy¸äÈØ7ŽÊòwùˆDÑ¢ 5¬&‡¯j&¼üuFh^+Dåt˜jbÝ¥•Pºéþ5gF”"P´Èö »ÏWROèÞ+ÓèªÚ§å´éà+©>tè-Iöº¾ïôS;…žÎa»ïwèåDˆB7ab•ˆŠùgºKN8a̧ô¤M9C*Aïæ¦d¥×Õ¤Ô{ÑÊrä¾"ÉIå<ß ãº"Høžþ27Ô¼4ÀlaóLžµ¾®™ìñ–[K°ƒ'55}™;3Ч»¨ñÜj.•a&eª v1C™RʺÊfyœ`&[[YE¨ƒVl™Êñ‹²ï]ô ù&*‡‰KÀþ¹%/¤Y×ç xZïõ§f„âO¨²ÜTa|aäó©)·U Y‡IÛ>;>QøVâÈ—ó¦f~&êlÝFSž¶º×ªÁ)xâ•{SñŠwA–·¸9›4®°Û§D„3²¬‚ª¬F®TX1F?V1%ÕöR±•\à§«ò JQúéõ‹xÇ9QÚÛ9 H7¿¼Öò·úçõ]†Ã¦b0LBŒÅðº‹|ˆ&BÀ¶óT˜l¼m4bÍTOÃl8Á£Ì9F×Ôܦì'¾7×Ú<¥†³‰„HF®°ƒÒA©y5¯¤zUߦí}߯ïRå‘ñ¿’ÁÎ?ÊÐÞˆR8øz0;?(m÷9N:'´+v9ÜgØt×ø>Ô¾£¦Dz ^9B¯aba'Ž~ß÷ð­8‹»%Ʀiò¨=UÛ¨ÐúõýëÌ_º_}eŠbÙé±ÛRcÑ×ê@ZìƒjçJ2"ѧsâÃhK-ŠßâÒTãFË 1™¥‚з:ç Z:éÞy±¼§íC%§k)£LEœ› xÉ’6·ã|"P*íÌbД٧•rvéÕŽÀªvF‘¿Q&S&>º:M£Z^93¤(6n"xpª`ˆ²{æ¹_¿ûâx¨è+ư,wŽ=^ô&[¾éj†Ót¤tÜ^oÉDâ—…ÏëD†¤o†õÏìŠKƒ«FÜ_¤öÖ°ØMõUžb)#Ÿ’0Ûnßà˜Å¦’i52!ê¤×óömÛ5^E/pK®˜·¡ðÉ¡!íËhžÏŸÝØ Lú´')ðñÚÇÐ4*M£îÓò%ÅLMè÷ÉðÀnÕW’ù(lÓ<»Ä³ç‚ßb–> ÷<šÏN)“óÊí%¶[ÞmÇ,ffª=¿‰çò]BO±;þÕaÄ©L ”UÌQ»5*rºåo_V/jl§ÄªÛªóŒýíB´P¦DSÉ3 ‰´épèò…¯cÏÁ21 Ÿl‡¤véÌQtî)¶Îƒkte²)+4å;’ô¤¡6ûzƒŸ‚Ö9Š „ÊWÑÍt敃~4 –ˆ’‰qÛ=ÓQ@e°mä ¿™0¯æUškgò urP›5í+µ§•áî対ÆJ¾‘ÒÖì7oní'–EMÐÇTÐvþxñìT/wŸVŽÐþg&â¯öËx3 ΂ZÏ“0™¹¬O²ïý)fôå5©«#¬æ¿Úâ™mrc©˜ÙmŸ+Nì9Yuåôè—ÓªVq €ðÂGò>… …¼- G´—ø¶wM•²þ®Ê¸5wZx!u²mme©¿EÌS"WW"L<)7•fkG )œ?\©.Ó8IOïxÀ¨ë ÐM2òا–x›H=¤Q‡Zò¡UÎ_ÐAÓk¯ÑKôÒµ& Ewö3GðÔÇÈýÞÏLeÍ()Èšé, H—ÄS¼_ÿ•%î{Ùù1þ`'¤Â4þŽóc®›h]¹Ô }f:"‡ë/bK`†lÝ÷ÎYŒí½Wû K‚Dcó½·!SƒÑÚΪ”#B™­]1@;s!Mm}÷'SŒW ª,`C cÞžòM»¢äòkùÑòµ‰W"žãÛ•–%M™³tÝ[4›ˆÍìHôôg–Û²L:–4œ -¡³gþÇO¾L 1oêèA•QÌ9îY]Ò”Ö™<9íÀ é–¦0謤òPå\ù‡®>Eàê]^ÃW-:DâXóÁ¼[æ+Wî!…6ž¬ˆ—ŒB\7KÛ‹=ïÙÒz$öRTgÛ‰ŠôÅ–AüO­VõúÌáâœä¸(FnîKm¤K YŽ˜×fIs”cœï·˜QÓÝQzåÍäM?¤îá Òð É JE«•Mð—9Sꪋ“’©iM–וH'„‘vϰ7Èî>êžÇž1O9µÕ¼Ü¸P4ˆ"Ñ6h/Ï»žXØUª–ÕUÃ1~1^$?wl¸ÿÕ±µ‘!¤HÃú¬9Jù΀ö`¼*øÎ\‚‘c†mMCS§áÅèÒ`þP))«)A•-O¶Ü°øíû®zúiÎ „°g"²;y,a-È£ C+·'fÛdË1÷MªÎÞë‹Ï´y/QµÏH6Œ.ß+…k+D>[·°tcF;à ŸÓ DUK÷ü‚üVÂqÅjFY—zºÈ•¸Ub.ûS©Nq‘íÈ=[¶6ü5 R«^öŠ0@Á;nŠëª>[Áµv24¹ÑG¯›–ÎðÎUû)ç°”y,júf—™ŒB¯Ü7̾¶õž|*μ–ž<ñŽ—cÅ<œ±÷ÀA8÷/ ­Þ¥0ÉðÊVMxÉnuH;j’0†ù›o€Æ¿ÚS(L«IÒ*âÏãyÈï⼨Ë…Øš»:ø- ä¶c‹Ì³œ~ÒÜTIÀüÒR‡TýD´ºË-­³Ú@¢~êì QŠýRТ­zoÀÃYõÝóÐ{3‘l¼˜EÞ“Où^àë³Äìô®/«›!­Ë’/ägô'/ê6C𔝠ý‚4¦;{xÐ5‡ÐÛØŠ,œTÜ D³ln«Õ_0fÓ˜…Ïm•º\ù×pyùû'þà?Š`,ºœ.jj"Ãÿ2ΑµN±ç;Á ‡¤cnâk#k[{Ûñ(oäùðê*ŒÙ—ˆÞ©*m‰Z•*hë{Šž{”Žb8•HäçŠ<ì­ D‘<­J$'·5.YËÞgi-¾(¬kIa•Òê@*¾%¡§4“ßœ"q®ëäµÈžUÞ•u°ä÷¶3®ï4齬£˜‰¤•(ÒcÞø¥1z°¹ÛïœW7¿¶:žg¥8;b­tÑáÈqCª0‹QÁž‘Aéýzù`:DÃ_qË ?„&¯°%µ6úC}Iw'L1ó&–õô%û7);™#ž@+XOYZ9³aaµž~ë̳öIÿx›·~Y|Šbíýh‘xǨ‹p—PÛ:7c•ç4]è.]Šäáú°q$u«^«Íö9÷ÞmócCÖ ¹ K¯u«V„ðºJD`(ù¼ºK›<&ãÄ[§¸K­fêÂÕd’~Ë‚XpFx€÷†¸‰{õ²6:ò`‚ïaY¹Vd¾Í±}Ýãã«°E¥$â;â:ì¯ù5fOsç<Ð$<[×[ŸöÅ”ŠàÁM¿Ìþ‘×£¯ÒÓÕ©i„‹³žU~æØ%}ÂÖOÇëï$þ[zæË;9Bà°ªó…™C®\ìo3ò}ŒàØÉeÄZ<Û‹mÔ@ó @“×¢ àùvŒFþ-tTakÿ›·ŒÙìéxzpÃ:α|é3“Ù±ñáÒÏöEñiêéå(¦§WÓañ·ÿáZ«@ endstream endobj 397 0 obj << /Type /FontDescriptor /FontName /VBVZJV+CMSL10 /Flags 4 /FontBBox [-62 -250 1123 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -9 /StemV 79 /XHeight 431 /CharSet (/F/J/S/W/a/asterisk/c/comma/d/e/g/h/hyphen/i/j/k/l/m/n/o/one/p/r/s/t/u/v/w/y) /FontFile 396 0 R >> endobj 398 0 obj << /Length1 1151 /Length2 4924 /Length3 0 /Length 5630 /Filter /FlateDecode >> stream xÚ­”g<œÛ·€‰.zBtƒè£÷Þ{/Ñ™1F™Q£‹¢$zo)JDt]ȈB„è5¢GôîÎ9ÿ÷ܯ÷7_Þgíµ×zÞ½×¼¬†&@%0 ¢Ž€# 4@EÏD×Ô$ sp¨ø@‘0\Õ ‘€¤¤@%?(@³..- ’!æ¨ ¼}`PW$€[…ç¯$ €’'Äæìè9"]!ž˜ÎŽ„3 ‚ (yxŒÿÚá 0†øB|ü!`b†9#N( N,ø—“ÜøWìçõŸ%ˆ/F À‘ä`Á¸G q!ÔG`zA0&ÿRÿ,®îçá¡ïèùWùŸÓÿÉpô„yþ;áé凄øô`ˆüŸ©ééAÀ0?Ï®j!=`ÎJp¨”ÿWæ«CAÀ†0¤³+éãù; ƒÿé9½¿-u,uhòý÷bÿ^6t„Á‘¦^€ÐŸü¿ô‡1ÇäC¬…„„@˜DÌï?O¶ÿh§wF€apÌdˆ‰}|‰1#‚!1@0ƒƒ!(…Q€#˜-ÌÉ„\>ÄÝ+ærÿ ý‹$‚NH èü_ Á7„Ü@a€ Ë Bo (@Ðõ¿(*†¡@/WüF&»âA·ˆÑt¿Oˆõüƒ˜£¼Q3Ý‚ˆˆõú£‚éã…NÄŸ7ÁTóöC`Æçï)ù³ó>7#ì{1…n&c„ýn FØÿbZüAaŒaà Äýÿw²”•¨` æ+ˆcÚˆK‰‡þ¯d7gâ<¤©,ï" #Þݱkìtlqõ>³ßh|æ¶i"&ÐL3ô.êwá¯rl"'B·ª/Í·›,Éùî<=3Ÿ/)nb´œ;u/ƒ–?{¡!„’u ÀwðpÐÿ©_‘BžÌÁñ1:\ô4DVSþ,û¨—¦©®GeÎÙËøl…+‰ÐͿ亞ësøwF—:œÔ‘V¹‘'â@IŠhãÏý×½û•ËNI‡w SîÏ"hc Û‡µ ¬–¯X×MsSï„%¼”oµ â—߯]!¾ºw±ÖgoPÜ\¦ÂS:|/®oStÊ—@‰9wb; §j¾Ç‘1¸ Ôû^ãöåŽâçá6I~ÚOj̺qîØ_"¯?*hpõÌ7òÐßlŽ,ç2ŒÈyØñ*Wéè1öîÿ8!xÐVb¯·¢ùZñq¹§Îaò)ô­ÜŽ‚—ýFx8Ööz÷"ütuf½qï O‹<€'û;¨ñ/”…0¯aÍIòv|71ÄQHÈ’JÖ'ö{Dîö´€ÄÄ 7ó±ÇåòeA`Óe$LºHLgtkŸÄ3çøµ±`’GÚ«A°ÙD8.ïຒ2¸ –+ã´„Vœk-öÕnèy½ü4ôsàjº§ç´†šsm0›=T;OQád$Ì&XJBçF×öLJz5͆<zÁDǪ#,¸¦“Òİ幊V1GB½I®i“?åšJk=ÏÅEd®Ñ5*ý<2[Ì#$©¹ÌS~ Œ±ïèÜgK‹á½Ûê-’‰â«P\°—´’ã~BÒÕy÷nÙ d—¸AOnyôh†ïÈRW‰xìå“!%¾—Èûº¾wj8cây¤9»¢v R‡«IÚS2ۼ›ÊA8¾¨O{ŒrÉ?{W?ì<×hKÀ}¥'í0)R¬È“ßà’…k]ÔŽÒh->þ64÷qeB' Ê‚÷ƒ(Îb-¼å[Ž•C-ÇÒ;&zsÛ®Lõ˨ #§ž—Qê!@þ„(òjñÛóhéµ-} Ì„ŠñŒ³%˜F›’£eå7¿ÀÜ`åÜgÁ¤ô¦ßSšË#½µ“wõºO¬Ïw{¥òiÖŠ¢ ¦ u *Ù%8Á“¦Q'Þ¸öï3–œÞŠÞ¦É`à=¶éFpd-”±g™é~“­0e ª›¡WC_Ê‹q/°vWq„Ø™ôì§Š_¹þVføÔ÷>ð6oŒÍ[—e?N©cýÎav} ²¶pnË»z÷†ï—À Û`t}²c•”ëšÜŠøó?ˆýôÖXƒÙ'Ï·ðØÄO4Áš¥_O¿È÷[™k0¨ÊÍ^vQµÆ1R¿"Çy®Ì!®;·wý¡=ݸþ^ òéèî¤æ¢ýÖ9»ï³9> ð„>å'KûË÷$V¿OOM÷Ûp¼Sfé©Ý,Í+ý0ªÀ²Ù½; =?›‰r#*|UŸ˜mÚ19÷¼¡„ò±$°_è{¦·g!…Ÿ†Ç$3âg ¢þJùÞÛ°hÈg(ù˜·KȨ唕lº5‚ÚCi>´eT.¢ î‰°Îk¬ÐãN2‚N¥c»{7r!zøD þǃ~£ÍÞÇ$„Ÿ”H±[õ¼váZïbu,?³ ­ÞjY%e¢µ3e™ÐBµµ8ÉA—šÓÕoìHhmA|W³ý™ß{Ò'dË C8çüŸ±¾÷û}°èƒ:>é‰v°5¼/С£çÈWÒfiÄÿ&¼˜24®>ÿ¢<Ó×€Ïvv;0+4­¹â¤ ª¥±8ó ²pÌ\bxhü€í‰±„U ¡bò³HÛ¢1ÄŠrm‡ÙÖ/©R‚Õâ3ÆÂI^úŒ9Dñã’R`1ܹúJFÈfÙ®hª'盫ÔW‰;K#Ä:6ÓW½¹Y<*ÖÚdt'/’¦Xy¹s[³Ò€?ºù¢wל/j}y•ÿ€|³šú~’ù‰eüÎõ÷´þÔ…æÎb/Û…bSÑHš0ÂbÁ(©e+°}i•t=ß4ìŽ:Yü8ÆjS/]eâWöñÊy«;ìT©^Â¥ÈÏc;Õ†Ò4ê@ %7­ÍܯŽòä­KˆYœ[á“L|…"ã_ï$éåFIWm•°¦8R:·þP{Ñg§[Û1™±×q¸vJ¬Ê¤•œ×Áñ-dLGÚ‹}ô(•—¬„Vi+nbea½¿ôئiù,ÄÂÕÍ®Iæ[UgöÈ•f6æÇR¿uÿ€ÕÏ=ÏW–š­?WH&—E×Ã#ÊÔßÀSß…”Sh"`þ„ò Ý^ט(6‹‹™Ž_ŽQ`{Ør³5Zª7ó®¸4•›VDÅF%û¶Ñ|òIÐÃCnúí©½ö…3J…<]Çe³ '-u±•YLmœ܈Ó›X‹ÎqבËã± »j©#d“¬ û|¤ƒ=ËEzÛ”sH¬… ]/ãìi€k {†*>’!Eôü…‘ÙþÓÚHêæÛ» kÂvŽ@ÃyAÂÀg3÷¯¼û;Þ†(—ú:ÖLÎÒEŒÀ礷.½ä¨,NUä›ÕúV=|óÕÓD5c»<1Æ ÔZMLæö‹¶–ñ¶¯ªbù!â}TVw±omÍ+|S1ŽÇ²Îïu[ðÛ¥„8 /ø{ù:Ž—QY¹|Ñæ(5ÃcU#¹„¹Ò õçWvšh7`çJË^Q;óvxAŠ»šs–î.Uî«£º˜Æ3ÛÃÍ/BÙ­o­ ÙêÝz ahU”ˆ £_HÄ‘¥e%š>züùˆ‡Jç­(åyM ïsüêHOc²åîK¿U‚Ž ŸÓRÒDH>Wn·60ñîGÉÝF¦ã‹L¼m>iîá;ìc)v¤*÷áhà"þ¼õj ?jЇ›QÊ6œ]æ)Fª‹vazwÖo?¹©px²rPŠ©¤aטêÚ1ZµI4Ì>®—dÊÊ ºÃH3Ïg•*Û| æ–±Á¦pËJ^îÊýV= .ˆ[tR>T\38É›'îr&èÜ“öœnÞ«µi`&nÃdy¢VT#B·ßx0&7EýQXÆbhÛB¯Êêd¯1Š…ðÍ‘™?& /•%‘‘Áy\AàMÏcIéšñÓ†$§rtq—·AÒñœøp%MƒòV‹E \*#Ç%“"”Zâô 5”DÚNBOFt¢4èä¶@Þ$.Žüºý¥ÿÝÍo,;0¬‚Í'JéKŒVãT•£ç,ôæ ^ž§ã÷ ˜ë…p¤[_àâñ¯ò6‘×VR ä*^”'e)‘V×Ü£–“ØÒ^©¾ãuÏxK2ì¡:€õQ÷Á‰IÓXÓ½ÂÐÛﺖ£í²l9çùBÂ:t€/+«2Ú¦yô »„¿Oú:¹ÍRܦ:øã§†ðÓŸþB¿aWôÓ/ÛUoQ y¾%]…õôßw7Ï®½dou–˜ŒLn#sN ì×ÇG‰}Uóe™ŒŽš5ÍßåXìåäv˜²§¸gXAnþԱx$|7rWq©4!ª¯Îë86]ÄúžîO 3!ÃiWmÝTm›¼$@Å€gR¨–†,Ñ’÷Úsê‰åÈ\åÕøzkûPîÃyØ•î*³+à‹(o`É!bŠ»La– ËôMd/ï‡Ê[HI Yz““N‰›p8RT6°=KÑUä_K¿*œ¶îuÝÖàˆ¡-fâÞ–—Ròxÿ°ž·*¨¼£ë»XòrüPrE%ØS§ÀìGÜ£Ürs({§Jõg,µ€ß¯ç=2Ü’ã_Ö‹¤±\Ù™,­uûÖ˜T¿hó·oîßre¶~³ ­þ=:óèÛw›,¯˜sC;Íe;±þm74÷Pƾü¨÷hg~¨ÞûÉ[º7øƒoí]£ÕüƒkûÄ`H¢üʇÆÀ7'Î[»»—\ü(ÎU÷A%6ÑÝ0Â…škÓœ/‚>¿OÞ·Ç|hi3[É©¢óå‡ éo?ûÁ•8ÜÍbÛ&Þ·Yxõud³iÍÐDzBš¨#n%­rÏZj$c˜‡ÍÈ÷âNíÛµ ·d"îwÄm¨ˆÕž‘‹Wu€ð‰v#}@wþ8WÙÛèþ÷Zwg.†ÑJþ~þ 3æ<ø(Úˆ£ns2'K]cNÒ³®Cœµ‘ùC}Sí®·;‰ŸIÒã;¥jÄÌß¡@·£ŠõF.ßU܇òMåã r=ˆ¸½PA\…=½½R ’ÊlÀgÇ}½´×KiZüžæx ,ëé¤#µ²šš×̹LÚMˆÀ‚\(OÚÝŸ¬¥ØŠÆÔÿ¨T·_ Ý ÑVèªÏû×Õ²Ìÿ,ü¶°3ÈÄöQè:¯/¾õSÕK¾Ê‰&ŠRKæç¼ËoÒO£¨ÕéyZqµ'U&Tø;59j››a«° “'§ î\­† cGGß?cm¾J(@9ÔFüꃷ°:ÑŸ×zÏ㆛'Î$®Â…Ç8_"“ÚZ¼dÏVBq¥ä)ÄY).¶ïí<›<ѵV-p-Dþ¬ ÍvLæ¹#*ˆð‡u²„g\Õ¾ò¿å ³Úêµ3+“í={=ð‹öábŽqŽK´=(²‰]B«fèýq} Jfú+\ù–—ÞJÝ•¶ÎEöÝKÏgÉiâ_˜-ôæ¿Ù ¨êqƒ¸¿V*a[J±Õ¨˜—ÞêïÇéZ³žç–907x“8¿m-Ý™gQ™˦˜ùíP]4öu,Il÷Þñ´ŒGúKÿÙ—CýñMKóŒ+ß v[Ig êÀ|ø¤hó+¿DcÓËCšËJ ꄊôºh<úp«`å24;LãC£¾^x_ ¥”bõÊÁ§fpqP¼Ó¡aBßÕž~üþ#«îâû1‰ª×Ä/ÆØ¤•×?›ÙèĽ˜¾¦Î=fá•.u|(ÿðÊÁø¸?Ckû;}‡ZÎz¿%}(3r?Uþ"Ô\_žæ¬ ÒDOòzÊ“´•sGò·‹W;hŸ¥—:ìi›ÅÌøz"%-[¢8…; Œ±žÆvX,{½· ’)œ@›•­åð¿jUÖÙË莛* :`" ½½ÉÓùÒ)ÚÝû9ÃQűm§œê¼>è”Êšû­ÒÛåM5òé£&©·í4¸œØ>nRÿ¸¸Ö†Åa~fw«á«´ g ¾åÊ:BÁ¯T[ó=âé1»æ×«Ò!úgIò-þ”ýP0emËAaó‚€Ò¥B¬Ï#ZnM ¿ê,Ì&P*í²{ ¶§SgùÙPбWW‘”ÓÙ^¼f?ð a¢òs›‚=Šü$ëû” endstream endobj 399 0 obj << /Type /FontDescriptor /FontName /KXLZOH+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/a/b/c/d/e/f/g/h/hyphen/i/j/k/l/m/n/o/p/period/quoteright/r/s/t/u/v/w/y/z) /FontFile 398 0 R >> endobj 400 0 obj << /Length1 769 /Length2 1155 /Length3 0 /Length 1695 /Filter /FlateDecode >> stream xÚ­RkXg‰±Úr©bÙ’ !h­!E wð‚!™„‘d&&@µj5¨ ˆV.bW‘•; ¨‹¨Ê*h¡´RQ®Å Ýgéß}æÏ¼çœïýÎwÞ×ÖÆ/Б+FÃ!>ŠàŽ Èx‚À@€Nt²­-ƒ„8Œ"Bâ › \•`¼+ÇÙ™ãÌ$Û(qD8ù˜šÝœ¯’É|„ò©öÓ)ýÊa™ú½•+T8„T aÈléfhÆœÃ*ùlÖ Ê`‘Ê €>ÁQ|8ûÁ¸(eQÐ4!âÙ&ˆà¦-Ðøüï`‡÷&ý„0‚©µRO×àk" ޶Ðèt߇¿m³.óDD¨Fˆ•paB ªÉÄn• 0"†b(–pLsBPœ8¡ì$(Fž(“ÐB BdŸ¢fPð=:3À)øïOtwGcãY àÈp¡l6puaïþH…Mðéõ!rúPK`"UŠ…Dä'­¨hå7;SoÊßãy¾ù²¡½¾»´$ÙçÆ­UƟЗåýÛ[ißYúÅEß÷ÇÎÆüS!êϾjèÏö£z½0zj£§Ý]¬=ó Ë5˜Ÿ!Û¨9Xôg›³4e~SÓcv*enGÓ=;5¤R‡öA´Re>vž”urrëð’ã‹DU?ô%$³Û¾,¾Û’vË ÿ—nd|(€ò¾×É ;S­¯»{š½Lñ ·fv #‚‹2ÍmÑ…¢IcYÐuF≥"áÁÐ%/w>tõ|³{éãÌÄ…ν?­ä£q¥µw. lh{·qB¾ZGþý‡í"I©Ø7âx¨ü¥ßÒÂð‰kARÒ §ÐëXŸ·¤.‰Šei^ÏO¾³]\ñú‘öcs¦´k}ξ§ÐöÔÅ(é© « ¾ëï÷rÃÒažÉÇtÏ6]dõÅT%Š29êwÍ%Þ_R_y­_Få6Iø¢`i}œ~$lÍø—“œ¬Û°üyWKÒ­Ö—Þ§@Õ„Û»:ûL“ŠÅù¤ÔÄ´šÞ9¾ ëLeEPŽ¿m4>|ͳÀÀÀdÏ¥¼a> endobj 402 0 obj << /Length1 775 /Length2 709 /Length3 0 /Length 1241 /Filter /FlateDecode >> stream xÚ­R}TSe× &CË$›|^òÙv±™ŽÉˆd0¢Æ!½Üûn\Øî…ËlM@Q‘3Tü ±ÒÐ4Q’d¡”;`!f»9žðßÎûÏû<¿ßû<¿÷÷cOÄȳ˜u‰& JÈ –Èž©[ô´f$Fᩞ"€Ò4jä²ÄF"`BAâРU,à“Ã>¬5©@MÑ\ËXÙuİÖBÆ’ŸLyFИb–ANÏÿÐߟ2˜<<}‡¯ÛA|€X,JýÓÓ4$™‰%b}šŠÕë-„ˆqÛ[)ÌoG\áÅ?O (i¼8½nö¼Ïÿ½’+£­¶ó–‡ï]¾ÈAÜþ§cæë> endobj 404 0 obj << /Length1 1431 /Length2 10263 /Length3 0 /Length 11100 /Filter /FlateDecode >> stream xÚ­—eT\Q²¶Ñ`Á-xãÜÝÝÝ!4Ð@cMp×@€àî\ƒCp'¸kpw—@™¹3Éû÷[Ý?ÎSU»ê­½wµ5¹ª“˜9Ä$ ±wfbcfãH(iʱ±ؘYYÅ‘©©%A@g0Ä^è â°ññ±¤A¦¯¯~.n~6ndj€ÄÁÃliå  “ ÿG@Ìä6Ú”€ÎV »×f@[€Ä rö`ˆÙÚÔÿ±Â  r9º‚Ì™‘ÙØæ`3g€)ÈlÌòMröÏ¿Ìæ.ÿv¹‚^Eèþ)“ð*Òboë0Y ³(C^«^µüÿõßÉ¥]lm•vÿHÿÏú?~ ØÖã" v.Î G€Äähÿß¡: ‰S™ƒ]ìþÛ+ç ´›‰Ù[Ú‚LlœÌ¬œÿ²ƒ¤Áî sU°³™Àhëú§doþßJ^÷ïŸ:X4”ueôUÞÿÏÑþÓ© Û;kz8€¬¢ÿÉløu“ÁîÖ×]f{ |ýýûÉ迊IÙ›AÌÁö–v.nÐÑèüz‰^‰ àÅÛ›ƒÜ ÷WÅ,Ìöç×%€×ñX@‘ÿq®Ü\±˜þE<‰?Ä`‘úñ°X¤ÿ€Eæ±Xdÿ7€Eñ½æTúC¼å?ôZAå?ÄûZAõ½æTÿC¯»ù‡8,šèµ­?ôZOç?ôzõX€赺éz­nöâzõ™Al_/÷¿-l¬¯‚ÌÿÂמAá«@‹¿ðU¡å_ø*Ñê?Èù*ÑÊÃÁ ôwöWø/|Ujó¾Ê±ý _µÚýÁ×ÛÄòWª×fü…¯ÊþÔ~=‡×éƒüiåõeÂòÑâ 27µµY8ÿÇÁÁùÇñ¯ þ‡ï<ÿÛÌÆöºÂñ/|mÊé/|­ýwðk.ák®ýµ)÷¿ðµ)¿ðU³ç?ñÿN›¸8ÄÝ‹‰›ÀÄÎÅúQÜ>n>Ÿÿiæâè²wþç+íuhÿÍà×9ÜAfÈ‹s3OÖÉ !%¾Ry¥ðôNÄ©EŸFÚƒëR˜V°fÇ5A¤—˜Á˜Öà2Œ¤… s ®u‚1ï/ –àÌTúÜ4 „3³#Cc˜ÙýÝèv™a{‹dÛïÏ–(oÖ\Ûá¿)°ñ|%8 ‡+™Ÿ{ºòµñ]_DI1§ÜIB6ÊnQLiï¯Å ?Ë@ò ‹?ð Ón°Ÿ ºW¦l–QSù¾d+ÁΦ ="±Ò»[lŒ"³¥Û-êfñɾTÕí¡“3ºÎ©¦.(£ò}ìÁ ±ž²†Çæ‰&?æ–@È:^,Ó¬sc6 œ˜)¸f©‹/…Ëë'š{s¼ÂfÔžñ4L »?½ÏJ;Êÿ2cQ¼?„öÑ|\«–ýa†3Ð9r&wXDt˜ÌØ’à} ^ÎÂ3ëý¹Á9ÞMý6²BÒéÍDq–f­öƒŽÅL8i¥ÏÞ)žnćLf­1/žÀ<…nf¡-|­ÅoYro£$šŒñ÷ýŠ¿ãáQM©ðô¤ß'39ïË|rôìDÉçŸ^"¦h}‘—n4).†Œ•F•î'?X4þ¶ g•RBëïCöäuéþuì¾b ñëêtl^tK˜9@ƒâ¢cÀ‡ƒá²×ÏX,[@îådPÚÖ-¢‰S¿Ö$n1W¯ÍšUâ°C!ˆ‹Ê˜,£©:d1¨b~5çņ0j‘Fò–%¯¿¤Ö<ÀAÙ2`êMñO‹|ŒE_ÍB ‘òv(¯Ò>ºG§Rê,h™ÑÚ0²góg#QW­êðAö3¿Ê $E>ieöª¬—{&QCŒÀåIí_«Ÿ3&Vfz/ñvìr¤Æ(ÑPi!˜ ÙÁ†¹Æ0Ò™BŸÈ®ù ¹T¹‹6ãöÙ‡ u**­Þµê1àãŠÉ¼€ Îf+ÂÑ`‡ ‘Ï{v©ÌT^`coÕb„8fûØDùmè4ÌQØöDcË2҉ÌéܪòüÙç·ŸÀR>_a~OÒ/ö¤Ã */Ÿ}m»Ë°à”cÛÂD6Z †$_•⓹mlø4Ý-û+ÖX÷zo¼"³ñÁöcZ°dÛ!µNØ™2éèÆ¡ÄéÏD-ìkæ•q¾Ju’îeu8ûcÅ¡M¸F˜îP'ìú‘½ý†ÜÜŸ!Õ‡¼¡Â²D‡õ¢”'‹- {n¥xYe>!uHÀ,KñqõÝw娕lÞªÞ?iÃqgöñwSÖªäÂ'µLÆ$óÚl´Ô@HÄFbXX%S[ðIú9ïÃ-+«”b*ºšä5I,JßÜšCÅÒØ‚Ì&ïóÚ 3SŽ’e@ ÌÊFP êÒ((ŠéºßòÕIídR¾¬–’¥íZ™A=Âåßêi‡è¬WÒfd@—vóðÒžA(•8µ‰I÷IÐ÷ïøHŒ5×ñ tÂõð…b÷K»Ê±ÞvŸ Î†\bqŃڈ-ÿ§éy—¡‡Ï¹9׆0AØÙuÁM¿QÎÔÙåßÖ›ß[¬­Oh›°ñш쟷XÊ´Ä®ÕÙܧk^xs}«gáü~ùï Ñ5„¦U­öhôH$.² ‰ñ²è¼]­¶•üY ¬ ZÅ _B-À#„€–ƒ(çGBЗ|ç¿¢ú‹* ‰“9˜â ŸW»z°ÒÎ8ÛØì…ørò»Ï5¬]Œ¥‚ ÔõØó C»†y"õýZÐNÔ..´ú_lÅê²m2#ƶ©¢ >ðAnžD5ôéñt^¾e‡8ôù[Æ Õ?¨~å*™Úáò‰ Gƒ/Ò÷€‘Gªm€ðMû¬ÖÁ|=U C1…&jDõñ"sw6ºò–*Ÿ'†ÒÔ(?bŽ"f»ž …X¶ÂÇo/ŸAö\Éü­³ü$o—^zhÏïÄœ17ߤw,3º24Bczºá?ì7f¶.5ny“»8Îm«v£vî+SŸlÀ|‰úÏŠ-ŽsÞÑRs¶gJÝ2ý"¥%ãÝd5¤-èC7(ÃQdԔॆ,"ú¸ÉØñ«“¬ŸÎ¶êV· 4²[ŒòiÈ…h¬ƒÍ`8ÏRƒw–¿ÜÔ›©ŒŒÞvÚûuÁ“_f¼³‹f±Qi1›éƧ–ãMÀùý&.· ï¸,ÒñaPé ÍÑNWÈùY¾Œbu9É)låW&ý Y ­Ö©Ýú"Ü‹vΗe_jULJv¾ÊÍÞ4`å^«ÕÕã˜R„\JIµÐyŽ%±\¨F{èxl?eö10îà'?Úk"¼mÝTp(L$ð oòã|F±bXÐbܹÇDˆE©¬J¨8‡gSý´ø§"¼/¼Õ‘í 6Mû.àBlžùxØ_a«¬áÙz{¿÷+Tr+%°\K]¾h-ýöÿ¼UWßVx½»À¸[£h.ð°JÆÉžÏAø’Ì ›É»K$"µö½ 9ðQ§n£¤±ðä É$8ïçne 74L¡|Z|¦‘R(—$¯"ôâéÅŽˆZ¥WO7ú´&TãQêY Ó¨¡ó[6¯1sõæó®8z\=Äû­”åO”Ô{Åðã-ÇþûÁÊ ’ÚKo/dl3@bºâ®y„$ÿld˜è~òöá@>†›0œLWEr*WýcÃT¾šÉÍ@Ͳ$‘á+¸Ø&7>¹ÿnÃÞXÉÀ!žæ|Z‹ã]ÈÚ2#¢ƒ`rp¸½àäàWö›î—Tª ó·•% ÐÔIMtFìüóF"Ž7¢Ê”Š~«…ÁQ9ÚÕ¿® >x;CZä_é[¨]„&á¶c6Ã[I©ÒÌÎ× 0jœ÷*ßÌ´ÆeO¹sv ä{ÙSûv#;À—¤ï1º“î¹2—q\1É[󘲽E¢Y<²ƒ9Ú­D'DϪ8%—±ÐJÈN^w|¿?§1 7ãcº KäŽù´ÿ9uuü;´¨Z!ŸFÑæ™tÍ?P{à¨/‘ÿ<±œdfÎ^Ñ`¶B¾^‹äéÑãºzØTD›Ä½óè¡–sŽñ Ü»%³=p½Ö|ŸªÐŽ«-s”îE˜ã2)|&ÐËös; sþÊЮ.üów™,¦%ºf—€ Uä1#z¿ŠXçdöLÆ’Ý‘UKù~‡l\“ïyúØÞ µ ëDÖAù¨ø»àÉ«éþ¹zGª Mÿ¤*n<-Rž+áÓûh5Y·”ìô_LO(qè¬/‚‡°ñ‹ÍˆÖº¨}ؼ»x)_÷)yT¨øT0³ wª|]U†ïÍxC ¨ÑVIÎY| ¤¯Õñïê™üü1¿I_­µ˜`žþÀȪŸx*ìI@þNQNâŒß½ðMµéLQ‚íÑ›À¢Ý,[õ“§úHž‰×^qC=¨@—½£ûJ+9ç͘&í‹7¦‚G}ô6c‰å›\௮aš¹ãº†$×ÙéCÃxiÕD¼”H¤½ºTüVŽÛ°À¹œAÂqÂ5šcjôH#/vµ‡Œa\Ö¾æuF5fÌ|¬ÓÞ@8è¸BÓœöלʧ‡ÃÂ-Rœ.é¼¼þe½‰î E¼Ý©”×ûZŒvŠ<O么~BKAà˜¨lÖgQ†ÁØvþ ‹‰ïÎÂo½FE¸êN3~zá|1TÞnûÔ«*“e­Ü•½ˆEÏÔªYECºœV† QwÎýúö›¡uŠh’ëà …š¦î%Í ´7üõBn#NŒ*-q\ÿQT½o%–Ãû!Ø› ‚°T°7ÞFtjȇ{þ¶œC%èŠœŽ­¸2jÔ,ݺ͒®® .Ò\}ÊrQeâÅ6ô%ÿ¡í&TB,CuoÃÕžìsðûõNÉuwu,;äOŒ+ŽúKûWÉÎÝ|xæéÈ-Ú¹ÚI¬{'z‘ßb³ˆÄ@·ºo¶ºsMÔ ï&ª©Â°£,Ñ’Ï$E¼ãµð/b@iXà oû0¥ò ^®šñn1X±Î\ß^&¹–徂„EG–®ØhåsºK’¶$5Fä(?8ÿîºt\ ”«ö|ÙÅÎ~÷Ó"vjpDc-ÑoäDqê'»Y ¥-ï¥q”Kª–$¡Ãj´#=n ¥Î;g*™…¸>Ûaç „ÖúÚ#xxåŸ(ý¦a?øeêÌD†wi*ô+ì¨Z¨YÔñ!ö@sñÙLòÄš¢›MøTŠ4Û~¥qf¶BQ˜Ì’7Smu5–Á8¡Ý”2Ÿ Pê`~”øúc …áSZ³úÛ‰iáî Е£×ùwkÀX¬zIï0˜SêdttÚÿØ|É>G»ì#k¡X•¤Ûô#›¥"þ…á kú]ÒÐ!Eæí`¿­Ä“3ÿ9~Jñ.ý2¸k9íØ~Ú;z3Ýñ<Sc§ÀºñQ'.,8{ðÝðÚ¯[­Q•FA5ù<…ñz­†¶ 9MHÉ&QÙñ:ðèxN•°»uý÷&R¥ÅϘ6á0‰Ó²0SÔtMh˅匆³¾XÌC(+hg~å.Eþ «ŠFsÍÑ•Q¶€•”Ú’•­~<&ä8ÕÒ&îo"‚u³HvëÅÞcYl²JÓ×)zÒnŽ«æy xjÖ÷:¶QŽk_ÅÛ}3”o ·Ñu¤ LÄøØ:?N"4óö˜➸œ88ØA¨óÎÖœ®$Ÿ9[xßüÙÇi\+œ ‚DÞC퇶¬ÜÝõ¬Ì À,Íxt(‘Ü©œ ¡«E·¹È`êfÁ\ÝÐ箟[Üâ7¯ÙÆ&‘!EzF1Çø>¥oäP>HUwì™æx×!=;×É›3ìy}xØyòåv ßþf£QÞ!’.Žó@¸ª:6Ðà¹ã½V(4¨¬›8E“{å\Š,‡ƒ€P8‹ið’YÝÄÇí5®0·–ˆÕwŒ<Ï™™ùË<²jgÍ'ÔÀs‰‚D>_ éŽ8½üFDÍæ«k\¨Q²Âlô#CÈ­Ã̺©eð¬Ôæµ9÷Óóö•Ïnbkˆ) jiè|ñŽ‚ò‡Ò„¦(væN)ñž_ƒBß{˜–`>Ç×i0Ù±-qÈ 4,`…ªÞ[”âÑKSÇ£<*~± b‘?-˜¨ñ]Š¿÷? ÒŒÿŒÆáWl£©~+„gÀB[i™öm1[ÏMËǪT¼8ˆÁG‰áµ/„þM°lkXò ç¯ ‘òšÎLOËŒÁǬ;Â|PÂOµ¶Q|}«¶à-µqµ} ™s$ÿ<¼Ö É/4-{Mg±€»Þ/¹Ý}@ú£ÒUµ;Wùꀆ߹·¤þ2cÜõÑF¶ŒøÀT8÷‰EÊêö÷»#[à•IùnƒæçÚ-!#U:ãß~ÊúbpÄý5‹KÎ|mÕ)ÜÑO±Œ…Ö8“ÉžÝd^ ,bÃ3QH¿Î+cÉn¡3AF»Žn#pÂP¤<ë¡aÑöSO5¸Û3gî>ßuÜp‰Ô¾í—¨Gú¾Ÿ4æ¹j3— ¶WSE0ˆ»@O½…¬lb*xÕK/ÕkØ$ðPÄL‰ª©§ÚVÏÔàÿÆ›3 G/ª4IL¹C}·)L+zÍx€KÊJ[úTá}pÁ¨YÂälÎa£år¾ù …» ûä4Àj²]æx×"ÀÒ-„û„¡ËJÀ‡‹,RÀYw´^GAñ BE£3=^½?V÷&d¬ÑͱÃ(„ËyPTLqòv4N$¦rƒb/dûÈÉtàç(`©l6n¹Pi4’sÛ¶ÿ9w¤±.ÝI+mF±³ƒ±6^~Íz§øŠ6Ó®)âö½ÎóQ8wEÓ8a‰-t*¸ ŠÍ›{bˆF¼ sˆç_. Ô£@š"nç Ç÷Þyá#™®ïñ3ïÝSFÿÈpž:Ã&ŸŠ@u]YFWÁäQ söë×Ôû{b¾rÿ2$¸Ã®vkF¿ä’oì'´fN•JÙ'’/*„±åSD¿,Õ™³öBcZ8ë¼½µÀp‰¥49Ï\µ"´Yƒ/:øêN|ÝùV&„FFðb7!¶«ë~û|.“N*Œ;á\ž¤²‚åÝZfÝ»°R#äZÖ43Ù¢Mò *PGë¶l¿n?, óVÚ9)\©Ò§€:@IàôéSì¹tÛ Õs¿O3㬈æ;·YûïušUºøX& `ëqáñàÞ„oÙ=> Ââ`¡–Rh;NÒGP—°¬OašSê̤çòà{ô1d²ÌMN¸.Ï}·Üx‚¿}8ÅPm‚Ék­N`:è>†Î+åäa35ľÈäá³{ÔYæÆ:JüUlËëð3¦ä Kj÷ã.åíL†5ãSÑ1ÂëKäWe¯p3óËFÎ]©wôM ÷AQÞZ/°>³ÄØ5…!PÓûý ¦RÄþ*"Y~«Íà0iå Xõ¨‡ÌÀÙ~/ÿ«¸»V¿ÆÔÐg(׌zñãÑ^–¯ÑœG«Š<¸ ¶æ°¼š\dO‘`n¤E·žý1_Â'šç÷á~;׬º”…h˜—jÖŠ^ê-Ÿ:é•vÐÀ`Óˆ¤UÒ‚˜u&‚4 sçè²jã>Å  ',údЗO.絨mò¿KQÑøåäô>~c<ðnS¤¨èjÑtÙ•úNHhˆKiV0™I͹zö'¹«å}­ïþ|>ÈXÔÙï€3ò@ùª'·ù} bÖ.Åä‚6˦Lˆjÿ¬‡]¨+ô°ÐÅú£5ÂH!ÓmÏ}ßð1/n`&žMÖž³·„3)8Æîí0ÐøöŽ>h+Ý£Ó“r‰gd¬3¤“n®eÛsÚø¹çsƒX¶=ñaŸöFà>ËñœáÝ0T„™÷)Á“òK·¯ÍfÙˆC_õ`T–œK Ù‹‹OûEBi EÕËÃrŒºŽÅwÔ„«òé¢Ç öUŠkU¢D†8~Aã³MNÂ?b«‹|Þ„øÖBsãÍ£¥Hìlж3ÐÖ<ËíŒ!=ÝkùÏnAi;¬TßÌã¦ò àPWmþZô¤ö>6lÂmò ±Uîsf‚Ñ»-Û<òK…0QI6–XÐÌðè¶9XDð˜i»Xú0hZ¶")L¢¨ôP+ã9~Іþ»ôžÃcS]Å;©Ÿ™…½äÅzd“ÇwBèPÑåú3szM2ÉðrÎXôH>¡‘!uÑ£úÐÉ•‰ýÍn¡ˆêÅ x™)Yó>&Ýz#9{«žew¹®YÓ¾\§|&¹™Q®šjmÁm”}¡˜ƒ›‡x•rU• ÇMw¾ÔTöœ¥Ã†M/žzõÌ5- a3ƨ¦ qþ¯&{ùp±F ¡lWvèô3òc`L*ÿMM·¾ Š«%o{GV’ÆË‡R±H§Ex»”7‹ wï¾â;¡5n¦³ìOúÕL_‚sØéøf«¨ŽQÌ5Œ+ÒæÖøMyµRâü…S ªõ'ßwÉK¤gÄ;ƒI=Ý®“<ˆ>ÁJ;•°W-~‚æôS£Ù$sÓÀø4³¼wyÓ0¨R…«Ðð‚"S.,S‘`lô™I…,—š s+Ë5ÀâÊàðIZXú€hê*_»tË®ü¾Q(þíؤä¶\7åºHª_¬¤èøãö:ás%Ž‘×!ï¤mŸ^êÔ~#ò%ͰŸQ”@å“.ÙÉü§ V¹XßÍy©Q (ë2D¸@˜ 8`CC¬¯æGÏèjy¿au5KµÌÖÚ¯À¥C2ç6ÇÕ§Ü~„ö£èÃ|²¤H­ø)T.’3+ú{ý°&î¹[?‰¾p܇ñZuϼ⪺OEˆôÁþrËŸáCY‹R‚e¨§ññ0u¡·E_x6:¡J GJØlÙý çÔ6¥éKæ~ê¼àK”=¬ÚÀ^„ua‘a9¢<×8Ø3Ëù31†dEóáùG† /b‹~7X #íXFt†Ÿ‹×3Øp– !HóŸºL=Çe¯¯'‘,&³`¥3p3¬ì%OøTf™ÁëÆ]òa)ûpÝu¦ÇeU'|âþ±(«óh_g¬ãl´Ï¦éKä½¾žVu}KT°¤4ª ÝÑåó,‹:j‹Þ¬ èˉ3ÖR0ü^¢믡>×A`‰´//'ôŒyòµy_8Ä®2W& ]aðë î“IЧJÅ8nõLÁ‚ŒXþø N²Å¢™}w{EËæÔbSYp1«ÎÄÁYˆß†ÖW,¨>Qç”ä–&I»ª§¬Â²qÒ ^Iè“ß}–þwÍô6ƒ ً؅]ÒxXÚÃŽO«üW¡T¬†‚6”Yòº/õ=ó0\Lœ|Âf¨Ä>HŒ²wFí𜒄D/è5ž•SÞçñ¨ÿzoƒÈψK¨ê‡]ß$§””d5[ñnÏåæ·Ê°X–Ûε>Ù'äø´›¢™“VÛ}j†ö¤YÖ@÷½J$_±¨ÅÁqÚ¡šbj!†¹oT.ÛšFgîX\Mf]‚Ãå¨ßµ®¿Ce›[²· ;!æcå}<Òo¤Ï ¶6=…/êd¯ƒ¸œ[lm.ÁËÎáÑÑP“>%Í„Œ6Ì—©ïßö¨áez(—B ‘ñ%ÆãÞ¦sþtÛÁO3÷èLm'äóÎñeÏ'16ä™ú*PÕzAËåýNJªòåtm:àœq–ÛÅ$ ä‚Õ‰ƒ ˜=Yª|â¨P½ Ï?ÿ™x¢Ÿáùx·<°Ï…‹©yðG»ß\ém0ÍK¯Û5÷NF Ÿë-‹‹ÝO ží)¿FÝ'Å8z‚(èí&+EÍG=ÜsžQKÃà`Ws\ M½ÅB梊i­£7IqsWÂc3o⮾êý‰¬Òˆ-|#ºùÉ"EOHë˜ë;q¬Ü5ŠìÁÑ@5xë”p(Í+ѢŒ‚ïÒÍÐRƒ¸|1Ý£°røÞM¢ºÑL|rjä@ÍÚĺ;ÊmÂQ§—&%^¯‡u˜Æ`¥:EÇßÊìm×¢ˆü©èã(\EkƒŸ×”¢ØÐÊ·š7×nIC\f TMÅM­rÁ5ŠëÉzvÜÅ-›Ziá²WUKh|ϵ\^A'«%8|$¿n÷ÑJÇÄk±ew&=at™ƒ•xyK„çtÆØÃ?þràsÈ«ã­ÒÉô<_§>MNF¬Uy‹ùq›L·âKŽÙsð”¬É¡›cðp9v¬Þgã@<Í„åp®­BO—…ï?FVSàÙùi^®ZÓÓ/§æ‘?@]cì ºdºË1m Ð[´m™ƒ»åZ9Gá¢‹ÉØÅ¦­øäð´5°7Z ñON{O’a—<96»]Ñ;,´²&-[’E΃>›¼'þ,gÄÀ@° ÙÃsÕ–ˆ!¶‚~óþ´¯‡ÛÛRûÎéej¸Üä˜{¸ûÁ²é1òÅ^8ù@þÚ~0"lÁíh³ÄC°Èì÷õ'¨=ovŠÍmaôtZ•æ ›ÅLü‚Ú‘úüót#¦[grû&ïè*:ˆð7ã Ÿ_À ŽÜ…‡HêÏ kuÜNó.‹+L;(CÛ2z¸’ >w'.\ÏRÏZ±–¾F6ºvó4K½ßoûÑGôÍÁñÂߦeÎî®æ[õ<ƒþù•¶Ê7¹ÞF>’ üÜee@êôB3>äé%2²Y¦ÍS×¹`¯¡/PO÷=ߊLÔXXªÚN¢òg벆 Y& ZÏkv‘2¾ÒŒéj¾½óÇáM2Êé3‡âÜ9V%Y‹'^Ä–§ëüWWØÞÏû/{d/´F1håc/„â/Z¬YëoR-¥Ï …GsýGJOÎćf-j ϼª¸¶ûo`ÌÛ¶\MâÃŽŽ„+©´´®³‰ú½öc»Èöòêûé¯×Aú޵Ö!ß.Ì ÆÚé_²°ùÅé{õ|\½E´ ²èŸï=¡„¨²H®Aüb6½pc£Ì!¤Ÿ´öà Ã㶨 ¨SiHR{êõrljQ?ì¤æ[ #‚o²ô|‰;µzóZ–š°Ç¬°ûšß¯šÑêÒá\º/½ÏsຢøNþ•y-Ó¾óv5 ËÇ'ÇHÛª[ÀñÅgv/(ÎÔ–(š˜ì‘ªvÚ†g‡$s ÛÁ'§¢æÕVŸ5 ^@¥~s{Ìû @’áØžM%V•vá1©9Ÿ¤4O„žV7b“`]!þ²†B‰5Wv+sŒBÕ:«žÐñ1‚)A¬d›6Ÿ…ýææyï–'š—èdrq^ݹø)QjiΗ$‡Sp™ø4—‘œtÂd Œ»ÄB…[“5È¿Üzûjk\,Ãq¿´\J ;xÔ=Ò9-—0M×®ÈÁjJÀìY4i=âüœ$ñx³NµyŸ‹6jï<ÖW}n-§¢ì±I“Ö§Os SCbñ8!ÈÝTc‚&é ë1å.CXVƒk¢±Œ)›1¯v3X]û[mT¢o3F$ l$úɈ8Ý€—Mjm0^¨Ð¡Lº±ü™3®!dI;Å©óHm-âÁYd¸™qtkòz­Êÿ«n "n|E>U£Ïï<Ù1Ì=ÊóØò°Î©– F¨S“EßøsWÀÌ[ó¶–ªÕò¨ ¬zaÊá0#öàûºñÊlI¬,) r8w»¨ÇƒsÜo±J´CNì¡vV{WôfÎoí&ã•—øz&!ÓX¤®pot¶ñ+µÕ˜¥«kw<'‹E6ÎÍÑ2É4XÕ giqÓô¼Õuv«—üß™åyÔÕB¼aÕ7>å!ëÿ<¹¢^\d¼fþö^T»bD:ÀÛåáÒØGÐ}:ä„Ö@n|xø’…}`fÏeCÕõ¾ٶ2341c Þʾ°M»šàs,£¢•–Oÿðxתñ.ôƒS[¹ šŒbHOÇ¡ÛUÛ#HÚ9õÒI}ZRç|yÖH6bp§Lü'á…h£pÑ3í¨äÂ.Æ"4K½o®Dt°QÞ×ÑÊÂâ_8cG”€1cÂ4¢jücª,Ñ´7í_úò|‹³œ¿g·Qzàß2_Œ¾ô„ 6M¶¨»yˆùÁªõ§½¡$z_ŸÑM´(¦AŒ•8׬#Usû’ŸÒd^ê´ÙbÈZä “0ü3\*€7¶³“Æã0Á0ç…VÌ€ÜMÑð‹—åÍÕpÌøRl¹ÔË“çtnÜò.€v±ï–“ç£ Æ„¦3çöýÙô‰^_ ¶„ö%hs­Ä°ùQ!É¢$×q§&—sZoÞ­! ÄAå›Ï7ý)诶À„ïÜ3$ݱ…4ØõêÔêSãS®Pi!XäÌô"#á†Á§K4¬H½¿UËç´´Jðå·¼H~ÐÈãRhÒôŠ„ÛOb¦¼m–W¥Nç°%ƒ­w`x7‘[³ŒÕuˆÝˆ/Gp y´Ø ‹#£ÄØÌ0˜ç+«ek­ó?¾º¥ z0ƒ9°b“4äc/îùhÃ’ŒÜFÓ‘NT~¯#§;#JZÙúv"Ožn¡U!PÌ„„ŠŸ"ÆíI'é}Å@]§ 22<ÅdOäH_¹]­) Gžì˜®V13B¨I.¤BìL»¶i1½æ„ÌÅ盃Ô%“zS´Ç+Ͱ Ñ×qÐ&aëçª6ʸsªg†ïÉÄÀE‹ß¦…6<¼2&Í1E¯ç¿»íChÕÕâ¦n>ø¹ßšÁ~4¶óK}{®¶¸8GTR䲫ÿÍB}ý˜°/ü½µÎ,Ó«ˆK„ùÇåG_‘ýÙÕì)ƒ$#$|jA%j™ËwÄJ %r‘NCqº‚„Fr¤ Éñ)—êGáY¶²Ë“ &ŸCdWn™«xöö»Lßôn/žŸØ9¿étS42¤P ó×à~²E$¡¦–¦²ú †«˜4–ê%u.mOx4J¼_GÙº“–OR4,…zO«Nu'OÂNZ_Ÿ;`¬p=7ž®£S‚Ã5÷h€™¬oÉÌ|H˜,½ îΈJÉ’ïÿ0$Û#`h±éÂ^Ü딕Û`{Û]U˜? ÇsÌ{öÓŸ~‘2k–iÖϘ¡zÈӀФæ5I‡å{D*ÄšÖÏ×tµÁ³—÷lóL$Œû$‚6¸¤pôűÚê‹Ê¡;ó© ç¾J¹2ýQ}ÌæÇ¨' œæT@+z윺_õèž|RNíŒpÊcM“h+Ù®¨ë«„Û.ø?«}ÌßjL<}U—x¦Â1Ö#ÑßT¿yÉ_Ľ›ýêz)ÃÙõ >–ü„€ºÖüvØ©úpaÈ´ÕTàuÌå¤N˜žÂIµ¬‡ÕGQÝ‹¤çI\Ÿ~3Ç8•”ó3!gêòžc—‚Ñˇaj|ÂÚkÛ:tâ[déè6Äe&³÷Ò±"þwr{˜fO—ƒˆ'zP4 ŠêçÌcÙcZ[× ê¼vã›Yǯ²o"³Lá°.j+<¤¿bdfc‹ ¨cø/3†'<9.üüîI¯b1–02à †§hK3xgì±µÏ6‘=ÐÿI‚éãˆt~!uÛãÑ]1˜Ì,yÊ,ûþRÇÚ»\,·ˆŠ°·;ð¨4ü!û…ûƒûà0c: 9ÿ÷ß5íÝwÕaXY‰+ŒM%KAvA9ÄzHcmWýI»«¨˜’ëÍBy(»¾g¡Ó®‡D¸ËótÎn°ÙH­ÄË“W®65ßÙx­€³lw^°ùˆIF\ôË$6gj>­k%2k‚g¿‘‹ W.'Î׎œ ÃaZA cw¾Hç"¶ÑFÕQ•˜Ç¬u~O@·šX[¼‘c’L|¦RÌlÐpE䊕tݬibtÀnIöÛšŸ•纼Îè¡Ë%$¯š¡wÙ¤=Sy'rßE5²ˆ>¥HÛwÞÍ´Ùû Ó¤#Žôµóç_¼xnXvÎÎl¬ u_|oòpW•íЉ­‚˜~ ÌÓkw‰4ÝݡǔS¼=ߟ8¢>‰™0'ˆùíÉG‰"£‹Ì9•ÍçZ€»²ú.LÑ'˜r×c·U\7 ÝŒ)ê$mìð6q~Œ­Uq?4ûB­'~0öŒä%§È!‘}‘7çÅäŒÑÆ#ê)Øxêdà!!2tëI+ÅO/íMI¤˜t^@¥üË">™²¿ZÑë Öasq#àI õG#‡`ˆÿ‘fäw'ÅZ—Ìê äÉxÓZÁ¹5#¾»îP½ß,dCÎf BMµ2†hç´íÊ=]|Jö »¹’£è¿ý?dp»r endstream endobj 405 0 obj << /Type /FontDescriptor /FontName /SNXGZO+CMTI10 /Flags 4 /FontBBox [-163 -250 1146 969] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/C/E/F/G/H/L/M/N/O/P/R/S/T/U/W/a/b/c/colon/d/e/f/g/h/hyphen/i/k/l/m/n/o/p/period/quotedblleft/quotedblright/quoteright/r/s/t/u/v/x/y/z) /FontFile 404 0 R >> endobj 406 0 obj << /Length1 2059 /Length2 13409 /Length3 0 /Length 14554 /Filter /FlateDecode >> stream xÚ­·eX\²5Škp÷Æ‚w îܺqwîÜÝÝÝîîî‚„Ü~gΙdÎ÷÷>ðƒUU»Ö*Ù»ijr%UF ½ HÒÞÎ…‘•‰• ¦ ¦ÆÊ`ebaE¢¦s»XÚÛ‰»€ø¬¼¼l'€•…ƒ ü‹D ³wðt²4·pЊÑýÄ ±9YšÛŒ],@¶à¦Æ6U{SK‹'@ÄÆ òÏ g€ Èää2!±²€–¦.¹¥ó?šdìÌìÜÿ6]þ×årr‹ÐþK&,hog㠂̘?ÙƒÙ@`-ÿÈú¿É%]ml>Ûþ“þ_úüƶ–6žÿaoëàêr(ØANvÿ7Tôoq  ¥«íÿõʸÛXšŠØ™Û€,ÿ6Y:KZz€€J–.¦'WÐ¿Ì ;àÿÕîÜ¿0kë()IH3üÏPÿåT2¶´sQótøOÖ¢ÿ…Yÿ`p{œ,=º,àþ²‚Á?ÿû—þÿ!“°3µZÚ™Ø8¹ÆNNÆžHàõ#NÀgV€¥äy€33ÙÙ»€À=ñ˜Ù;!ý3Q.N³È?¦#n³ØÄ`ÿƒxÌÿAÜ,fÉ?ˆÀ,õ±˜¥ÿ v³Ìæ“ûƒ¸Ìò˜ïÓæSüâó)ýA`>å?̧òùTÿ ³ÚfWÿƒÀÕjþñ‚tþ °Ïø?ˆ¬ÌØÖ¼öÆàiÿ¯•| ™M--],m€ ÿØ9Øþ1ƒÏÒÙúOûÀBŒ]þäg4ùƒÀ'LŒM­mŒ-þÊ.ÅÄÉØd2sùËÌù?æß®ÿ$7Ìô?ˆL`jo¾¥ÿ‘ÅñÅÖöOY¬,àšÿÔÃ.hoccìôW¸Ó*¯3è¿H¹þñ;º‚oñŸ#àbÌþ×`féöWŽÜö®s€CÌÿdûÍÿyö@‡€µÿi ¸ž »¿"À6Ë¿ X©Õ_3rÙÀ‹ÀÍÎ ~«X|þ+ÌÔÕ @ù~ÕqW kDXn~RÐÄ<šf—&T-p`(UûàGî Ç2E»Ü>¯žRÞÄÀ~´B‘$ËãÈ4Œ”½1*¬ûzÇYÄͰ{t*SÑáZs9¼±³Ük!-ð‘œÓ¿²Dí{@Š?S¥Ó5’ò×U' ìÕ>ÀTW×YÚõ‚`B÷6rˆþƒJt¤&ÍdÏõ7q”>ŽÕ•þÜŸÆôîš]€ª6 ˆGËÛ-šè3²)#cä]‰”ÀPßâàöš \ôYtæÌð„´•Òj>ò¨I(6¥úÞ-ɬڮ7ĨS$rÍ·¹¯“I6.e•“3—Û®‹òòY¡©Ad9ËÕÙêÿƒ”OÓ•W6Î-«s¨”Œ÷\ü¸vŠgâ¦io±~ éä·±Ùãc½µXÞÇx“ñ ðV®Ï‘;ŽrûùvS5FÒ3~·SМ¹Ù/`æ!Mö$¥Àp”å‹|_-Ð c:¡ €l§¡N®xãÞuq¢&C;Sy=©4€—º¯>ýͺy£CyÄÝWIx#óí’«ó&9à–L‘‡ÓXôè=_¥A'×1uÐc·š%­4'µOÅÉ÷SûÖ¯¿¼c jÑoÕ*{àÒòKÕ ròÙLžæ^¿O+«›¼šÚóÝ ›H¿4‘Õ}\­"£]ÙbK¡ýØ\[×Ô+7êi:Õ%̲YÏ’“üAÇ?‹X}Ì•v¿FC»Ýû(‚=¹êl“ëèsIhPછœ/÷®mzÆTE¨×ZJ¹>#²4$«Ö¸®qQ3€® 5¨Yª‹ƒ¢2©GN;¢X7 J;Ò©ã4{Ljbþqò…ù­ô=}wƒþ3-” ¹àò#~ÔrKßtçØUÓ5×ö9mó@ºroú0Å1ë^v³àAµB ¾.KîpT<màUFk@ïþÄzîsHâù°ä{Ãw÷Z×ãò/ ªì²Ä'™è°ó.l„¹c7"¯w‘ÜØ÷5(Xß™øÞ>íF¤Çp2ýZTp¼ˆr›V/&R2 pSƒØšGÉóæ`t‹ {‡èu5(1G 1’BSC’ï_ì`Õ1œÆ4) ¨g¥žä*ûöìúa¶8ϳùÃ0f†aöÒtÍpUÅìý9ò;T㨲OvúÝk焲/°Jsw\‹CÔáçº9èå‘:Z7H‘PìPц^uMþ`ñҸߺ½‚6Ãc{@5eEwÛàLGVþêÉÎw…jm‚L{³yíYÝ0š†‚­Š]9}´l!VÛDL Ol¸WÉú&kžÎíEüF䋸†6Ž äW3öÐlô.:Ð^29öëR¹ðÞðxéëÛ"AEgt”=®î't)ʤhÐx]¯Ši²,—êHåÖ ´x.tùº*–g¯5i† ˆË ãþŸ‹*´&?áy×#ÙºâùK@VÜ^„4O–‰}¦ùU.d¼@ʬ¶µc^î™›LMª"ñ»IÜ­[ýÛÁŠýÖm½¨HM?òõ¹÷»,¥”ý¾ÓsgÁ4¹îzqŒðCÞþjYŠ »Ÿ1Ñ╨†‰ç(ˆÉסý7•¦ .ÏÖs² ¤Ô[Î)¶xàKBe§ d%ãË·0Ø¡7´Ó†]Tf׿õôµJvxE(iöö@{(‘ ,ˆ4êÀÏÝ€e£êgÍíŒUÑS‘Ψ¿/³å ÐbŠü*>²z±6WQÔ/½+¡ˆÂòà¤Z\Œ?…éÇßóÐÝS!a:¼¼Ð®1`œñ±g²DÆ®©­ZÕ€$¾ÎÁ5Ù;âðÆûû†ßÑ1C–î´¤gHÈGìR“éÿ~VÕÜå‰þyzŒFA£ë"°žn§NZ$Q AÃRÛ¡³‡ÄW|M{Fö‚¸Ìν#ò·@ ¢zúYyF%B6¢ÿ@®5&¥–Šr~ÅtÎu?õ¸ ²ë^_¦ÚPî¹STÂHY먔óÙwu Ýò¥¤I :¦×ÞvC,gð3JŸ´™úr–åÔÈáFÉÊøC¿›+³7›§n ¯oöÄœ`k^ÓbÄb­l˜ )Mà\“é¢<¨¤cÈèY„Fû¬ÅƉ岥¬I\ð6~ωÂbÖJj 9ŸŽõY]HãjÉæWG8¦ø(—èÇ[+¡÷bÑzÌÛ+çÕð•0-‹.Åý\U³m­l~6½éŰ¹d:¼ÁÄxËJʪcÜc´» iqžÈeµ¤¯·äë¬MÇi­©@gÛº¤¶Ü}ûg‰ø¨®a¤ (¥éD˜Œ´˜§þ”°xÇοÉÒ”>¤ê Ø|îڢ̶<"Œ2n¤`(\œwî1p«]r‘¸ï,bkÓs!<@´1¢b³l)4þR)Ö³Î:‹srITE0°ÖÜýõw:èòž»`»Ji]Ëᳺ[×þqJÄp-ã¤_㺃6ýŽ1NîU.9&-Bš1k¿?W ?ƹ‘š¾4½XM«šR\ê Âû°y–Íʸ¼QäõøwÕ(-a_FòQ6ìxÎ$p—…xåE(J›„Jf=f6±Ç¡&¸ßj[›•LÔ[rb(0¶ØØÓø³Iu¤¦Êö쾋‹¢`šÚðú®­˜g-Ág­ a€CÝü{ºìÕä7É•^–ž" Y¼×ðÕ×WÃêgz_JÛóâ²f5eÆbÞ*$éi)YqâAn2>"%-jTëÄ»M)x`Bû½•:ÛjB™lx¶ë4òƒØ“¦ÿaÖÒ§O”jÉ÷Qq‚!«ˆ1]BmJ°¹ŽVÛëÙxøÈ>WU¤˜góEe?Ô¦˜›w9¾î(…¹qÑù]t-u™øP-„Îɽq&ÌC¹… oðùQiq.Dû”+GâÓÙôƒW†Ò¬ÙÜ¡„³t@jH#Óu”ŽSbÈî37IìQý}ý…9„y·öË‘¢SÐÞݼ:ÄǹÅ÷î?áLü¨ñ·Ã$_4`Kq˜¶¯ƒâjÙ¥‰NèÉ'?69‰K2ýpéº÷ÓÆ„Œ˜§iô"åÚ¹È)¤Ê `¦Lçé‘'˜ÇA®µÊ…é È6–íWÎj]&Ø]¤ª,²fý½OžbJˆÂ­©ù¤ŸÂæ„ûó1Ù\‚­¸Üü|Y¸N8ôÐ1ËÌ֦싌C®%Ó8Uu0äœ!¿AWçEÈè™Ý~Ít&þ4(9,>±kõ¦fO¯«ú!Lˆ4ˆv4¿(ÂÃdo©m»o*!±Ã%ÃáØz×/fª’Fb¸Ö'8 =,¨‹)*½él?Ä´Ûâþ¬!—~<ŒÔÂ4ü¹>ø²ÇjÎ$ìA&î¦o}–Öe¨qÅ¥Cîíä™ra9ýy‡6 K³ÿ;m¡ŠEíæCVe^X'ÂxnI0ƒ¼;ù&_AF5&J-ì^ørk)¶5B&ê¬3gÅtâK}¼£]˜ŸG>S* ^•à ¤Y}¬§öR•»fžU OíÁÚV¡ªsãæ3øšR•AÂA»¤ê¯n[˜hÅ7ƒÚ'rzˆïC ²Šx5ùtŠrQ;p˜´ κO´-N͵¡·b7y¯ïïí‹7vÒÆÊ½{UáEÕ¶/æ_l#£º6ßKÿÄ\åßð›dÅÌ‹1r-4z‰*]H€Þ]H‡Fn S‘<ÌðaÚ¦½œLOõÑòZ)e2QÐcx§ßÚÓ Š€‚^£V,Dr¾}Xz-¨Caí úIh¹âœÌÑ mû°?píÈ!Ï%À8Q OÔSøhãTFõqõбú“4_"VbT€4^Nݱ:2tÌ’äO‹’âtä‘¶ÏGô ².“éwñ€›PœRÒ5öÆN®–Ÿ”Þß7…AÇ+,Èåa¾‡ëØò]'¢`®À!)ù[£‰ƒô®½I­SL3«êƒèä;NRZèt¸õ¾ìóm[%œGb±UXð æã¦ááýò\)^?ˆyÎú²V)¡D†9DޝÌ!»™Mú¬Cðrþù ¡ÈH‡§Â&~Ù赓J¹VÐcýr²Ø·ê–‚ôYy‚.þ¨1¬e©ÅÚÂ¥ÄùJE¬’ánœ^Ÿ {ÖwaiZ«0²Ö°Ñþ•Z¯Cë/næ EßKÓ8)ã«Û!w•Ÿ¶lšœÙ’Î ÎEƇ•F»:ü ºÆÐÝãQ]ÕDïD@¬ì2ËÞª,•99u~1Qðt¿­Ï!^gaE±Ã̽[XB×@ Ø=Ì©‰d*ßßsÜøôØÖU󯍽öžÀä׎!ž& î—†A9-]ÔJ€[i“ofÏÃQëW,ÚʤҖ“Ö“±¸ê\Ð]qtþ$ò›áäE¶ø’“«‰¼èzªÏT»êwB±_zBû±ã>=ÓWµ® xïºF%²ë3*¶RS¤Óñ—A‡f‹ûY-=Tw™ 4eû*B¨¯§³eUÃÔuô1NÍÉ0c’}•%è8ªlÐùII’­6]ç-̳ØÏÂTóX÷g>¡ÝñŠJ†XMˆD‰…†Ì¿µ/Ñû­—Ì¡µ¼Ê½ÊF"då±ϵ?¯X¬=]-Ýê6@9ï’a«*ujK_ÓdëcÝá´¬}C¾ÛKú$8ÿ$ÉYªƒÿÞUR3Û|.p¯Ìºáû—‡z|•JbzwcÖ59b$œ@uý€ÓéRW.ÓÐôÏç¶ZЬ£“s~óÂPìu⬠Ψ?Ùž]•ˆ—Y ‘íþ·ƒ ¸Wh„» ºÛÐÞ*¸µ¦ÆÂpwO~¢²Ï±>ÎÊ31ò~Nˆ$ïsàd5 ({AAé¹ýz¶}Ïmêï;£F4F¹KºSQ‹¥ù`4WÄu¾ª2Þv×î4í4¶U•aŒNç¼ßùþ¹ò$«å·üÀ5b.‹ãëPSL!¡`œXßæ&CÀõ™•S—’Víˆ1´2J§ðÙJqÀÎhg*àTXd¨†[Ã6ÀÛÃí·p.D¯aæh©é­ŒuA¥ãõ÷'ûLdܨ)iˆ¿dRn…§þbA ‰âý!ƒÕoì°£¾I'šzÞºkn‰Ä³¥˜Í±¸šl¹‡? ¤ä–]e˜Á{§"h‹Ûü{=õô>Wjƒ|Ýä) Ó;ë†DªTŒ- Õê‹qÇõÖМ6·ÐÕ•Jéö<ÛïnŽÇbR¾e Ùö0Dó)s§÷Êß–[ä%:è¿”ri,Yó×GÈ—Kw€°Å î‘ÙU ‚tñÐD‡#ÑØ…ÆIhˆ‘äFc»€ƒa£¦¼—·ñXzQÌdæï¢°Û—îÓhÜ•ïBÂæ½Ñ&‰|Â_0æ«>Œgüö½+£" ¯cémów×Ûr|‘¡¼Þÿø l®'0¤ãžïq1A( ØV‹>Ÿãï+@‰ÚènÁ´ y®‰ìVSyž1ö·¾šbÏÊ8{üþ$¬n_þ•xî8'v±8ªÒªë:†ô¶c³ö´ÓpZŽ8šRª‹PgåG‰êG;õ$æÁC/nÊ9±ø\%ã׎ÒîÊßüWl÷këΫde9›m“x).T†Þ£ÛqJ¶¯T F¸dIw–ð Êì$%¶ã·YÛi.ꤷy†ì½ž$ÃTV¶Ñµ„âþ—¯¶Ém°æH¼=…ÒJ·ú°š€ãa´_®|?KøS-¦4|òr) [Wù¤ãËï‡íËä™wqKp¸×Ú$‘dëBãòt{žáüP?½?ßõp¹·ñk¢/˜à )Xè`á—È(%ÜH…Øþiâ³ømµ4¹ª@‘ÅaÑvèJÉ÷ÂŽ›Òár&Я3%ñ¨j‘è—f{s­7;.FÂùwÅ>§ µÌö»|Vbù± ì¢A£7Æ" abiÙëN:¦ gd®Ø.3†5f&ûô‰ç«{ûhc|¦&2¹*Hc°ÿÑŠp—QÉâ·ÒgëŒùx5¸‘oV^Wþ,:ü±ÙOïo1Ç Bl] uÀ¥®9€½˜U¯ýÞÃåÉì=G9¨ôÌ¢ÙL6¹BÙ¯§øŠ9.¼z@ܧ P”¿ÅUøÍt„HCÑè)º‹xäul8#À‘ΕGô”ðIÆÕ[ &PX“_à“^µcdŒXCt‹;RÑ×l}Ÿ§(²Ã1~è- ’e”¦PE÷‘©]k#žƒºQîlèøÇ;Âe\Ôƒô­®Ìø”{vƒt÷ l›ÏdÃRÆ•lë÷›ê6ô¯òELo+¥Ôgyn2´ ½#˜/Ö‹L§ƒb§óðwÔ“ªÚ]M¡iQ|[*„âPN‡y=^Ó+XŠ®1kRÐÊëÀ¹/‘Âr|J7oá™±\1!»ë …Ì*RÃOU˜KΩ1L’¬fŽËÝ4§÷­"XCAªï!N-¬§UÎ$¾~­À\B CÃÉÈA)؆Y¯·Å”WÂËϯfH"L¢¤0¯Zsùèv1R^TÓ¼¬pN¿…B«ÎItÜu1›DîtË+%{¼‘ƃ·óÌ®ˆÄì€ÒPTT96^ñ^ þïÃÓL™/(Z`½;Üòh œ, |§|.³HÄnwt[óc¨n~gAÝtê8{Äw‹ªìˆ o¥™£!¤¶÷ m3ÌŠaêÑî¸÷gà›æj¶;~D1Ž*>¼‰:Îìþð¨b 䚥(¢’#vªÊF»ÿ Ò`_¤\BV¾ä@ΤêxΤR˜ùåj7ÅGI– zJ “ú¢Çxr‚äRvóé+5xBãk A´êeVÿÚÚè‡Y„fRúy~ ÕT5Ô`£™8®m߆½ -;û`û­kƒó0íºM4Áݦ§à[áÉ6l­CÒ#±2Ö'žœç¯a\¤á:ܪ ¸ÐÃO'rÒéšõ/‹'¶òºÈvkpp¾Ù”^¢£Ï"@$ÔHŽea4õпxEžúˆÐ^£0Yÿ¨f _É«(ßP_¢bÇ®Ž‹Í9×ï ~Û^H4ù|u»æãê`Édœ›·Vá^±|z´ÙËn5ÇeZµø\©ûy*7T¬DŠÛ&U(8uät{~a¼³¬„xmÖ]w·žkø=<òz¾Š%·a„3)[!ëàÍË}}}ü¿*EÒfÐØ³êω0–4†¦÷z¯æ „‡®Õ€ŸÄ$¿=j*£ (¯÷H6=ت€‚ìH£iÉ‚Õè¾­è µ4.Ûƒ·6–Áõüd‹3ÈC3ujcÃåId÷áv‚ê}<í/¿—Fú›=‰…õQ‹1VHa¹m«ì#“<åöÑ™åϾ ñ¯»šÄü#jøGNÊV#ŠÍáÃÔ;]„ZcéÌ\ƒßÐql*ö1¢1§Hš[©ã0RíÛÂ'Ñv® ÷QåÆ\âÏ-C‘¨Kaç6j‘sfåXò&}3Oôm½¡–‚Dب`¯KwN¿EË:"< –Í »Õ×Jë¶ìi¿^¢ßIÖ: 4«2À^î_ÿV÷?éàô3˜Ð=¤BEBÝc,ÚÑMö.± 2þùDƒøëtéÜ\‘·£í<óóc,ÁXÀsòBdóM* Žþ@¥ÄulqÇ:W¯ƒ­.)ÆÞ;2Ee¼a ’¶ÆÏØPÏ;˜†ZÈWßÛd³ :Tžûé1ôîê&ä—ÃÙÝr¦c~åú¿¤Î÷ Z2Ð~¾“@-‚qØQêÁûMøNáJè›RÈ$5(Z“›Z0kÓJU9jb3°¥¬ˆO2ä'²¿®'+](&;׉aèÏÓ|ŒŸüP ß¡)C‡+ + <‰fÞÔÐîp§=¥Ê¿¯Ã\ô¦øBv@}‰\´ItýPwSÔƒàcú²¯KE%¸ß)!âæu¢}ZH=½,.Ö˜$z£2_G8A"ÉþùY|ûú} 2–Eº9¡N¥ðãúH*¦¼‰ ‡Ù z\z\‰“¬©ÛsŸY4\²ÔWÚܵ©qøb¶-ЃÉüo¿É\e³#/”ÀчS1 ø®(˜p̤yývØuNÁ2¨Ôø¬]e.»;žƼ*ì°†UÁÒ°«¥ÙË OPS»‚ ˆ¨äÚµ·n[î äÀ!ÄnЦa³ö̯cò’­9’~þWøá‰‘|êríc »pÆ t;ªƒÅc_öÖzIÜgŸât®­»M˜®|H™Ãp–]f¤Ê¤Êf¹tX² ºBòv“\?)ä^ k,U b©ygø“ùnx yúΜÆà÷F3Fñ`"MõH¹òzÑWXô£«1,ñÚÝ™âÓŠeß³H净 ß{£¯ð(4?[”/*X}I•v’ZMv£Gçë¥|Ûçˆ$cß9»1î—ñç²NÒWÇ';R›t ›C³ÓÖïÔÄØ‹¦Õzg¡\1¨tÞT 6žŸ0Y5MIc%`ãA¼kÙ›¿yBÜ•-QK–CçoËœ³ÍuŠ>Ê«÷¶>YÞ ä%LYk’#Nj»x¤õRéÃ÷‘JKsV+IΨ_<ߪ N iHƒYIÆoháx ™üæ±–¬½‰º9‘ǯ³\oÁpñD$úȃ]îCQOJÈ3÷"! %°C„7S9O…G©3ä´òuys¿Òœk^;‚§¦fÎt”¬¶™ä÷ã²VàɈ²çNW•e‰|_ µñZ´Ô¯È˔̛ [ЀBÓŒ˜»Ç§R¤°Šþ£¹OH3»Àú3¾Œ/hTÇ{Ä ¦Ÿ'â÷!4_ĕ׉‹ØÆ•„(ð…V¨Ì:Ÿå@œ•(?6s¤“Ê›n8eqç§…V/Þ#=Àax™=C2Ч^Õý$hxðlÏJ3_ñj9L÷Ž‹ö‘/h»ƒÿ×ËÈr{33!]}ÓWÆì¹ $È¿ Óž"Fç B"&q¿ =iÖû‚‡ž™UÆÌXwÁfØMW¦ètYѲ¼q6n ß%óJ¼ºôEí±<Æä%˜ì.ŒÓ~/•Nàºãš½=áÌsm˜*4†.b\{l‡÷Vʲ¿Ô²üejáªþ<Û_/ñcŽTýœºÍ“pÞå&?oRÙ—$U!«#h“‘:R“ántªaøåJl­Äd]jD¾ßø‡®põ² *ñ¾%}jï©!7,Í!â{ö%уcâÌK̆!±ÓšèxN,bÙ˜KÈê·r]4_·*„6šŠM‹ÛÑhOFSüÉ¢úíÊjð51o›8 GÚtíøÃ«Ú®ž˜¥X=îדŒ'ÅŸ ƒk+ú/ÞѧXRuÈw7÷ZI¨‘<=¹ èµ7…°%Ñ,S@öíLð¯ñäJ‹ûðŸÿÚ™+dì£-Ò$×+(¼ê¿Ýa‹Ô¯ˆ-ßÂŽýáÍ–.]Ñã%†õÞÉÊ.í%Fï} 6ƒ[i¡¶cj“ Ÿ`·Íí=úã‹Ì‹Íô¢;c¼Ê4[Ì@í†iÕ‚uÏ^—ªH¯ð)\n '!§×+ÿ¸‡†S”Ü7Uç‰oà Mæsà+0H¥¢óôÎ9°dT\Wî¶#⇞vxÁ³g¯üy»€¶pÙÍ·˜½‰çî}³’å2˜V¶æ÷Õr Äü“dô2KO¶ÂxO£™×G*_ì^Ìì°5|õŒæô‘&6Ø&Þô‰¯)#SÅí[l5ü$“Ê‚ázÅEo}å˜ô¨O‡^0 Ð~ØZY_;™LˆuVÎÖuëä÷·é¾iâ0F2zŠ+Ü[òÅjùK-¡&àÔՉɭ vª ÃóJPÈÅP³:™Ù:¦;;²ª>\;öÝ^âW[$íEä=<Æ’9×ûvl!2jSH(\O±WË?‡ñ&­Dc°#2TjÅa*壡GÞ>rØGx@*ó~òRûÔL!ŽüÓ½x’ͼZ@6T˜¤½He,¢ÉfÝ2ÊZ@›l‹BøaºŠjOãS÷OíÇä¶5’:û#âï/â´!ÔŒ†··ª¼™ß/ÖÔU®Öm¯¦j”Ü—vÏß?+_=ócëd¡ÉÛþÌã7šl­+ò,8˜{œ×6˜ÉÁÇ›„ø–ÐîDÕ|-~±¸…31]ké¶Ohþœ4ÅÊøÙPhþ¦©J|õFdZ¬¹]Í?ÇtÃùu†–¸ç qlÇPqÐŽOña\}ƒn¢#õ<I¹hñ.âvùt¼6wp¼¿Ëƒ" QßP²2`ÍÇ.ÇJä7f©¤ƒçöw¨ÚlE¥ßUûíñ{ó¢mb°)ïÌ¿±%SýÈdùþ[Ü  5XÂuï)33€ ¸¬ýx˜&Ä}¸¯é¶d¾-ZE)ãe¾§ˆ,€•ç’ŸI¬òûg9Ç» Ý–L‰eÑåã)¹°ßO}àG5'^ ;OĈ:F³rÛY <<œÛJM]ïðÆù˜ä O"~uÒC“{"¦B‰˜Ì{âžÒŠ({ÔÓ¬Çi!²)-î9£EkvÀœ*;x±¹Š}ë• 0fWü OR Ø}8Ãôåó„¢?æ`[ò>ÞÕe°ý…ò€X–bAcþº$Å'TÈ Ù^Ȭ%C˜k–™V`06B™lãû y”±‹ð .‡ÉªÀ=é[v·ÍUœÂµV™«¡“£ƒ/.UÂC+QÑϪë¿ÎO@CöÀg8ö¤Ï$W²ìžK~γAÜîú«”Áê0 áØÈ'QKQ¾Ò¶»ß#™ã×/ë0÷tææaÝÍè¨ç7²LK"rîž09´µVÛbN²’—»ycã¡ý õù(-:h&Z£k¥ì¿·‰"Š¥á¬W-Õ`û튒þÔsŠÝõ‹Œèd+´IÃ6¢B‹‘ãÝç..Ð)]% ϼL_é¹Hsr'BHe?wÝÙ2ǹd|µãÊÓbʯ—AíâÄá«iFÙ+VD7ø;þåÂÂÑGΟϩ7Ž{¿rH’kÊnç™ñïU”šTª¸-êG—h/ÈhºaÌ¿[ÆŸÏ ¨uä,\:Œ~ëÕ̰‡¹aâ¨Jds[a®|ò‘¨p½™xp ÓIòÿ­7²e¢Êñ%¯@¤IŠhš´Jiþð‘Ÿ=° ð#oî1Œ÷À£'6œz¤ŽéÔjÏ“„ÄzÀUˆ,øâ¶A´t“¥Qífjj°ˆnˆ† I–ì^¸FûdOt޹Ó!œm&¦¯åŽ1Þ†ûÅp^_^X—Ñx—ò¢ó\š}–ä‹9û!«TRe/A¼W\£cлÅD<Ñ[œˆ[ßÃïÛbFÛõC‚âÐ2¥¬““&•Ú›IG<ŽBalLör† Âïßòö (ïh$ï>û¢²–äÚõ­ÕÈ m&Vª­³SW ò¤a?š0tHއ|¡?™•ΡPÙžé;ªñÆ>heÂ_ hºQ,¶š%Z”x¹c—ˆO×xš_3ÂÍsx;c=ƒãÙ<gºJºþ.éz)° ìӘ̄}÷ÕeËð¦K¿iŽOÏæå“J6{‘vŒ»GÊ^ÔOäþèË–‰«ÝŽXÐé·.±¼‰,འ…A)¾j×ô¸5VŽûYýW Dõ¹7ÂŒº/éöÜ„™æf™o|eÿ^&ãê­‡‰nþ”4«É¾’D‚§üÜPžJ íÐl‚ó-‚úHvК~¿kü"–²OâËIV6F›‰Ó JÚ'ØIþ³wzL^fË*Rƒ$—lºÊŠ”Ÿ=ÃoÊÅ’îÓh£Ä!ç[x÷ $38I{Q Õ.N¶%·<ÙÅR¸R¯ñµ¼Z‘ÛniÞwñÑ[i¾>»ög€ú€Ò˜jÛ™G›ä(ÚÐ‹ßØ0£îTXé#¯ H<ßUXÿÃþ½„-I¢4‡MCUî}¨¤Câíõo õ¤×\ªE Ñ­4zm-Û™ÈäÛEãJˆò*§»òð½k<È#Ö°ƒCåh\áqÊDzѷ¡åStÍç{&¸Õ¤Æã>’JlR¢]ìø¾Ã”h1neýé¾ï*íðU, 슫jÓ:¯0QÅqí{˜Qó˜^G*-åz5Š)~1 0ЍòYÄÝâ¥ËDUó)nô©Ue]žâ\…C¯I݈}š7Ï6j(Õfüšc•f? 4p jïô5·ÔÈK¬Ð-q°?@œÀ¯üŠDÁ“×…|-„݆3 r;Þõ$æûr_J'º}oêh¹vTŠá—“>EXÖkné¿Ýž1tÅ~ýÀz«š0Ò¨«?"ÓYûêËŽÙ°ÉY9*o§ÒÃ`“‡õxØ*ÔŶÃ@O5úƲDsTv¿ôn˜Î‘÷K‚«¾ÖÂc\,ß1 ø¥ïÌ÷{ápñ îÔ¨Ïe÷æYïÞ]ƒ%ÇP¥P3Eˆ¹67ÂárG 7¥ŒÝQ0‚ÐFˬv§¶ñ¨~8ÂSžÏp€IQ&=óI¿:_­e%¡{L£‹sѳéîTQômÓŒ/ÂG’E“s9Bnè "ñî®É¯®nÿ°ú‘kÌ0têÊjÒ,WöC´‹±@Ñ{½¶fÝï™§ÝåÝì¢CC-ÝkÁÎÌë™¶bÂí3cU"ˆÞ­Š(íЦÝhA§OBNgìþȹÛ<¼#_"Õé­ö‡—}Î]ÕÊ)÷HÒ™´˜c —½êÓw¾I ©bZÑ>-aÕ9ð3vüÎÛ„Åa8ÅjÎ ë#i«P-Í |‡þ¤º¼@œ~z—„öÍz?'*RN*ú€ˆ¨ÆW‘Ó"i=³vâ*‡ËJVÎ_ Áœõ8žÙuÇÎŽG Ÿ¢Îwn€%Ø`¢ˆr©V…¨¹l–…n›`½“]žV a[ùµ!‘2‹Kaþ˺>ª8£‘²/nlŒ¸ÿ­,Q.š—À·ÎŠö'±áÜHò_ÎÉ”½i ËÊj¼¿M»â”{j.·®¦dÈ´¬ [—§~ BžúÊç¸#ɽü˜ŒË‰´ýÞijÞ)DÖêV4RŽ}KBˆíßd±+³Qé³Gþ>¸Aë’Ž@ö}˜à"¾Ì‡è¸ø»{DqÚ· Þ3ß ñÉã>ï,ß ‘{ågÕ/šìFÖi¥—z¿DÍóÇßA*ÁBŸ‡i—Q7&ã1n6~_å|"Ç3”‘Âà Ó'iý‚²FÊVÁÚx8ŽÀºÄ„¼e6wÿH²S¤ð€S^‘ ­zÄ·^ê8kH_ÅÁØj7¤@™*´6Ï‹ùê’;Ú×ң߿Ý;ý¸á”ÎÊk—¾Ò³7GÉÛäÏ߆¯‘ˆ´îWS>ËŽy)§WíQv÷°ÆxÒøP²ßVCË[‘S÷ ]hiÁÁuÈ•q¦ÁØHI|>§0uø%Ê IpùÝ»e9º›D6dqއÜl®Å§šGtHƒ]ÿ©ùÑŸrïš>ÄÒò> endobj 408 0 obj << /Length1 901 /Length2 2744 /Length3 0 /Length 3336 /Filter /FlateDecode >> stream xÚ­’y<Ôû÷dz” ÉÞ åÓ"[ŒÁ˜;*ûš}'‰a>Æ4c†Y˜±EÈ:Y³ËÖ&E([!ÂP–ÈV\˕ʥ”ý7u¿÷÷õíûï÷ñùçó<çuÎûõ8çH³´QÐFÝA"¢S„©ºf¶¶0e¦¨‘’Ò%( –HÐCQ@u†DÂm*PV`jêªpuU5ˆ Kô¡“°/ £+ûC„´½AÖEÌP/ЛÕÃ…lˆXBW´ñxÀúG°É ÉD+B`0õ î K€@82&xÄßa4Õ矔H"³L2,“²Ë"šHÀÓ4è šYo,'ÿ S¿67 âñæ(ïíNé¿ò(o,žþ/ÑÛ‡JI€ ’¿JÀ¿Í™h,Õû׬1…Çzh0xPú;„%`i ÚKñð($*ø3 пz`Íí§¨¹µ‘µ™¹ü¿ú3i‰Â(¶tŸÿïúCý“aÿfÖxHXତ¨¤c Yß?.¿<¦Oð ¢±ÖEÀÕ‰„¢CX§Á"8°4H@Ë0T‘@¤°JÖL‚O" òcŸH$õøúI0%%ŠÞ…0 îBeê¹ U(fÂ(ößcµ"ìBV­Ï.T ¤]Ȫ%ïB5JÙ…Jý‰ÿ=h"-P((«¨peU@ þ™•D ”Ÿ'ÌZÖ?ì‰emi ddˆèq&ârzÕµâý¢¾û{åØt0Õ‰æ•Mý <áÃIlø;/M|å&*×K²„øf÷ÎJúoŠ“c냬z >‡ù&f nÏú¹ÍfÔŠ;.g™Ñg|Ž ÿpðiÕÀ—E8›Å뉮âT§[m¹Kí ,eôlç¸ÆŽíivö{Üœ¡†p4ÈÂÛEEVœR9fÍŸá[­5îÏŸšÌ9Þr9jüè_ÄzªàzÑþü”mWt½Û¶Ð[= œcÄÓÃ×qÄyÓsÉ8eœ¼Ô)×´)¯£o»¢b-0ò¢M¸i©£gºœ²×ùÜ´7 m|†RФ²NeÖÒ{µt¯Çšèxè¾×ŸžI”x—*ö1­ur¶çÝBÖwŽXe·|8c°|ÔÆz $`B¶—QÇ–¯ÒgÍ÷+ç‘x)¼¦-- )ùÄ)¶ª¦õ(ÙX—\´,Ïöf¿aDÞàëŸ{‡æŽ­øÜÈgëSn§~+ÎÛ'šÆ]¡W{ˉ;þÔòPDÀ´Ó\o©ß ‰Q¸úÓKÂÙ‰ã'ŸjÅdg%êÆ<2½÷ñã°ƒ~äf„¦B„ÓÇÕ´|Î+êÁûDuÇ.ŸŠ3}Q'ðuJ–È$…F "-Î)š¾r@Þ<3mÚQb–0ÛаS¿å¬ºâY.%šÈ‚ÿôhûVÅôQÅM¨E9ß#<Ô&(öf‚§…­¡äd&c|¿GJ®˜¦aË®ñÑ«ì$èÜŸ¦¬&ßäyK,vÃ7k¬_|=1ðrÐ}cÏýðcªæ!¬Pkuúþ|ßÞè÷T’Èš‘ÞˆjßÒÄMú­Ùp™Îû‰¼áVÕ·Åí8Û­¶s¼”Ëö’îòàýRÚô#aG‰a-ÏÏt4h–š_}4¾¹!1oøø¸yZ)ëo²úLÐ`êÕöuÒÙ¸Äèà H_îÓû/œN"ªŸ@òtô±¾ìä¹ÅKB&C™OkÜ ¬ºä¼¥OÿÆãǰz˜:ëI2¹jJ+UëK–Ÿ’ä¯;Žy†,Ë Ú7{Þ 8-ÿ{kùLç0Û&òˆÎàJóï³ ¯ý}ì(R×]O;‡¡ÆüÈtbKîãyw!ˆYjÒ̧m5¹2ÄjÓ&ÏPKäË·l‚l¡yÌD ^»hÕ¨;ܼ2êÆ­ÛênÁŒór>ò$ÍÚ”‡üƒóEݶ-C½í7½)óóÝÝ„f»'¯Öl:»Ïa»Äøüòeb:.÷ÒÊżF…é®[y]¥xø¸æ"1é¼C»¥—!<Õwú½ïÜ“dŸrÙpß¾ÛCþ‰¤k>{é9ò­øThЊÉÐâLÆ•†ªÞ©é¾„ü`B‰pÇwx†8 ÖoŸÍr¹w_Wv‡~).«6æÒFa+†½S_,o-RV…מ6¿(),%üMÃÊ¿åˆ^ßïßÝJíKØä麗GÀ³=fÙÎÀ3öú›á¼#çIoÓ3ºÎ—šÕö…¸æ·½ü–÷i+C©ÝfWÓ¢3;SU¬? «Ýgšëãñ×ôÊÖK{ãŽ)}Î_†ÅÑ9WBQ ö– |¹_Âù¬‰Çá´W5 ÐVÜš :LöØkw­àéËù…yÕ^`}¦NÔ{#/ca®Ò£GfK¾¥PmÏ&Sµr·Ÿ¶H,îÄP%¢Í}‘¥Ÿ¿ÇµÅL²V•ϵ5'&'St5-fxìÉë,˜žéÍÎ"#AÃÙZ=Awc‚‡ð[µí¾=Kû8í¶*dM£óÛƒ=¬8D$jEÓ&úIͦÒ­»£ê‡_nÕÍDU —]U^pÚ]•’5æÞñÆø^Wö>fÕ¾cÓÍ風<ÙùNB4¯ê!Ö¬j˜©“NñíªÁÜtîù”ø¼P“«‘/H¥#ôpMíÆU]Xødb’|ÚVqEuÚÈ6¦] ÉÝ–4¬Ý>VÕ4¤Kx1_žïPSf%3Síx³YÉ_õµBKOW÷¹YÌæ±y.ovò‘-SK±3éI9Tìº"®p†wyà|)ÿbpçYCyêâ'ÿ¼—ƒÄêåØùÆÖø^Ê#¹5.ŸÃŸjzû1Lñæõ„†Ts»ô†˜ôÀ ƒÌlœ¢…ÑQÛ'´„ú{Æ‘ò%ϨáŸ+tPž}-#±¬Hœm<à›æ”U–„õÅ{\â¡FäQ墔U…‹Kµñ5Ãïs»‰ÑÍgÖpÏ PcÄÍÇ+hÏþ”1ýmÏšÿ5gö§Š-¯ñ¬Ÿ_Šop9ȶß0ÀÆçViáNÑ?/žŠ/xÈ0˜&Ti¿R¯^9tÜ‘1=Õª1ÙÔh’öu­TËÉÜÓÍo-zÏ»j3å÷¤Ïê-T mÄ”†>?Þè>} Ǹ÷å³³¨ ©I4«~a×+óòU§Ý>Ž@=t(˜lñúúWöî©7—¤Ïq‰ïdfÑÃqö1žBÌyTÀ‰”¤"a^»áOZ£|ßÍñw2³¯Å"c)°c?õQ_C/Eï*¾ZÔ©Lå}Z§”Nà.b>Kr©ñ{'ϾГ /¹¹J”DG»ë¬—5˜µÜj 5QéßB Ž¿ÐŠ©xk÷­DÄ)ñ¯qò endstream endobj 409 0 obj << /Type /FontDescriptor /FontName /NRHRMN+CMTT12 /Flags 4 /FontBBox [-1 -234 524 695] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/c/d/e/f/g/i/n/p/r/s/t/u) /FontFile 408 0 R >> endobj 410 0 obj << /Length1 1672 /Length2 9304 /Length3 0 /Length 10240 /Filter /FlateDecode >> stream xÚ­•e\ÔÝööéî’fH ‰¡[º»K‰a膡Aº»Kº»A‘î éð™û>çÜzÎÿíóá ßµ×^×µÖÞ¿=ôÔjš¬âæŽf`G7V P ©¬¥%²q ÑÓKº€Mݬ¤LÝÀ‚ € ±pr€¼‚ܼ‚œÜhôIG'/kK+7£$Ó_I|q{°‹5ÈÔ lêf¶‡Ö™Ú4AÖ`7/6€¸@㯮 °+ØÅlΆÌ­An3°¥µû_†ä,|ÿ ›Cœþ³ävq…š0BM2 Íì¼æ` 4vG¨êäÿ‡©ÿ-.±³S1µÿ«ü_Cú?˦öÖv^ÿNp´w‚¸]ÊŽæ`‡ÿMÕÿË›2ØÜbÿ¿«òn¦vÖ qK;0€ã_!kWkO°¹šµÈ àæÿ;˜ÿ¯èØþvÀ.£'¡b Àò¯ãü{MÍÔÚÁMËË韢%ÿÍÀß Ž‹µ'ÀƒƒM„þýç¿7ÿ£%ír4·v€Þ^€©‹‹©ôb@‰àX;˜ƒ=`O¨_v6G7èt$~ G´¿N“—À.þWè_Ä `—øM|vÉß$`—þ‡ø8 Íý& €]ö7qØå~€]þ7A”~TAù7ñØU~TOõâ‡ê©ý&¨‚Æo‚*hþ&n»Öo‚ö§ý› zº¿ ª ÿA/'»éo‚z1û‡€œP 3SØláöG˜çßáÝò6C ƒþ!h)£ô[ùO„›û¯ˆ½ýo9 ´?ó?:Pðí×℺±ü¡å¬~‡z²òr²;ü‘YÿÐVmÿ@¨A»?êÞþ7¡Îþ(}!Øÿ@¨3§ßÚÐ\'S°Ã‰øïèO‰ ê ì;ü‘ÊûwÌÚñ÷, !gˆ£ÛžKàßÑÿ® BgáòBwý}ÐM®`{ëÿ> ž¿rÀîÌ‹êÌÕÎÔÕêBP¿ex ¹Y¹€ÿ8" tä·ihMôÛsq9ºü™µû5äñÇu‚ŽÏó„ªxýÐQ{ÿÿ÷µ‘pôôaå°rrqx¸9¡_+¿ß¥ .Ðpûû‡¾Xÿa kèó{‚AhË Ž ¡w6i-aåþÒEӈ̰–­ñ*}³Ýè!K °v%cŠÎÌ z•™øX{ˆ{Td®‘]¾ê“2gAÎñéóÏ{î&{™Þídz—™Ê^»N4w!GØ-s×Ç<°ª3ãåÉúŃ9çCGjŒRZûÈkÔ0 Ý›>f½ãåÓ“É´Ó~ÚÀÀE­“î\Îý~Ý'9aýsˆ¿Í{”6–Õ Ç.ÞCJ~Ò³1ÌRT0§DîRëg‘÷™¬”LÀ)ã7ÄCz&ýsŸ=‡ÇDÅJö¶âñ9"HÛñ¥ƒiWˆ  K€ÙBNîã;EòãNV£Ÿ.Ó ¶–F™™”< ©%·Œ²Â& )|æV[L wvGI9ɸ<œˆè93פ¹?“é–ÃLiñÛrŸ³#\b r·¡B”«ç,¹×²4ØÛÀÅy¥Ÿ‘Œ‡®{àŽq*"i Œ“¡¹z…̃*Ç|‰Õƒ™EÛG\wväw—DQ €…ð/N’Q7»µÌébQBæf˜;®ÌÊ5ö(óËþÜÃojH»;S‰ŒpÕ»zë7c˜JC`VWs¹hǃ§¹ ém¯UYÊ}oHì•É)W#,våú–?&rSq~J’…q²ï‰WÊy`_ÍAJü hÃuDHÅHC˜ÓÃeÞ÷lº-#öÄ~ë`îekNV‰‘¤"´E¯Ý3–Y„qnIÔ;©êâÍ'䎲à“k{Rs[ŽQ¸úO¦5û¹Æ¨JUc`»C‘vê Ä+ÆÂ¡¼ 'Ó…!t<ÊÓwJ`âh7Q£)N[G4 pjÞ¦—wòÇ;§Z8}7€§üé«-—ßÈ¿¼­Ö^ÈŽ6õ)Š õQ%^IoÜñ¡ i7E!ÐG²ߦJvJ¦úKóm4ºª¼´·©Å÷Bd¿éÜ𹿳¿‘ƒÑü>I“ð#ðÞ÷—ݸX%‚“ÿbJÿ€"Éc­Gv W «cº’·^hÉË9ݨC®âжj´Bô×òþ8Bæ÷E›õ€)ø©'UÍd£%²|g\˜ÎIBg@à6/ÏÛËJ%Û¾3ÕŠ÷Iñw”¾••4ÜÜ[Âý.{aüAXø¢Æ^3@Ú¬¾¯ß! ¬é\Õ‚«_ð£é”¥ÿp kÌÙø‰-pæ ü*óŠ:—7eÙÈ¡0XKç%Ë~€ÞÞ š,£²­bŸøØhBÇ0‡€Mm­-æÂø7ÿjV¬L”„^ÚwØÏqI±QÑ!þ•î¸vd•éºþa7D§ F;£´ëåhØæ-x·xëÍ,c·µLg]™¿Þ‹‹yêÅ}<'õU7Ú/ìò&aC‹Åš1±Ÿ¨X"k“ŸËyBjÞ¥ ˜¿)ì/7[½§u[2"½œ¹-ÌÔ }Í^-1Y•›» .v3-‘±z·¥o “Q6¾ªUu£lÒщÛ4§½¨«òþq˜!!_Ùµ¢ƒ-T0 ¬ÜYvÚmš<¼$ê±5ÊÙ¿Dë¼t¹IeÿËÀ;jR}ÕŠ>!@ßdõ*;DÂ)vïâ[Jììå2ÃÛÀäAÍVÄs¶|Lí„2BÂWÚ•OJX˜-Kho™–¯l¥‰­üÍ‚£v¦;äBS©ó+ã|ön"]JìÉJâ q~${ÌlÉh èö“M„Ç®˜7vLyà¬T-#ÿÊ”%b¿TS³‹5š\ù»Œ©VKmÑÌ“IàƒXVŒnW ¡£‚áxžó‹´L33ÿ÷¡÷,åÌæ€oæw‡|Ô¦uÒô²3_[pÐê´¬Èåâ$¨ÎH,¶Å\´ŸÙ^®hþ`nòBUÁ öCÝ[æË¨s¾ä yÑZSyæÈù°¯ž#Y¥Òr¸ê]ˆ{Οm¬†„‘Š#0aÊå[ZiÔåX·(\L°ˆ®Þû½ä¦‚šûêWAO>#t8&f"é_ÙZ_ÇÈn•Mƒ„òû{qlòYÁ1ç[õ\’‹£UZX€ SÏ DË5…©ná\›HâÑ}K·M‚>»,¯K‚úå…¸msËíªõ÷Â?†²rs¾ÛñókKOsƒÎÄy5Ö—´LÃ3³+/úÂk3¾a6Qx®œÊÕøúnä`¢ S†ÙS—ù.hwäo9q+¯ Ln×.•dYN]]£SÏæEò½ªüÎøá¾*­=ñÈÚºЄspHÕáÙþLÒ"ßc]GSÑæy«“Pºy{˜™1`˜˜3¬JÞüÚtÃ/U’ãŸuªÒ¶…/j»òÌ Ö6¯Kû(+ C} — ‚W¯©"? ³‘ ˆà”ÊyHYqª2'¬Ì S[QpÈ6(’%Ìi8ѽTòÙáuúæ"ºÞþlʘ”VÖ7§Û9ì È£žÚ±XQÜ;nk´#ó4mùê‚ : ë/YòSK¼GÊÏTïÜò^”17µŠõk7ÑÛ¢ÀÊÛ( âˆuÕ°Rލ=XÏ…%«°ÐñpÖó‘Ñ!øªY/ˆ%Q…j„÷µGaã«Wo\¤¥´m¢?hÁ2TËÀú)´¥‚ŸÔoÒPÛßÝ¡æ] ÷î×›Ï@ÊŒ:"Qâf±tBÖZÞ­ ÿ D¦«kÖ¶gö… Õèõ¾B´¿ã9x}Ž,]¾¸{/igšg÷Èù½Ë#{pRúJkrýzrm„¦Õè—*6ÊÛ ”Ês£ƒ,”ËÖ_›C­ºÙ{i@cAŠXg¤ó¶e\‘NþÒ·BáÝø‘Ú(-–넸iæg‰[7šZ‰š´RÚÏ_™±~ßoT§I²š Ý= ¥ÎgP6'ú¼;_ž›bÆ$ •÷ã=Êž"°¢R¶[Ø …Ú}´÷H4ZÆöݺ=ëBFe½¥ ä±Å »'"Qj†yTñ d8Ò‰¯Ò¸êôŒ˜²90tÍÐÄ ’¶¸B,™ðÿÖÏ¥®åå´¢O¨±ûFÊÂC¦ÒǺ´ýŽí^)ß(J»ƒ¿­”(1PçKB§°>B¹‡Æ%qD‡ ‡ÚT.l´¦ÐY=o”Ó;Ë ¸±ˆt˜2ÎÖ/ÖÏ£pÕ©Uú°Ø*îØÃ(›ýF…“ãÄOõc­6Zm°h~Ý÷#ô¹:‰ÎJyVàáíµuÞùÚq.–>ìG…óG=xÚÒq-ç_k;Óç+ñš/­ŽU é¤6<éÓcî +¥í(Y›O_Çìb¼B²ôw"zNŠˆ´˜)¹š½›1j2 ýžè‘€øTÑJË»œτ־]0~…²ð£éµ|´Ê.\yÓœZ8÷Ëmï–Q|‹ÐE¦©+}ŸgUêŒb~u°ÐÙ›š®+Lj û ï•ÏÌÏC’ŠEìŸBv 8¦“·Ö: 2@Õ³xdS´aãNÂq’·oò{´D— —KàÃ}õ§˜A{þ*ËêØ½¹}'£Ï\¥›^M‰WbnÀgOɬ âmÎLL‰²l6X0dXzZ Æu†ÛO@Á¥úº©m=Mä.:Ÿv(BçØ HA4LËD|ßúªs¡ö ×+ØÂEŒ¹Ü·ú;³È×ñÔ!šf¿@5´†,|<¿´&ж[~ÐD‚Jgìù6m¶Hb-On‚‹–,Úøùç[:<§—±`0óQÉÞ ¡È¶ž¬nÑeé3 í”’‰êGªXpÐí µSÄ bŠ”þ¨'—òOl9ˆÙñã/ZÃDTš_&?’Nž,ÓÂÿ`âA"iuÛ¢Ì3?CÀÔ äÈ9¤iu”ˆÎ©lǶÅ|ɽ­•Ô _ÞrØp÷ #(ýÒ®P¢ë7ºGÜ3ïYìí6 AŸ“³çVbõ*“hqBE¼¤?SÃñW`€—¬˜ËumáîQÅEásÛ­cÔñoå 44y³ùºµ'¤Ð,Ptä½^-ÔsµnÚ±ÂJ?)cp°ðÞÏ~B¯ѴÓeû¤ˆFsÖ–ÒpRØtÿ.&˜ÍfbÎOÅIcˆ\°ê[ᓵ”*Ó[ië‘Æ½'"ÖuÔ[Ï–"}º´éS?õàfÌ5á˜F½aüKê™c‚øyžº’é~u¢FÕˆŸ¼$uB$¡åf ÆUt¤çÞùMRñÖÏ-½ç€Üϵ‚óÏN¾¹-äzgtG][ƒÙÔm¤i Ò¿†/Jô£)šZt5E9(øhZô1Eë|ꎵÝë<ƒâ2{ æã<Õ™Â*LÈ#"¿*ReÒÊsex»‘ôé݉WÒÜìÝb&VÍa874ÛßèžûvM<`Ú|´ÓFQxþVC+ Çæ3MVñÞ fÛ5a ]gEhl˜E³\>)ªŠj#W¾ Oʱœ·`º`sý©ý²RR“qz³ÿ‚ùI$ÉÕä* þã—I4ŸO:ÖNÀWqfQŸbâŠaZÔð¢›áÀ0¯³ºÝ8Hì;ŽÐ¢dO§7KÍe63—³ä¬(Ñ’P±ý±Ü¥ãòR*t™¾ÃP…’FWIo Q)NxðH##·ïlè„¢ŽwCˆW§Ž¥c’ˆ ²Ÿ"Íf÷_ý4]Lã#²øÑÏ"@˘yÇ|¾¨òEMÁÇ­^ïtœ‹eÝ“ê¹u¬–,dÌÅ\Ðwž“¶nŽŒ0í4(XP}®^\ ãð=+@MGÁDí+÷[Ѿ¥h°tÏ[Ã= ’ßc0=D¶ÞØa5”_YK‹øU—¹•39óR»™æ¦ã½Ç‹ù3à‰Í±wÁa©Û¾Ã…Ì ¾º&¥÷§÷Í5ÜÖ\_FŒ×çø¹ôTÜ|y‰qNËwÿŒ¬>aOßýVXîÓHÖzO¿®àÃüõO_U®{…¥Õ·ÜË Ê`ÞTVÎ6–w(nrzñcC:#Š£ŒHsñÂX— (å¼i†Œf®•û‚ƒUGo»/ͨïDÀ±0’û=–@æPø<…oAºI©d„‚µKŸ?È”ß[LÌBðhøcÒi?6—W­P1o¼“|É]f<&ÄXç\÷»ýĶiÊž;yG"“iJÍfâñýÿý‹Ä ¬íNÊý°«,¿P¼W;SX‰;+ýŽŽv¹±U~UgÆCX8,¢Á¾àÈ4x6‰/59kÙ®Kþ+õ¬{_â¦0Q棑ø¬â×¼ò7aô¯náêN>8bœ°ŸO [îU”†÷åD¸cTx„×5‡ÞIúü’ç.€âÎXšïâ”ÀÊê½·GéÉö™šMô:/h„ÿ¤¯¶g,à=³8‡èKZyP+k¢æ/É&ÿÚf@Bw{™¡êlà-Û›0½Â «ày|ƒNY¥ºÄ+­5Z,ÿP£cE!q¬„‡ÜT¥Ó0h_Ñžh#ïÎFœ§çEòjQØz5BßšA²³¤Ç΄3“âŠBüј~™™4«Ç¡<œÛCušÃòG¤d•”˜»ÿ(âÂsë¹ Ä`ZÕâ\XÃì1¿‰­Ÿ¯–¯Ð{¥cx\¨Ñ|ÐÔ¬€ç ·‘ôšÜ£©3ßq`\eÊX§Åñ÷%÷k‰¹PÝã¾ÕNˆ(e@$)Ãɘ|y ©vÝ$íÆÛŠSŠ1ß‚’Ï_âv8Pvr")kMŒ1ÒÃ9žš‰ˆ—× ¬¯­¨H%d“Ù·hëÉ‚S‚ôº–ÒX3 *CXa»¶¾Oú¼8¼û°ÔFBADÃ\ƹ[J „ÑÖ¶²ÈÌU´­¥åÑFD>=œÚ<ÈvldV|üofàƒíë3"ûê{šåÀ=v#ÀMÓÔh$h÷üp'Uñë¸2Ž;åb½‚¼ê_»è9…¤ûBÀ3PÕ'¿¾9p‘”vÁ öîÝÈ«ñ M©=¶ñ´­ƒ $ögÆ“aÂy}zŸ•ÊJtS~XVªÌ3ug÷Óq% Æ€ær å;– z™1šîÆê ²ùUžˆÝŠ—£þ­CTÔaJêQ5^“ÆÑ}n€Ó…©µ´'“@yª¯î/MHñEEXê ¬JOŸ^94¢§å弄©@k¿é†§X¡ðdì¸0£(qÓÝm€H(’žžù.£YEæõnÒßBÚÒÓx~Þ”{ž©½‡í8ï—5þz·¦Ò¢1,K\ó®! ³š0<¯áydDõÓNðî[­qMVt‡#"Ó,ZA’_„>¸nÚÖŽ°­_tû»Í46”÷ÛoÖÊì/¡·j1&ŠÆEbø¹?E·{e¼¦†õ¸ø7.¬[oQ#ôh²Ôù°ºZšàµ ÈW˜ÿb?-_›ÕoÀ-Ž›¿Te¤4‹=,fàÛˆ›Ž»Æe„ƒ°g¸nS;`ÑcÉ%¨BrTv¿s÷hp[YÒÃMðfAGœíHy¤­óz°¶Œî'‹ü‡ ò  Ç"}ø›=4,¶Ž¦ÈìªÌƒ9 ˆ¸i¢\”æªÕ°žx,(©®ˆŒm]öïVek€#² W~eAå«HžJ œÿþV‡‘<ÎVnësÞÛˆƒâØ!JJKòh&‚˜\‹ WaörÔs ‚–œ]å˜d{Žæî¢åyŪ˜>1š-9©b†O÷jCU(©¹µáó>~Oú¸f…B³7yÛȆ4ZE¯n>†HM6¯LÄqo£P[üzH)MçëÀ›§Eˆ¬4øåŒÕ‡O€BÔi4AmPuºÍõÒ`}/½™þFoX2…Ÿ» ™5À`ûçW²J+tIùX<‹óz&Q›–RYü¢Š©ÕªårKà žO‡{TöǺs齯3RTyƒôte°üdÌÝKR|7\K[ôȾۼüÍ*`¿uØê5º`æµMc6’±ö縷Áx†›ñU´CúbWvúV³âaÇ <‰Ù|†‚Ö«W†]EØçVnƒØb½6©aÜ3&èþ?úóÊ·J—hkôNL3…i|Öœ½ÁBA2 Rj]?D#è/KŽZ;Q?±¶ÉˆxÛ’VY»_3v9šN-¦ëKùX§sîÇ÷°øŠ#WÕe;¬‡S]·¾…¢€+0­aÎÓ1ª×ŸÊÛdfüƒå2CBÕÝ™À ~Õ}?îƒÁäðþ4VYýâÁ›þ¹ãp/¦ë¼$^n>¢­RO\r˼D¹M•/ŽF™ÝÒxÉbI¬,%üd¦Þ»¢œf¡eWäj0¨±_[ó¦cüx>gå˜ \0ø¤›á!©+ͨ‚½|q¸l;$qY& -é I.HßVS”ºK XýB‚ñÇ'ÏŸ)µpÀ5V Õ¦æKøÐbd 4E çZ·(J5Zwú|0¶¢Ðhh…p~ü<×ü§“‰BxxÄÄä…ô¾³5\w)Zu²–5zï:†ø€2{“ú:Ümü¬Ú¹õÎØå§ªa…1tð=ÞI¦kОÜz`[Ôþš`8Qd•—cO®”¥s«š=øÝà3æÙ%Íëï_0™¶Æï_È;Ìõ”ÑSºÀ¢ø¯¦ðc2µÎ‘;W<œø _…åë_ù>’¿…·±¯8í`xݬÎ%ÞYxk#ÍÚL¯¬žÉÏf< ·èºó’ðzåg•.¯HÚŒ9ÜÚúú]ßò^D#àèµgà«Õ{ÎÞQç$Ý ÃÒå¾öT€a×þwÍr‰9Þ2¹ `…hF¢~Ñ™Ùj—z–ü¼mQ?"û„Ž?âŽÒòï° ’ÒòïÜá)¾¢â` ÍóS ®P²ü‚À¾sTžÂÓP õN”5$¤Z¹z¾=“ªq]‰øÖËÎ0M¶ö$Å(Ídµ~sÆ÷+xý{+ƒîK¸Ñ·˜¶Ÿc¿Ý>ïªU¬· ¢à¸ì\®Véü!–0e® i¦‡<:»°|†mENm”-{8¯è½ú`>è‰ç ò¾¸N -r•άSg–7ä¸ l#…jõh‘ƒ¿ßÖó ·ìÑbÍ1Ï1±iÑ:úæóqjœŒê£Í>b²œ”#ö ´pɵÈõ"7#¡'Mýã×UPpåïÛø‘dä!í¬óƒçw ê¼OÅ{MV§™ÃìÀ·q« ÌáÁëÚ8$áfÛŠø Y>""©³RïêSCãéò¯"”¶¯2„›—è~pácF˧Žgt"©÷•°Âì=S?—Y.v÷— `˜8 ˜ƒ‰ÓFËe=B"4T°ßç¬Îúc­ˆ'i‘3cÈqùœê›z”¤˜@î»ä@§µ¡Ñʪl]¢V§“ÐŒ¼äCý… JZiÔ$@ûØJá¥åŽÃ­xH.¹E÷f¾çmß.¸‘1ßö+élòeG½õ1dúVŠ¥ÏÚÁ»é(baá6¹ôþk?– _;ÙòŸìýô6"ÖåÚ:c hÜ^ÅÝýænJÔÓIá–ìÔto'EÚ¦rCðbV®bó³ w¹[†AA–  gɯÅçr‰Œ‡€¬™L$aqÄ?7%^h:[]M7Ù;>%·*”ZJwJx ,l~•ï`—È-ö µ5I ˜B0»r|9…„úV×;Î[ÉË ~ýcírì·‰îVgùÜñ|ŠdQ´Ç³Ðk|<Ÿ‰õ‘T?²#Û9…h¸ÓŽ\×îîu:Á,ËÞ§‹G0XY¥–o¸ÞVÙTÕËê™ó#µz’¬gxI-¸ª€Ÿ¢/^LÀb½k—˜š!w¬h0þëËË@¼ñ#&˜d¿Y;Ÿ29³Þé…Ý‘@åç|T 8Éžó§o_#Q9",kŒ^h{!jœ’e$J(1D§6“ƒ¦J—‘ix8’k¹UÚd>y¬rÝt}ˆ8årJf*;úF4š¸“ žæªÉeZ!Vœo½Î¦. «‘äUêô™RѦa/4Ûò´l¥#¬8FM9í9¢ý ©ŸÚXøêT‰ôÆò»cÔÚ¤ö ¦O„gó\•Å¢¡”ââ› ¢ä¡÷WXD¨VðÆö˜c˜a(Z“7'çj á<?xÝ'Õ[?Ö®÷`}—zm" @þþ”jç÷Y´> _= ëå§‚Íó¢®›I2 ¦{ÑFsN’ZîŽDÂ'‰+|üÀ ŒaÅ—¼È\OeTã2SjÃaÎûo ˆbs)úÄi\‘‰vÙåº]r_çÌ%  ÿÚ蔡çæèîLX½@âê9Ýk££šàÔ¾³q%¿Çj$Ó•L*`X%yáÛUÌï‰ÝÃqÖ…ò^FÃlØ3à`zѨÕXäúíb—’ªS eŠ|O3ÏÈñG8DwÀ>ÖÉU[Áÿv_BË 30»ÖrAyt9 ç?Ê‚ÿ†+­ï”º0<ÀÞn^Ö7Ä )AnX#*ŽbÔÉð`Á9ñ–ô¹eWõÉʯ ÓÄX§r'¨Ùc£q_²“9dŠm^KK ¾*¹ø‚ø…-þËûs@`ë¶zòå8v¢õÎ`Ûª©(ÊòF'jªÌWAEàG˜q7-ýÝEu ——Mºfç†F„OnËŽ£$Ê[µŒË”·B M;¹á1>wD4Z°ýïVµ4À¢›VóbHš: .áKÀÚK5¿ÖóÿòªþJ endstream endobj 411 0 obj << /Type /FontDescriptor /FontName /FXBNZJ+CMTT9 /Flags 4 /FontBBox [-6 -233 542 698] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 74 /XHeight 431 /CharSet (/A/B/C/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/Y/a/b/braceleft/braceright/c/colon/comma/d/e/f/g/h/hyphen/i/k/l/m/n/o/p/parenleft/parenright/percent/period/quoteleft/quoteright/r/s/semicolon/seven/slash/t/three/u/underscore/v/w/x/y/z) /FontFile 410 0 R >> endobj 172 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TPNFOK+CMB10 /FontDescriptor 383 0 R /FirstChar 97 /LastChar 108 /Widths 371 0 R /ToUnicode 1 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MBTAZE+CMBX12 /FontDescriptor 385 0 R /FirstChar 11 /LastChar 121 /Widths 381 0 R /ToUnicode 1 0 R >> endobj 284 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CUJHND+CMMI10 /FontDescriptor 387 0 R /FirstChar 58 /LastChar 58 /Widths 367 0 R >> endobj 283 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GPANTX+CMMI12 /FontDescriptor 389 0 R /FirstChar 58 /LastChar 58 /Widths 368 0 R >> endobj 251 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PQILTH+CMMI9 /FontDescriptor 391 0 R /FirstChar 58 /LastChar 58 /Widths 369 0 R >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BKCFHB+CMR10 /FontDescriptor 393 0 R /FirstChar 11 /LastChar 124 /Widths 379 0 R /ToUnicode 1 0 R >> endobj 250 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NSZMQR+CMR9 /FontDescriptor 395 0 R /FirstChar 39 /LastChar 122 /Widths 370 0 R /ToUnicode 1 0 R >> endobj 79 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VBVZJV+CMSL10 /FontDescriptor 397 0 R /FirstChar 42 /LastChar 121 /Widths 374 0 R /ToUnicode 1 0 R >> endobj 66 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KXLZOH+CMSLTT10 /FontDescriptor 399 0 R /FirstChar 39 /LastChar 122 /Widths 376 0 R /ToUnicode 3 0 R >> endobj 128 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FFYKXD+CMSS10 /FontDescriptor 401 0 R /FirstChar 40 /LastChar 41 /Widths 372 0 R /ToUnicode 1 0 R >> endobj 14 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AQTFCU+CMSY10 /FontDescriptor 403 0 R /FirstChar 13 /LastChar 15 /Widths 378 0 R >> endobj 80 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SNXGZO+CMTI10 /FontDescriptor 405 0 R /FirstChar 34 /LastChar 122 /Widths 373 0 R /ToUnicode 2 0 R >> endobj 21 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YZPPEH+CMTT10 /FontDescriptor 407 0 R /FirstChar 34 /LastChar 126 /Widths 377 0 R /ToUnicode 3 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NRHRMN+CMTT12 /FontDescriptor 409 0 R /FirstChar 99 /LastChar 117 /Widths 380 0 R /ToUnicode 3 0 R >> endobj 67 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FXBNZJ+CMTT9 /FontDescriptor 411 0 R /FirstChar 37 /LastChar 125 /Widths 375 0 R /ToUnicode 3 0 R >> endobj 10 0 obj << /Type /Pages /Count 6 /Parent 412 0 R /Kids [5 0 R 12 0 R 17 0 R 23 0 R 27 0 R 31 0 R] >> endobj 38 0 obj << /Type /Pages /Count 6 /Parent 412 0 R /Kids [35 0 R 40 0 R 44 0 R 48 0 R 52 0 R 56 0 R] >> endobj 68 0 obj << /Type /Pages /Count 6 /Parent 412 0 R /Kids [63 0 R 70 0 R 75 0 R 82 0 R 87 0 R 94 0 R] >> endobj 103 0 obj << /Type /Pages /Count 6 /Parent 412 0 R /Kids [100 0 R 106 0 R 111 0 R 116 0 R 122 0 R 130 0 R] >> endobj 139 0 obj << /Type /Pages /Count 6 /Parent 412 0 R /Kids [135 0 R 143 0 R 153 0 R 160 0 R 164 0 R 168 0 R] >> endobj 177 0 obj << /Type /Pages /Count 6 /Parent 412 0 R /Kids [174 0 R 179 0 R 184 0 R 189 0 R 194 0 R 246 0 R] >> endobj 285 0 obj << /Type /Pages /Count 1 /Parent 413 0 R /Kids [280 0 R] >> endobj 412 0 obj << /Type /Pages /Count 36 /Parent 414 0 R /Kids [10 0 R 38 0 R 68 0 R 103 0 R 139 0 R 177 0 R] >> endobj 413 0 obj << /Type /Pages /Count 1 /Parent 414 0 R /Kids [285 0 R] >> endobj 414 0 obj << /Type /Pages /Count 37 /Kids [412 0 R 413 0 R] >> endobj 415 0 obj << /Type /Outlines /First 287 0 R /Last 365 0 R /Count 10 >> endobj 365 0 obj << /Title 366 0 R /A 364 0 R /Parent 415 0 R /Prev 362 0 R >> endobj 362 0 obj << /Title 363 0 R /A 361 0 R /Parent 415 0 R /Prev 359 0 R /Next 365 0 R >> endobj 359 0 obj << /Title 360 0 R /A 358 0 R /Parent 415 0 R /Prev 356 0 R /Next 362 0 R >> endobj 356 0 obj << /Title 357 0 R /A 355 0 R /Parent 415 0 R /Prev 335 0 R /Next 359 0 R >> endobj 353 0 obj << /Title 354 0 R /A 352 0 R /Parent 335 0 R /Prev 350 0 R >> endobj 350 0 obj << /Title 351 0 R /A 349 0 R /Parent 335 0 R /Prev 347 0 R /Next 353 0 R >> endobj 347 0 obj << /Title 348 0 R /A 346 0 R /Parent 335 0 R /Prev 344 0 R /Next 350 0 R >> endobj 344 0 obj << /Title 345 0 R /A 343 0 R /Parent 335 0 R /Prev 341 0 R /Next 347 0 R >> endobj 341 0 obj << /Title 342 0 R /A 340 0 R /Parent 335 0 R /Prev 338 0 R /Next 344 0 R >> endobj 338 0 obj << /Title 339 0 R /A 337 0 R /Parent 335 0 R /Next 341 0 R >> endobj 335 0 obj << /Title 336 0 R /A 334 0 R /Parent 415 0 R /Prev 299 0 R /Next 356 0 R /First 338 0 R /Last 353 0 R /Count -6 >> endobj 332 0 obj << /Title 333 0 R /A 331 0 R /Parent 299 0 R /Prev 329 0 R >> endobj 329 0 obj << /Title 330 0 R /A 328 0 R /Parent 299 0 R /Prev 326 0 R /Next 332 0 R >> endobj 326 0 obj << /Title 327 0 R /A 325 0 R /Parent 299 0 R /Prev 302 0 R /Next 329 0 R >> endobj 323 0 obj << /Title 324 0 R /A 322 0 R /Parent 302 0 R /Prev 320 0 R >> endobj 320 0 obj << /Title 321 0 R /A 319 0 R /Parent 302 0 R /Prev 317 0 R /Next 323 0 R >> endobj 317 0 obj << /Title 318 0 R /A 316 0 R /Parent 302 0 R /Prev 305 0 R /Next 320 0 R >> endobj 314 0 obj << /Title 315 0 R /A 313 0 R /Parent 305 0 R /Prev 311 0 R >> endobj 311 0 obj << /Title 312 0 R /A 310 0 R /Parent 305 0 R /Prev 308 0 R /Next 314 0 R >> endobj 308 0 obj << /Title 309 0 R /A 307 0 R /Parent 305 0 R /Next 311 0 R >> endobj 305 0 obj << /Title 306 0 R /A 304 0 R /Parent 302 0 R /Next 317 0 R /First 308 0 R /Last 314 0 R /Count -3 >> endobj 302 0 obj << /Title 303 0 R /A 301 0 R /Parent 299 0 R /Next 326 0 R /First 305 0 R /Last 323 0 R /Count -4 >> endobj 299 0 obj << /Title 300 0 R /A 298 0 R /Parent 415 0 R /Prev 296 0 R /Next 335 0 R /First 302 0 R /Last 332 0 R /Count -4 >> endobj 296 0 obj << /Title 297 0 R /A 295 0 R /Parent 415 0 R /Prev 293 0 R /Next 299 0 R >> endobj 293 0 obj << /Title 294 0 R /A 292 0 R /Parent 415 0 R /Prev 290 0 R /Next 296 0 R >> endobj 290 0 obj << /Title 291 0 R /A 289 0 R /Parent 415 0 R /Prev 287 0 R /Next 293 0 R >> endobj 287 0 obj << /Title 288 0 R /A 286 0 R /Parent 415 0 R /Next 290 0 R >> endobj 416 0 obj << /Names [(-1) 282 0 R (1) 19 0 R (10) 58 0 R (11) 65 0 R (12) 72 0 R (13) 77 0 R] /Limits [(-1) (13)] >> endobj 417 0 obj << /Names [(14) 84 0 R (15) 89 0 R (16) 96 0 R (17) 102 0 R (18) 108 0 R (19) 113 0 R] /Limits [(14) (19)] >> endobj 418 0 obj << /Names [(2) 25 0 R (20) 118 0 R (21) 124 0 R (22) 132 0 R (23) 137 0 R (24) 145 0 R] /Limits [(2) (24)] >> endobj 419 0 obj << /Names [(25) 155 0 R (26) 162 0 R (27) 166 0 R (28) 170 0 R (29) 176 0 R (3) 29 0 R] /Limits [(25) (3)] >> endobj 420 0 obj << /Names [(30) 181 0 R (31) 186 0 R (32) 191 0 R (33) 196 0 R (34) 248 0 R (4) 33 0 R] /Limits [(30) (4)] >> endobj 421 0 obj << /Names [(5) 37 0 R (6) 42 0 R (7) 46 0 R (8) 50 0 R (9) 54 0 R (Algorithmic Details) 171 0 R] /Limits [(5) (Algorithmic Details)] >> endobj 422 0 obj << /Names [(Bibliography) 197 0 R (Binary Strings) 109 0 R (Bugs) 187 0 R (C Code Inclusion) 114 0 R (Concept Index) 249 0 R (Contributors) 73 0 R] /Limits [(Bibliography) (Contributors)] >> endobj 423 0 obj << /Names [(Controls for GNU indent) 126 0 R (Copying) 20 0 R (Declarations) 92 0 R (Description) 90 0 R (Functions) 125 0 R (Gperf Declarations) 98 0 R] /Limits [(Controls for GNU indent) (Gperf Declarations)] >> endobj 424 0 obj << /Names [(Input Details) 147 0 R (Input Format) 91 0 R (Keywords) 119 0 R (Motivation) 78 0 R (Options) 133 0 R (Output Copyright) 138 0 R] /Limits [(Input Details) (Output Copyright)] >> endobj 425 0 obj << /Names [(Output Details) 156 0 R (Output File) 146 0 R (Output Format) 127 0 R (Output Language) 149 0 R (Projects) 192 0 R (Search Structures) 85 0 R] /Limits [(Output Details) (Search Structures)] >> endobj 426 0 obj << /Names [(User-supplied Struct) 97 0 R (Verbosity) 182 0 R] /Limits [(User-supplied Struct) (Verbosity)] >> endobj 427 0 obj << /Kids [416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R] /Limits [(-1) (Algorithmic Details)] >> endobj 428 0 obj << /Kids [422 0 R 423 0 R 424 0 R 425 0 R 426 0 R] /Limits [(Bibliography) (Verbosity)] >> endobj 429 0 obj << /Kids [427 0 R 428 0 R] /Limits [(-1) (Verbosity)] >> endobj 430 0 obj << /Dests 429 0 R >> endobj 431 0 obj << /Type /Catalog /Pages 414 0 R /Outlines 415 0 R /Names 430 0 R /PageMode /UseOutlines >> endobj 432 0 obj << /Producer (pdfTeX-1.40.3) /Creator (TeX) /CreationDate (D:20090201122029Z) /ModDate (D:20090201122029Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref 0 433 0000000000 65535 f 0000000015 00000 n 0000000681 00000 n 0000001358 00000 n 0000002507 00000 n 0000002402 00000 n 0000001962 00000 n 0000224313 00000 n 0000226161 00000 n 0000224900 00000 n 0000226479 00000 n 0000003649 00000 n 0000003541 00000 n 0000002597 00000 n 0000225699 00000 n 0000006719 00000 n 0000006967 00000 n 0000006592 00000 n 0000003730 00000 n 0000006865 00000 n 0000006916 00000 n 0000226001 00000 n 0000009845 00000 n 0000009686 00000 n 0000007071 00000 n 0000009794 00000 n 0000013064 00000 n 0000012905 00000 n 0000009925 00000 n 0000013013 00000 n 0000016088 00000 n 0000015929 00000 n 0000013133 00000 n 0000016037 00000 n 0000019350 00000 n 0000019191 00000 n 0000016157 00000 n 0000019299 00000 n 0000226588 00000 n 0000022430 00000 n 0000022271 00000 n 0000019419 00000 n 0000022379 00000 n 0000025439 00000 n 0000025280 00000 n 0000022499 00000 n 0000025388 00000 n 0000028594 00000 n 0000028435 00000 n 0000025508 00000 n 0000028543 00000 n 0000031739 00000 n 0000031580 00000 n 0000028663 00000 n 0000031688 00000 n 0000034647 00000 n 0000034488 00000 n 0000031808 00000 n 0000034596 00000 n 0000037441 00000 n 0000037600 00000 n 0000037759 00000 n 0000037986 00000 n 0000037300 00000 n 0000034716 00000 n 0000037935 00000 n 0000225377 00000 n 0000226320 00000 n 0000226698 00000 n 0000039541 00000 n 0000039331 00000 n 0000038102 00000 n 0000039439 00000 n 0000039490 00000 n 0000041330 00000 n 0000041120 00000 n 0000039656 00000 n 0000041228 00000 n 0000041279 00000 n 0000225217 00000 n 0000225841 00000 n 0000045064 00000 n 0000044854 00000 n 0000041446 00000 n 0000044962 00000 n 0000045013 00000 n 0000048165 00000 n 0000047845 00000 n 0000045203 00000 n 0000047953 00000 n 0000048004 00000 n 0000048055 00000 n 0000048110 00000 n 0000050819 00000 n 0000050554 00000 n 0000048292 00000 n 0000050662 00000 n 0000050713 00000 n 0000050764 00000 n 0000053733 00000 n 0000053569 00000 n 0000050946 00000 n 0000053680 00000 n 0000226808 00000 n 0000057062 00000 n 0000057260 00000 n 0000056930 00000 n 0000053838 00000 n 0000057207 00000 n 0000069176 00000 n 0000060211 00000 n 0000059989 00000 n 0000057378 00000 n 0000060101 00000 n 0000060154 00000 n 0000062796 00000 n 0000062575 00000 n 0000060316 00000 n 0000062687 00000 n 0000062740 00000 n 0000068985 00000 n 0000065374 00000 n 0000065042 00000 n 0000062901 00000 n 0000065154 00000 n 0000065207 00000 n 0000065260 00000 n 0000065317 00000 n 0000225539 00000 n 0000069233 00000 n 0000068853 00000 n 0000065515 00000 n 0000069123 00000 n 0000074081 00000 n 0000070657 00000 n 0000070439 00000 n 0000069375 00000 n 0000070551 00000 n 0000070604 00000 n 0000226925 00000 n 0000073455 00000 n 0000073743 00000 n 0000074305 00000 n 0000073299 00000 n 0000070750 00000 n 0000074028 00000 n 0000074134 00000 n 0000074191 00000 n 0000073600 00000 n 0000074248 00000 n 0000073887 00000 n 0000076902 00000 n 0000077300 00000 n 0000076762 00000 n 0000074433 00000 n 0000077190 00000 n 0000077243 00000 n 0000077047 00000 n 0000080054 00000 n 0000080252 00000 n 0000079922 00000 n 0000077417 00000 n 0000080199 00000 n 0000083136 00000 n 0000082971 00000 n 0000080358 00000 n 0000083083 00000 n 0000086272 00000 n 0000086050 00000 n 0000083242 00000 n 0000086162 00000 n 0000086215 00000 n 0000224153 00000 n 0000089136 00000 n 0000088971 00000 n 0000086401 00000 n 0000089083 00000 n 0000227042 00000 n 0000090635 00000 n 0000090413 00000 n 0000089254 00000 n 0000090525 00000 n 0000090578 00000 n 0000092607 00000 n 0000092389 00000 n 0000090728 00000 n 0000092501 00000 n 0000092554 00000 n 0000094186 00000 n 0000093968 00000 n 0000092747 00000 n 0000094080 00000 n 0000094133 00000 n 0000096532 00000 n 0000096314 00000 n 0000094291 00000 n 0000096426 00000 n 0000096479 00000 n 0000099750 00000 n 0000099883 00000 n 0000100016 00000 n 0000100149 00000 n 0000100282 00000 n 0000100415 00000 n 0000100548 00000 n 0000100681 00000 n 0000100813 00000 n 0000100946 00000 n 0000101079 00000 n 0000101212 00000 n 0000101345 00000 n 0000101478 00000 n 0000101611 00000 n 0000101743 00000 n 0000101876 00000 n 0000102009 00000 n 0000102142 00000 n 0000102274 00000 n 0000102407 00000 n 0000102540 00000 n 0000102671 00000 n 0000102804 00000 n 0000102937 00000 n 0000103070 00000 n 0000103202 00000 n 0000103335 00000 n 0000103468 00000 n 0000103601 00000 n 0000103732 00000 n 0000103860 00000 n 0000103989 00000 n 0000104118 00000 n 0000104247 00000 n 0000104376 00000 n 0000104505 00000 n 0000104634 00000 n 0000104763 00000 n 0000104891 00000 n 0000105020 00000 n 0000105149 00000 n 0000105276 00000 n 0000105405 00000 n 0000105534 00000 n 0000105662 00000 n 0000105795 00000 n 0000106030 00000 n 0000099250 00000 n 0000096637 00000 n 0000105924 00000 n 0000105977 00000 n 0000225058 00000 n 0000224758 00000 n 0000108651 00000 n 0000108778 00000 n 0000108907 00000 n 0000109036 00000 n 0000109165 00000 n 0000109294 00000 n 0000109422 00000 n 0000109551 00000 n 0000109679 00000 n 0000109807 00000 n 0000109936 00000 n 0000110065 00000 n 0000110194 00000 n 0000110322 00000 n 0000110451 00000 n 0000110580 00000 n 0000110709 00000 n 0000110837 00000 n 0000110966 00000 n 0000111095 00000 n 0000111224 00000 n 0000111353 00000 n 0000111482 00000 n 0000111611 00000 n 0000111740 00000 n 0000111869 00000 n 0000111998 00000 n 0000112179 00000 n 0000108311 00000 n 0000106147 00000 n 0000112126 00000 n 0000224615 00000 n 0000224472 00000 n 0000227159 00000 n 0000112309 00000 n 0000230024 00000 n 0000112354 00000 n 0000112400 00000 n 0000229931 00000 n 0000112450 00000 n 0000112503 00000 n 0000229838 00000 n 0000112551 00000 n 0000112583 00000 n 0000229745 00000 n 0000112638 00000 n 0000112696 00000 n 0000229613 00000 n 0000112745 00000 n 0000112800 00000 n 0000229495 00000 n 0000112850 00000 n 0000112891 00000 n 0000229377 00000 n 0000112941 00000 n 0000112973 00000 n 0000229298 00000 n 0000113031 00000 n 0000113071 00000 n 0000229205 00000 n 0000113127 00000 n 0000113165 00000 n 0000229126 00000 n 0000113219 00000 n 0000113255 00000 n 0000229033 00000 n 0000113301 00000 n 0000113347 00000 n 0000228940 00000 n 0000113394 00000 n 0000113446 00000 n 0000228861 00000 n 0000113507 00000 n 0000113568 00000 n 0000228768 00000 n 0000113619 00000 n 0000113684 00000 n 0000228675 00000 n 0000113736 00000 n 0000113772 00000 n 0000228596 00000 n 0000113826 00000 n 0000113873 00000 n 0000228464 00000 n 0000113918 00000 n 0000113952 00000 n 0000228385 00000 n 0000114001 00000 n 0000114063 00000 n 0000228292 00000 n 0000114114 00000 n 0000114186 00000 n 0000228199 00000 n 0000114239 00000 n 0000114310 00000 n 0000228106 00000 n 0000114362 00000 n 0000114432 00000 n 0000228013 00000 n 0000114489 00000 n 0000114562 00000 n 0000227934 00000 n 0000114609 00000 n 0000114647 00000 n 0000227841 00000 n 0000114689 00000 n 0000114746 00000 n 0000227748 00000 n 0000114792 00000 n 0000114835 00000 n 0000227655 00000 n 0000114885 00000 n 0000114917 00000 n 0000227576 00000 n 0000114968 00000 n 0000115001 00000 n 0000115026 00000 n 0000115049 00000 n 0000115074 00000 n 0000115572 00000 n 0000115661 00000 n 0000115692 00000 n 0000116227 00000 n 0000116677 00000 n 0000117052 00000 n 0000117407 00000 n 0000117798 00000 n 0000117830 00000 n 0000118462 00000 n 0000118595 00000 n 0000119238 00000 n 0000121077 00000 n 0000121299 00000 n 0000132321 00000 n 0000132708 00000 n 0000134330 00000 n 0000134557 00000 n 0000136184 00000 n 0000136411 00000 n 0000138037 00000 n 0000138263 00000 n 0000155573 00000 n 0000156149 00000 n 0000165412 00000 n 0000165770 00000 n 0000172855 00000 n 0000173150 00000 n 0000178900 00000 n 0000179193 00000 n 0000181007 00000 n 0000181245 00000 n 0000182604 00000 n 0000182844 00000 n 0000194065 00000 n 0000194422 00000 n 0000209097 00000 n 0000209661 00000 n 0000213116 00000 n 0000213356 00000 n 0000223716 00000 n 0000227236 00000 n 0000227351 00000 n 0000227428 00000 n 0000227498 00000 n 0000230103 00000 n 0000230227 00000 n 0000230354 00000 n 0000230481 00000 n 0000230608 00000 n 0000230735 00000 n 0000230888 00000 n 0000231096 00000 n 0000231327 00000 n 0000231534 00000 n 0000231756 00000 n 0000231883 00000 n 0000231999 00000 n 0000232107 00000 n 0000232181 00000 n 0000232219 00000 n 0000232328 00000 n trailer << /Size 433 /Root 431 0 R /Info 432 0 R /ID [ ] >> startxref 232588 %%EOF gperf-3.0.4/doc/gperf_1.html0000664000000000000000000011010711141312111014261 0ustar rootroot Perfect Hash Function Generator - GNU GENERAL PUBLIC LICENSE Go to the first, previous, next, last section, table of contents.


    Copyright (C) 1989-2009 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.0.4/doc/gperf_2.html0000664000000000000000000000352011141312111014262 0ustar rootroot 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


    Go to the first, previous, next, last section, table of contents. gperf-3.0.4/doc/gperf_3.html0000664000000000000000000000377111141312111014273 0ustar rootroot 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 http://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.0.4/doc/gperf_4.html0000664000000000000000000001062011141312111014263 0ustar rootroot 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.0.4/doc/gperf_5.html0000664000000000000000000006506111141312111014275 0ustar rootroot 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 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 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, unsigned int 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, unsigned int 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 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 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.0.4/doc/gperf_6.html0000664000000000000000000005156411141312111014301 0ustar rootroot 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 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.
    ‘-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 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.0.4/doc/gperf_7.html0000664000000000000000000000437011141312111014273 0ustar rootroot 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:


    Go to the first, previous, next, last section, table of contents. gperf-3.0.4/doc/gperf_8.html0000664000000000000000000000344511141312111014276 0ustar rootroot 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:


    Go to the first, previous, next, last section, table of contents. gperf-3.0.4/doc/gperf_9.html0000664000000000000000000000555511141312111014303 0ustar rootroot 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.0.4/doc/configure0000775000000000000000000022332111141540751013777 0ustar rootroot#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 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 -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 fi echo >conf$$.file 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, 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= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="gperf.1" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias PACKAGE SET_MAKE INSTALL INSTALL_PROGRAM INSTALL_DATA LIBOBJS LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false # 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' 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=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. 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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$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 ;; -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=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 ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$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'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. 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 do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } 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 echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 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 .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # 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 -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | 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 .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } 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] --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 _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" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 guested configure. 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 echo "$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.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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 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.61. Invocation command line was $ $0 $@ _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 test -z "$as_dir" && as_dir=. echo "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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$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 ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_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 cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$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'; { (exit 1); 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 # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" 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. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$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,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$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 { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$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. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } 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 PACKAGE=gperf { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD compatible install" >&5 echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${cl_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. for ac_prog in ginstall installbsd scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. # OSF/1 installbsd also uses dspmsg, but is usable. : else if test $ac_prog = installbsd && strings $ac_dir/$ac_prog | grep src/bos >/dev/null 2>&1; then # AIX installbsd doesn't work without option "-g". : else cl_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi fi done ;; esac done IFS="$ac_save_ifs" # As a last resort, use cp. test -z "$cl_cv_path_install" && cl_cv_path_install="cp" fi INSTALL="$cl_cv_path_install" fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$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)' if test -z "$INSTALL_DATA"; then case "$INSTALL" in cp | */cp ) INSTALL_DATA='$(INSTALL)' ;; * ) INSTALL_DATA='$(INSTALL) -m 644' ;; 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_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+set}" = set || &/ 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 test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$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=' 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 s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= 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=`echo "$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. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $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} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 fi echo >conf$$.file 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&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.61. 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 cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet 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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 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' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. 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=$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 ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) echo "$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. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$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 if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; 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+set}" = set || 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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim PACKAGE!$PACKAGE$ac_delim SET_MAKE!$SET_MAKE$ac_delim INSTALL!$INSTALL$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 44; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ 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[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[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="$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 || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$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 "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; 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 || echo 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" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$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 || echo 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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 # 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= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF 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 sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;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 " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$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 "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # 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 || { (exit 1); exit 1; } fi gperf-3.0.4/doc/gpl-3.0.texi0000664000000000000000000010441311054056730014045 0ustar rootroot@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.0.4/doc/configure.ac0000664000000000000000000000226511133501077014357 0ustar rootrootdnl autoconf configuration for gperf/doc dnl Copyright (C) 1998, 2000, 2002-2003, 2007, 2009 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.60]) AC_INIT([gperf.1]) PACKAGE=gperf AC_SUBST([PACKAGE]) AC_PROG_MAKE_SET dnl dnl checks for programs dnl CL_PROG_INSTALL dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM dnl dnl That's it. dnl AC_OUTPUT([Makefile]) gperf-3.0.4/doc/gperf.html0000664000000000000000000030640511141312111014051 0ustar rootroot Perfect Hash Function Generator

    User's Guide to gperf 3.0.4

    The GNU Perfect Hash Function Generator

    Edition 3.0.4, 1 February 2009

    Douglas C. Schmidt
    Bruno Haible


    Table of Contents


    Copyright (C) 1989-2009 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

    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 http://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:

    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 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 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, unsigned int 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, unsigned int 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 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 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 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.
    ‘-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 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:

    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:

    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 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
  • 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 1 February 2009 using the texi2html translator version 1.52b.

    gperf-3.0.4/doc/gperf.info0000664000000000000000000027513411141312111014044 0ustar rootrootThis is gperf.info, produced by makeinfo version 4.13 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.0.4. Copyright (C) 1989-2009 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, Prev: (dir), 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:: 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 * 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 (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. 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 `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'.  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 `http://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 * 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, Prev: Description, 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, Prev: Input Format, 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, Prev: 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 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 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, unsigned int 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, unsigned int 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: Output Copyright, 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: Output Copyright, Prev: Binary Strings, Up: Description 3.4 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 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, Prev: Options, 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 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. `-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 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. Several recent enhancements now enable `gperf' to work efficiently on much larger keyword sets (over 15,000 keywords). When processing large keyword sets it helps greatly to have over 8 megs of RAM. * 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 keyword recognition time 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: * %%: 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 hash-function-name: Gperf Declarations. (line 79) * %define initializer-suffix: Gperf Declarations. (line 71) * %define length-table-name: Gperf Declarations. (line 173) * %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 167) * %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 192) * %pic: Gperf Declarations. (line 140) * %readonly-tables: Gperf Declarations. (line 119) * %struct-type: Gperf Declarations. (line 30) * %switch: Gperf Declarations. (line 180) * %{: C Code Inclusion. (line 6) * %}: C Code Inclusion. (line 6) * Array name: Output Details. (line 129) * Bugs: Contributors. (line 6) * Class name: Output Details. (line 41) * 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 14) * hash table: Output Format. (line 6) * in_word_set: Output Format. (line 24) * 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 <1>: Output Details. (line 143) * switch: Output Format. (line 44)  Tag Table: Node: Top1237 Node: Copying3374 Node: Contributors40915 Node: Motivation42108 Node: Search Structures43240 Node: Description46799 Node: Input Format48757 Node: Declarations49902 Node: User-supplied Struct50490 Node: Gperf Declarations52105 Node: C Code Inclusion60897 Node: Keywords61740 Node: Functions63688 Node: Controls for GNU indent64226 Node: Output Format65177 Node: Binary Strings67972 Node: Output Copyright69148 Node: Options70087 Node: Output File70876 Node: Input Details71268 Node: Output Language73107 Node: Output Details74526 Node: Algorithmic Details81793 Node: Verbosity87050 Node: Bugs87761 Node: Projects89357 Node: Bibliography90489 Node: Concept Index92504  End Tag Table gperf-3.0.4/doc/gperf.texi0000664000000000000000000016124311141310646014070 0ustar rootroot\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 1 February 2009 @set EDITION 3.0.4 @set VERSION 3.0.4 @c --------------------- @c remove the black boxes generated in the GPL appendix. @finalout @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-2009 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-2009 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, Copying, (dir), (dir) @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 * 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, Contributors, Top, Top @unnumbered GNU GENERAL PUBLIC LICENSE @include gpl-3.0.texi @node Contributors, Motivation, Copying, Top @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, Search Structures, Contributors, Top @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{http://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, Description, Motivation, Top @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, Options, Search Structures, Top @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 * 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, Output Format, Description, Description @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, Keywords, Input Format, Input Format @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, Gperf Declarations, Declarations, Declarations @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, C Code Inclusion, User-supplied Struct, 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 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 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, , Gperf Declarations, Declarations @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, Functions, Declarations, Input Format @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, Controls for GNU indent, Keywords, Input Format @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, , Functions, Input Format @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, Binary Strings, Input Format, Description @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}, unsigned int @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}, unsigned int @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, Output Copyright, Output Format, Description @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 Output Copyright, , Binary Strings, Description @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 the output is under the same license, with the same copyright holder, as the input that was passed to @code{gperf}. @node Options, Bugs, Description, Top @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, Input Details, Options, Options @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, Output Language, Output File, Options @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, Output Details, Input Details, Options @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 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, Algorithmic Details, Output Language, Options @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 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 -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. @itemx --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, Verbosity, Output Details, Options @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 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, , Algorithmic Details, Options @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, Projects, Options, Top @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. Several recent enhancements now enable @code{gperf} to work efficiently on much larger keyword sets (over 15,000 keywords). When processing large keyword sets it helps greatly to have over 8 megs of RAM. @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 keyword recognition time 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, Bibliography, Bugs, Top @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, Concept Index, Projects, Top @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, , Bibliography, Top @unnumbered Concept Index @printindex cp @iftex @c Table of Contents @contents @end iftex @bye gperf-3.0.4/doc/gperf_toc.html0000664000000000000000000000605711141312111014716 0ustar rootroot Perfect Hash Function Generator - Table of Contents

    User's Guide to gperf 3.0.4

    The GNU Perfect Hash Function Generator

    Edition 3.0.4, 1 February 2009

    Douglas C. Schmidt
    Bruno Haible



    This document was generated on 1 February 2009 using the texi2html translator version 1.52b.

    gperf-3.0.4/doc/texi2html0000775000000000000000000016017011141311245013732 0ustar rootroot#!/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 (defined(@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 (defined(@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.0.4/doc/Makefile.in0000664000000000000000000001075011054057575014147 0ustar rootroot# Makefile for gperf/doc # Copyright (C) 1998, 2000, 2002-2003, 2007 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 TEXI2HTML = perl $(srcdir)/texi2html # Programs used by "make install": INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = $(SHELL) $(srcdir)/../mkinstalldirs #### End of system configuration section. #### SHELL = /bin/sh VPATH = $(srcdir) all : info ps pdf html 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 gperf.html : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi cd $(srcdir) && $(TEXI2HTML) -number -monolithic 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 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 core distclean : clean $(RM) config.status config.log config.cache Makefile maintainer-clean : distclean $(RM) *.info *.dvi *.ps *.pdf *.html force : gperf-3.0.4/doc/gperf.10000664000000000000000000001616311141310646013257 0ustar rootroot.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23. .TH GPERF "1" "February 2009" "GNU gperf 3.0.4" 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 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\-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 1989-1998, 2000-2004, 2006-2007, 2009 Free Software Foundation, Inc. .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .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.0.4/doc/texinfo.tex0000664000000000000000000105530611141307141014267 0ustar rootroot% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2008-04-18.10} % % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008 Free Software Foundation, Inc. % % This texinfo.tex 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 3 of the % License, or (at your option) any later version. % % This texinfo.tex 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 . % % 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 has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or % ftp://tug.org/tex/texinfo.tex % (and all CTAN mirrors, see http://www.ctan.org). % 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 including 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 http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and 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]}% \catcode`+=\active \catcode`\_=\active} \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\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top % 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\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 % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \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 } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % 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} % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % 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\undefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % 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} % For @cropmarks command. % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % 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. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \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, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % 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. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \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 % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\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} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % 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. % \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. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\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 now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \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}} \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 out of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} %% Simple single-character @ commands % @@ prints an @ % Kludge this until the fonts are right (grr). \def\@{{\tt\char64}} % This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. %% Define @` and @' to be the same as ` and ' %% but suppressing ligatures. %\def\`{{`}} %\def\'{{'}} % Used to generate quoted braces. \def\mylbrace {{\tt\char123}} \def\myrbrace {{\tt\char125}} \let\{=\mylbrace \let\}=\myrbrace \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \c \let\dotaccent = \. \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \t \let\ubaraccent = \b \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{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \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{\selectfonts\lllsize A}\vss}}% \kern-.15em \TeX } % 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\*{\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. 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} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% \fi\fi } % @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. % \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 = \pageheight \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\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % 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 % Old definition--didn't work. %\parseargdef\need{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak %\prevdepth=-1000pt %}} \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 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \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'. % \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 \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 } \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\next\centerH \else \let\next\centerV \fi \next{\hfil \ignorespaces#1\unskip \hfil}% } \def\centerH#1{% {% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }% } \def\centerV#1{\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\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} \let\c=\comment % @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 = {}% } % @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 \ character. % FYI, plain.tex uses \\ as a temporary control sequence (why?), but % this is not advertised and we don't care. Texinfo does not % otherwise define @\. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \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 $\finishmath } \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 \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus } } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @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 } % @comma{} is so commas can be inserted into text without messing up % Texinfo's parsing. % \let\comma = , % @refill is a no-op. \let\refill=\relax % 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 (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\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 \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % 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 \undefined, % borrowed from ifpdf.sty. \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \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. % 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). % double active backslashes. % {\catcode`\@=0 \catcode`\\=\active @gdef@activebackslashdouble{% @catcode`@\=@active @let\=@doublebackslash} } % To handle parens, we must adopt a different approach, since parens are % not active characters. hyperref.dtx (which has the same problem as % us) handles it with this amazing macro to replace tokens, with minor % changes for Texinfo. It is included here under the GPL by permission % from the author, Heiko Oberdiek. % % #1 is the tokens to replace. % #2 is the replacement. % #3 is the control sequence with the string. % \def\HyPsdSubst#1#2#3{% \def\HyPsdReplace##1#1##2\END{% ##1% \ifx\\##2\\% \else #2% \HyReturnAfterFi{% \HyPsdReplace##2\END }% \fi }% \xdef#3{\expandafter\HyPsdReplace#3#1\END}% } \long\def\HyReturnAfterFi#1\fi{\fi#1} % #1 is a control sequence in which to do the replacements. \def\backslashparens#1{% \xdef#1{#1}% redefine it as its expansion; the definition is simply % \lastnode when called from \setref -> \pdfmkdest. \HyPsdSubst{(}{\realbackslash(}{#1}% \HyPsdSubst{)}{\realbackslash)}{#1}% } \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 based on pdfcolor.tex. \def\cmykDarkRed{0.28 1 1 0.35} \def\cmykBlack{0 0 0 1} % \def\pdfsetcolor#1{\pdfliteral{#1 k}} % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\cmykBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \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\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .png, .jpg, .pdf (among % others). Let's try in that order. \let\pdfimgext=\empty \begingroup \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \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 \imagewidth \fi \ifdim \wd2 >0pt height \imageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#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 \turnoffactive \activebackslashdouble \makevalueexpandable \def\pdfdestname{#1}% \backslashparens\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\cmykDarkRed} \def\linkcolor{\cmykDarkRed} \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. \def\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else % Doubled backslashes in the name. {\activebackslashdouble \xdef\pdfoutlinedest{#3}% \backslashparens\pdfoutlinedest}% \fi % % Also double the backslashes in the display string. {\activebackslashdouble \xdef\pdfoutlinetext{#1}% \backslashparens\pdfoutlinetext}% % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Thanh's hack / proper braces in bookmarks \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace % % Read toc silently, to get counts of subentries for \pdfoutline. \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. \def\numchapentry##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. % % xx to do this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Right % now, I guess we'll just let the pdf reader have its way. \indexnofonts \setupdatafile \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \ifx\p\space\else\addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \fi \nextsp} \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\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 \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \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{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % 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 ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \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}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Default leading. \newdimen\textleading \textleading = 13.2pt % 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} % \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\undefined \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 % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (currently only OT1, OT1IT and OT1TT are allowed, pass % empty to omit). \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % emacs-page end of cmaps % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\undefined \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. This is 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\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\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 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\authorrm{\secrm} \def\authortt{\sectt} \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\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 @acro 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} % reset the current fonts \textfonts \rm } % end of 11pt text font size definitions % 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\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\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 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\authorrm{\secrm} \def\authortt{\sectt} \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 @acro 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} % reduce space between paragraphs \divide\parskip by 2 % reset the current fonts \textfonts \rm } % end of 10pt text font size definitions % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xword{10} \def\xiword{11} % \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 } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{25pt}} \def\titlefont#1{{\titlefonts\rm #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % 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 % % I wish the USA used A4 paper. % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi % Define these so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % 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} %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic % \smartitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else \ptexslash\fi\fi\fi} \def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} \def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally uses \ttsl. % @var is set to this for defun arguments. \def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitalicx} \let\i=\smartitalic \let\slanted=\smartslanted \let\var=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % @b, explicit bold. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % 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{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } \def\samp#1{`\tclose{#1}'\null} \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}}}} \def\key #1{{\nohyphenation \uppercase{#1}}\null} % The old definition, with no lozenge: %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null } % 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. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active % \global\def\code{\begingroup \catcode\rquoteChar=\active \catcode\lquoteChar=\active \let'\codequoteright \let`\codequoteleft % \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\realdash \let_\realunder \fi \codex } } \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \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{}{}{}}% {\_}% } \def\codex #1{\tclose{#1}\endgroup} % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is undesirable in % some manuals, especially if they don't have long identifiers in % general. @allowcodebreaks provides a way to control this. % \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'}% \fi\fi } % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. % @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 option `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct.' \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\look}}\fi \else{\tclose{\kbdfont\look}}\fi} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % @uref (abbreviation for `urlref') 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. Perhaps eventually put in % a hypertex \special here. % \def\uref#1{\douref #1,,,\finish} \def\douref#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % @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} \ifpdf \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 % 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. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % 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} \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @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{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @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 } % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\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 } % Hacks for glyphs from the EC fonts similar to \euro. We don't % use \let for the aliases, because sometimes we redefine the original % macro, and the alias should reflect the redefinition. \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\ecfont{% % We can't distinguish serif/sanserif 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}% \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\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{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % 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\undefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \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 % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % 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 \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines \let\tt=\authortt} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rm #1} % 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 {\authorfont \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\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \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}}} \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}}} \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\pageheight 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 \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\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. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\HEADINGSoff{% \global\evenheadline={\hfil} \global\evenfootline={\hfil} \global\oddheadline={\hfil} \global\oddfootline={\hfil}} \HEADINGSoff % When we turn headings on, set the page number to 1. % 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\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \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\undefined \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 \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 \def\itemcontents{#1}% % @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}% \vadjust{\penalty 1200}}% not good to break after first line of item. \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 } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % 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 } % multitable-only commands. % % @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. Note that \everycr resets \everytab. \def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we encounter the problem it was intended to solve again. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \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 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \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 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi %% Test to see if parskip is larger than space between lines of %% table. If not, do nothing. %% If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @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{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\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \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-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \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 } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the 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 ifclear reads 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}} % @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 {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \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{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @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{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \undefined % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname\donesynindex#2\endcsname = 1 \fi % 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 \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these in case \tex is in effect and \{ is a \delimiter again. % But can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. \let\{ = \mylbrace \let\} = \myrbrace % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \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. % % For control letters, we have \definedummyletter, which omits the % space. % % 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). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\L \definedummyword\OE \definedummyword\O \definedummyword\aa \definedummyword\ae \definedummyword\l \definedummyword\oe \definedummyword\o \definedummyword\ss \definedummyword\exclamdown \definedummyword\questiondown \definedummyword\ordf \definedummyword\ordm % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\expansion \definedummyword\minus \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sc \definedummyword\t % % Commands that take arguments. \definedummyword\acronym \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \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{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % Hopefully, all control words can become @asis. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% % how to handle braces? \def\_{\normalunderscore}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\aa{aa}% \def\ae{ae}% \def\l{l}% \def\oe{oe}% \def\o{o}% \def\ss{ss}% \def\exclamdown{!}% \def\questiondown{?}% \def\ordf{a}% \def\ordm{o}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\registeredsymbol{R}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\expansion{==>}% \def\minus{-}% \def\pounds{pounds}% \def\point{.}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\result{=>}% \def\textdegree{degrees}% % % 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. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % 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. % \macrolist } \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % 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{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % 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} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each 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} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % 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 if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \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 \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 \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\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 .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \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. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % 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 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \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, \doublecolumhsize, 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 % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \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\pagewidth{\box0\hfil\box2}% } % % All done 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 \pageheight (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. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \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 (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % \unnumberedno is an oxymoron, of course. 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} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achive this, remember the "biggest" unnum. sec. we are currently in: \chardef\unmlevel = \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 < \unmlevel \chardef\unmlevel = \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 > \unmlevel \def\headtype{U}% \else \chardef\unmlevel = 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 % \message{\putwordChapter\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 apphead0 calls appendixzzz \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % \def\appendixnum{\putwordAppendix\space \appendixletter}% \message{\appendixnum}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } \outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \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{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \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}% } \outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. \outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } \outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \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 % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \bigskip \par\penalty 200\relax \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} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % 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 \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% \hbox to 0pt{}% \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% \gdef\noexpand\thischapter{\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% \gdef\noexpand\thischapter{\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \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=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rm % % Have to define \lastsection 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\lastsection{#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{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \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 } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rm #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % 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} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% % Switch to the right set of fonts. \csname #2fonts\endcsname \rm % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\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\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % 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. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#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 \raggedright \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.) \vskip-\parskip % % This is purely so the last item on the list is a known \penalty > % 10000. This is so \startdefun can avoid allowing breakpoints after % section headings. Otherwise, it would insert a valid breakpoint between: % % @section sec-whatever % @deffn def-whatever \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'. \ifpdf \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 } \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. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \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. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % 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 \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \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. \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 \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % 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. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % 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. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % 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{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#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 and #2 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{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @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 % {\tentt \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 error\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} % @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 tex @ character. \envdef\tex{% \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 \escapechar=`\\ % \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\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % 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 % 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 }} \let\afterenvbreak = \aboveenvbreak % \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. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \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 \envdef\cartouche{% \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*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of \def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % 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 \parindent = 0pt \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 } % 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 % \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 by one command: \def\makedispenv #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 synonyms: \def\maketwodispenvs #1#2#3{ \makedispenv{#1}{#3} \makedispenv{#2}{#3} } % @lisp: indented, narrowed, typewriter font; @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvs {lisp}{example}{% \nonfillstart \tt\quoteexpand \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenv {display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenv{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 \gobble } \let\Eflushright = \afterenvbreak % @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. % \envdef\quotation{% {\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 \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\undefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } % 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 } % 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\"% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % [Knuth] pp. 380,381,391 % Disable Spanish ligatures ?` and !` of \tt font \begingroup \catcode`\`=\active\gdef`{\relax\lq} \endgroup % % 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 % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \catcode`\`=\active \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 % \def\starttabbox{\setbox0=\hbox\bgroup} % Allow an option to not replace quotes with a regular directed right % quote/apostrophe (char 0x27), but instead use the undirected quote % from cmtt (char 0x0d). The undirected quote is ugly, so don't make it % the default, but it works for pasting with more pdf viewers (at least % evince), the lilypond developers report. xpdf does work with the % regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax `% \else \char'22 \fi \else \char'22 \fi } % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen0=\wd0 % the width so far, or since the previous tab \divide\dimen0 by\tabw \multiply\dimen0 by\tabw % compute previous multiple of \tabw \advance\dimen0 by\tabw % advance to next multiple of \tabw \wd0=\dimen0 \box0 \starttabbox }% } \catcode`\'=\active \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}% % \catcode`\`=\active \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}% % \gdef\quoteexpand{\rquoteexpand \lquoteexpand}% \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart % Easiest (and conventionally used) font for verbatim \tt \def\par{\leavevmode\egroup\box0\endgraf}% \catcode`\`=\active \tabexpand \quoteexpand % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % 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{#2\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. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \input #1 \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 very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\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 minor 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 } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, 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 % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % 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} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } %%% Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } %%% Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#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 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } %%% Type: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#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}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, 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\defname#1#2#3{% % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % How we'll format the type 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. % 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 % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % (plain.tex says that \dimen1 should be used only as global.) \parshape 2 0in \dimen0 \defargsindent \dimen2 % % Put the type name to 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 {% % 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}% return value type \ifx\temp\empty\else \tclose{\temp} \fi #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. Let's try @var for that. \let\var=\ttslanted #1% \sl\hyphenchar\font=45 } % 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 \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \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\undefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{% \begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % ... and \example \spaceisspace % % Append \endinput to make sure that TeX does not see the ending newline. % I've verified that it is necessary both for e-TeX and for ordinary TeX % --kasal, 29nov03 \scantokens{#1\endinput}% \endgroup } \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\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\definedummyword#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} } % 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 \. % 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{% \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% \scanctxt \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\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% \else \expandafter\parsemargdef \argl;% \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 \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\definedummyword\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\definedummyword \noexpand#1% \fi } % This makes use of the obscure 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. \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}} % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.blah for each blah % in the params list, to be ##N where N is the position in that list. % That gets used by \mbodybackslash (above). % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. \def\parsemargdef#1;{\paramno=0\def\paramlist{}% \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} \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}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% % This defines the macro itself. There are six cases: recursive and % nonrecursive macros of zero, one, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \fi \fi} \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg) \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Just 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}} \let\nwnode=\node \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 } % @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 \lastsection, % 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 {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout }% \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#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces \def\printedmanual{\ignorespaces #5}% \def\printedrefname{\ignorespaces #3}% \setbox1=\hbox{\printedmanual\unskip}% \setbox0=\hbox{\printedrefname\unskip}% \ifdim \wd0 = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax % Use the node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Use the actual chapter/section title appear inside % the square brackets. Use the real section title if we have it. \ifdim \wd1 > 0pt % It is in another manual, so we don't have it. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We 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 % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. \getfilename{#4}% % % See comments at \activebackslashdouble. {\activebackslashdouble \xdef\pdfxrefdest{#1}% \backslashparens\pdfxrefdest}% % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd0 = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % if the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd1 > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox0 and \unhbox1 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 \wd1 > 0pt \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% \else % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via a macro so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi \fi \endlink \endgroup} % 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]} % 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 } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \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 \message{\linenumber Undefined cross reference `#1'.}% \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 #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % 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 } % 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 % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ 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{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \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 % 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=\pagewidth \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 \futurelet\next\fo@t } }%end \catcode `\@=11 % 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 ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\undefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % 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 this 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 % If the image is by itself, center it. \ifvmode \imagevmodetrue \nobreak\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. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. On the other hand, if % it's at the top level, we don't want the normal paragraph indentation. \noindent % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \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}% \fi % \ifimagevmode \medskip \fi % space after the standalone image \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 \lastsection 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\lastsection{\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. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \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\scanargctxt\defcaption} \def\defcaption#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 % \lastsection 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,} % @documentlanguage is usually given very early, just after % @setfilename. If done too late, it may not override everything % properly. Single argument is the language (de) or locale (de_DE) % abbreviation. It would be nice if we could set up a hyphenation file. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \input txi-#1.tex \fi \closein 1 \endgroup \endgroup} } % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \def\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \input txi-#1.tex \fi \closein 1 } % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? In the current directory should work if nowhere else does.} % 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. % \parseargdef\documentencoding{% % 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 \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{~} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{~} \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}} \gdef^^b2{\missingcharmsg{OGONEK}} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'\i} \gdef^^ee{\^\i} \gdef^^ef{\v d} % \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % 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 } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \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{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \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{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{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{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{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{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \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{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{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{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{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{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} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \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 so finicky about underfull hboxes, either. \hbadness = 2000 % 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 \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \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 \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 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % 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 \hfuzz = 1pt \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}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \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 }} % @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 \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \catcode`\$=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} \def\normaldollar{$}%$ font-lock fix % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. 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, we can check that font parameter. % \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} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % 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~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % 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 \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active @def@normalbackslash{{@tt@backslashcurfont}} % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % @def@normalturnoffactive{% @let\=@normalbackslash @let"=@normaldoublequote @let~=@normaltilde @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let<=@normalless @let>=@normalgreater @let+=@normalplus @let$=@normaldollar %$ font-lock fix @unsepspaces } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These look ok in all fonts, so just make them not special. @catcode`@& = @other @catcode`@# = @other @catcode`@% = @other @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore gperf-3.0.4/doc/gperf.ps0000664000000000000000000132533311141312111013531 0ustar rootroot%!PS-Adobe-2.0 %%Creator: dvips(k) 5.96.1 Copyright 2007 Radical Eye Software %%Title: ./gperf.dvi %%CreationDate: Sun Feb 1 12:20:28 2009 %%Pages: 37 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%DocumentFonts: CMBX12 CMTT12 CMR10 CMSY10 CMTT10 CMSLTT10 CMTT9 CMSL10 %%+ CMTI10 CMSS10 CMB10 CMR9 CMMI9 CMMI12 CMMI10 %%DocumentPaperSizes: a4 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -D600 -o gperf.ps ./gperf.dvi %DVIPSParameters: dpi=600 %DVIPSSource: TeX output 2009.02.01:1220 %%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 /p{show}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.1: CMMI10 1.100 %%CreationDate: 1996 Jul 23 07:53:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def /FontBBox{-32 -250 1048 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E 6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF 8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE 03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 9560176676ABB71BBD0EE56B4CC492C0652750227CEC6CBEEE374709231B00CD 0DE83AFDE295B314F6C8B1FFD32251C1925D96A64D739FF1DA4926460B28B3DE E949AA0BA3DDB16534FBA30C32092D5F712B5E8C8D5142F35AF2906E6C219D2C 7FD9A368C193E0EB9C7E25FF03C546B6ED993F964CEDB1B8537C617170787F37 88D6F2AD02384B01067FE3F98257BAB958BB3BCD1001090A4502DA0638080EC6 DB784CC8AC37CDC01B29BC481D6A05ADC6188785262358C1BF1D694BBF31C1F1 AF117C1ACED44AAC6EB4B9A2511A6762DDE8FCCBA5 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI12 %!PS-AdobeFont-1.1: CMMI12 1.100 %%CreationDate: 1996 Jul 27 08:57:55 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def /FontBBox{-30 -250 1026 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC 4391C9DF440285B8FC159D0E98D4258FC57892DCC57F7903449E07914FBE9E67 3C15C2153C061EB541F66C11E7EE77D5D77C0B11E1AC55101DA976CCACAB6993 EED1406FBB7FF30EAC9E90B90B2AF4EC7C273CA32F11A5C1426FF641B4A2FB2F 4E68635C93DB835737567FAF8471CBC05078DCD4E40E25A2F4E5AF46C234CF59 2A1CE8F39E1BA1B2A594355637E474167EAD4D97D51AF0A899B44387E1FD933A 323AFDA6BA740534A510B4705C0A15647AFBF3E53A82BF320DD96753639BE49C 2F79A1988863EF977B800C9DB5B42039C23EB86953713F730E03EA22FF7BB2C1 D97D33FD77B1BDCC2A60B12CF7805CFC90C5B914C0F30A673DF9587F93E47CEA 5932DD1930560C4F0D97547BCD805D6D854455B13A4D7382A22F562D7C55041F 0FD294BDAA1834820F894265A667E5C97D95FF152531EF97258F56374502865D A1E7C0C5FB7C6FB7D3C43FEB3431095A59FBF6F61CEC6D6DEE09F4EB0FD70D77 2A8B0A4984C6120293F6B947944BE23259F6EB64303D627353163B6505FC8A60 00681F7A3968B6CBB49E0420A691258F5E7B07B417157803FCBE9B9FB1F80FD8 CA0DA1186446DD565542BCCC7D339A1EB34C7F49246E8D72E987EB477C6DB757 99AF86CEBCD7605C487A00CD2CD093098182DC57B20D78ECE0BECF3A0BF88EBA C866DB19F34BBBED6634AFC0F08D2AFB2A92578A6F8B4ADCD6594737FF6EED7D 5B536DA9E3E2CADB40DB7C600EA4D100D33C3B92B1CF857E012C4EB370BA8295 55B50047CC8911C98FE1A7BA6CDEA82D34476286E710776823690AD333DD3A49 335002F4680DBE1C21174BF016B0DF799B01EB9D6988479A8334BBA2F8DC7146 BC0DAE9DE3A6453B181808E68A89E0C02DAC6264D002B422EBC1CF14F65D9888 15EE6D514D3457F7F3C6A3D17EE1DA076F73ECC392D349174DA9E4680F29CE10 0157E42CA35F5DBFF56BFC3AA07E61A78DBE882C5AB388220C19750D3643E7C8 23D6673027CE568A4ACCE1D12B1D9E5A43507F4AF9BC873237F65A6B95078DD2 378007CF0F0DE7CCEF760E19D6D1D7B412EC5D4972 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI9 %!PS-AdobeFont-1.1: CMMI9 1.100 %%CreationDate: 1996 Jul 23 07:53:55 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI9 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def /FontBBox{-29 -250 1075 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E394A533A081C36D6F5CA5FED4F9AC9ADE41E04F9FC52E758C9F45A92BED935 86F9CFDB57732045913A6422AD4206418610C81D882EE493DE9523CC1BFE1505 DD1390B19BC1947A01B93BC668BE9B2A0E69A968554239B88C00AF9FBDF09CCD 67D3B2094C11A04762FE8CC1E91D020A28B3C122D24BEAACF82313F4604F2FEF 6E176D730A879BE45DD0D4996EF0247AEB1CA0AB08FF374D99F06D47B36F9554 FAD9A2D3CE451B7791C3709D8A1DDDEFBD840C1B42AB824D5A0DFF0E0F15B0B7 22AEEB877FF489581DA6FA8DA64944555101EB16F7AB0B717E148B7B98D8DBFD 730C52937E226545CF8DC3E07C5BA30739BAFCD0F2B44275A6D503F582C0FB4F 449963D0AD2FAFDE33BA3D77BCA9D1DF878DDAFCA2E22CC4BACD542B282164C7 97C2BDE318AF9D501CA21F6E662E7AAB75A5F24D2C182E598D175D44E88AB19A E7CD59584F95B389183EE21B525BF52A3F23C0FE5383A5565A19361D716F508C AAB78411CA5A4D27552CC1C435760D5A89D535B71C593E755C616661363308DA A683F54ED0C23FB2C225A008392B0B719F66F11A946A090B7C00B662A3C69599 B4ECB0CC70C85C4BBBF207E0026F6C7A19F2ACFB7A60804FC98A4BFFD7BFFF2B 9529E6D9D4238002BBC255BC62959D6F3381FE06E0621B879D5FE5B541D45A1E 759A6E7DC32B1D1632368D09A97039DF255B6492B1B2B7E2C1434E8306ECA7D3 5A79B6D614B4979F10988BC76ED53A5F45315CD7DA216221F842FD0F3E050DD2 BAC23C984D506D8F7D614BCB6B244F5F41321549BB0BD041FBF3053307168680 3435E9C9445A59A7C666418C4F2512C32058B1CE1EA46C7839C6E372F6CC60AE 2CF46DD2F130B532DE8ECD42D9204500E413799E298CF6426F28D23BB7216BEA 1A618B3ECC61B44DDEF0BB22D640B47C09AC0DF378CE68FC9CD88BDAE9ED89CB 431A5CF9C3E9528FEE7A9936C2B1CF7B38DD2B95773F0EA0051607BE1B0B3588 A8B907A5EF011B4622C5093A7B107DD1EED6FEE9536DECF1CC96E65373D0F433 30AE3C094654ABF4698C07F8C74E71D023DFD242EE83B1306786124DD8C6BFA7 801E66CB944BE7EBCB3FE803EC97067AF7AFC8A4E9AC9D11 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR9 %!PS-AdobeFont-1.1: CMR9 1.0 %%CreationDate: 1991 Aug 20 16:39:59 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR9 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for 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 121 /y put dup 122 /z put readonly def /FontBBox{-39 -250 1036 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835 3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203 046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2 A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D 731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B 09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1 49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B 5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B 54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F 11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AD14F1CBE935942AEC D4004E6BEF379066FD72209DC88D2E634E79BCC2B98C766CBD92C561F2703F8A 109E6C6CEC7B866F2FC7ADF646BF492E520319F3B949AB5D84AE990B33344A40 3971F58DFDF8D8D67FA0B8F2A0D884F8C09A5A721319B911DBA0A35903877343 C37BC36C5EB32353272D1E6ED5FCA611BE319A7E1E842CB7576E7A66D8E9C810 49CCC0D35AE00D3669EC7D8ED957EEB2105BDCF7408E0B04A325495D38BCE845 E96329244411EAAC14D3ABDD2BECAD7D391ADFFE3F7565B14FD29737EAAED3C0 7F3981DDBE07D4AC09F6C1A32369BB88852CCE980C1E950E27EF3CF8A840B393 9792FC1A510BCB4A2976BB640EE4510EA2BA3C7B5FE02F5F0F845B6B00F617FD EB4655CED34B0097F22329071DE7738CA994BD0F983C5C4599AB9161F3776023 9AB724F231D9C38A76FC8F6A2DD4E6C9FD2B8061CDC814442CC69E94D437AC78 B2DB204A99A3240E1123E0568F6EDFE11586FD1056FD547B7CC477D8D32796D8 A37A1D4F89A6371F302C421EB4279D560D645BE186DC504CA606DE1EBCE98358 0B8C800A25D76755E1006164AED015712653A9EF8DB0B980E8A2E6D30E9CA40B 433989DAF8A217D2A70E1F2C2B994615FB279E30AAF8B978895F1CADD9259DFE 03DBC2D65ABBC25560ECAD7F743FCCBDA16EB8AEEDD091BF1DF8339DF57DCDF6 7CF63057040C0FD028EDE603C19448D1CA4AE12B15DCA284FB786B144A2D7E8A 82ED6CC0CC8A43E5CBB660231928EAD80834F2F58311DB3FAC75D071A496C3D6 24AEEB63CA0697CABD7A59C526C125E26701094960851D4EEC73E4D03E2A3B63 0518DE30A8D56C4CE6C892A4CD61371739DED0C95474D1DEDDDA5C83480C8023 B3CC77CA3D2DAB88A020873D02EF2B242555140A908FD857F37F704FCE3A45E9 E2D02C68F689F4692664CB4C60225D7D19A2A3D88A7F2CEA66BFE06F3D9CF622 676E384A983406A25F80588F1BEA3CE41AED345303458308C476FDA857E053C9 E17D561BCA03FB7C35D8134C01E2209F2A9B8D25529DE43CB6EF0AC872C99C79 CB7D9144577C4F939B4B2D8F93543543A4161B8209D38CF073963A78A305D9AC 7A9F3BC2350D3455BE94CADFC7F4BC01EFE76BCA10F3F35930BEBADED4F650A6 71452586A3C29A644F2F25BDE14053F5CBFBE26454589967297FB9791D108832 3585A2F66A42E75B3DD5B1536E457F5DC3EAF69C3C5E8ACF4F32BB5118F503D7 8D328212074424E6B2E83BD26E73B0FFE3957D5CE744067A12229451A17082E8 E7AA765FCE539C3CB34D5185F381894C074AC30E906773F2FF25689E488309E5 28B3121DBB2466B3A07DD8119635F5AA790DD87A29F1E0184F9B811DBFD9988C 5E7C698AADBA838F81D63F61022D8F28FD942AC95C59AE5C710A6D1EB4913078 6215204C63019448ECEFFFF812B33014B6BC5FB22F4DCA7817CB0E21747E574C B98762D02F302896B17FF8AF44E95832C7C08DFBEC1B1F33E16704FD27EBEACC 591A81AF3AF9E0668EA64088ECBC4317136D895BD030F8C5A3C4218AECD86388 FE4775E057EDE6251F771EA5F125E6026697B0741729BF8DE0B542AD32B562B8 7F61E71460AA96E414FD4ABD7D23D4C7ECB122E7DEC30400BFE0E7C19990506B F27B5F316BA18F35C7AF31422718B22FC86E9310737D2A638E02149A3758C681 700987E99FD05EEA921AC6E6E5C785FCFEAC82FCD9D5FB2CD3699D8B1C81D11C 5EC87314EF4E837D6548554C11D3D21E847405E7FF2CEA029E48046168B3E08E 2CEE460980CFDF59491A35F10D15A68E6D06CDD3BC51037F68C0502EBD64393A 89157994982EE9EA6926C64EF5023A0FA334D2414C2839B12D12E03EA51AD687 3F9E7BD9D355AF773648FFDFF6E21E944CD26C6B8B0592B1A925F8C0605A6E45 DE3E637307EFF7027A98136B6F93B0C9088743DD8DBE1CFA3F87F06A8434FFA7 4D9468EEED7FEB9F4DF36AA6E872F3FDDC253AD795EAEB294BEEDF6EEE1EBF96 4571274E142A5BBA3E68EC6857444B708761CC7B4ED0FF7410AB69F93DE6B46E 8EA7D1CCAF79EBD23CA34879E0865F6D1CA61D6FA3A1E0B37F19EF5FEEAAD250 052B463532465EDE2C010E58E4C56D3C3871128400DFD07B9AE06CE5CE56D333 85A22A76BA0BD255D47FF4C9A8528338E08B9E37A22230563C22B57D732C40CB A8596ACECA557E3D8F9C842B47BD89ABEAF9A0FBF45399B902AAAFAAE45C13D2 7673A789D91398C3365C9F42D060C49459F9C0F8119BDFCC6B712323701C1B3B 90E59BAB047F1A2A3C2028AA427E39ACC5BEC9FFBD9AF2EF4977069E9D12E18F 2DF8AB7CDE5B40232CA3D1A65AB7C995A4BE80B2575372C757C38E3A6B014DD3 743CA81177817AA76C527DC9B4AD429DC20558C5E1D195547B1A86EA47B8363D B6BAF78AC5FCC2A345768ADF8E1D4473199B5BE29FED3561B249A48CB2D1D295 3628EF6305ADCEF41706DC434EABAFC3286A5C538F61DF8AB76778A5EDC39BD6 F33DC9E580152F032ECAC7D3000B97E9C0B4637486CD11D2BF47B5DF8844319A AFC9E4B0000EB1EC745CEDC6D052D772B5325B656C1DC7D27F7EB0586094EEAC AF339B7E2B056126C9796F68659650D0BDC4C456931DE0CC79560771D6374EBD 8C8DE881E78D31F1F5CCB1597602D07793EFE2F1B991C8FD05F35CE2168CC1C9 9815DB43C9E19662B27AA40B7F2ECDB5FA6EFF7C1C4AEE23230BF80C352FE320 1D8F3E59158E52A32EBD691FD5BC0D1D5370F90A0743F8E5BCD1485372F001F2 2DDEE60AD113AA36D9A2C830098E669838958588AFBBE457D008A089E7A1DC17 8ECC91F8509FB5A0B7935928EE72086B5BF92C10F195B1183DD282E2F31AE6DB 4B660B0224C907BEF3CD0A45C9B1C92F3915608015C9D4178DE9A1AF2621A214 E3975C1E95C5F7315D1E91CF055B43141583650EBB8D570D8E88A545899980DB E07C092978AE0A295E80F888220DC5EFE60BCB534B4CAA13D56892A18DA6784A 456386E6B5FDE92E0880FBA74BCDE958BC6F1664156288F136DA69DF84AE6E6B F04C336D08643F64F579C8865C8100DE1139AA75B0FF349ECB193CD40FA60319 B24B825C9DE6CCF7BAC2D722B93D386D19170D71F81FDC33AC8CEABB5125E50F 0151E113EAFEA48C1C05C113952BE0ABC5B2A3908192397FC56A1F4090751BAB D409CA4AC0091866D114B9FF10AC90B6916ED111EC224F294BDF8CCCDC3E9336 B8CB13A695887B8A893BBA7562E054E7BC2C4AA4CBB96542B0137F091B7578C6 73B34C5149D939F8590ACE8CC083F63F8F239175513255CB4697E7E7ED584401 A2FFF58723043A7F046FC9EC4C70E835FE80B07D4EC11FB14D16793597A09BF3 292A8367AE4A8A279CB92FCD2EEC083A75195178CAA4A1D93D67A2C6A98D408D A7C145F5FE4C6C7CF2A4CFAFC02DDD631B745B13FEA4A5710B4F0D7E992D18DD A5BDE04158D7EC4DB9DCE3E24558FD74C2599E4EF16DA1C33991C7D27FC1BB78 4E9865C28A75075C4609D08EDCD4DEC28522043E510F637944C3BB8AA67C2CC6 9E3FD5B528A6744F4E0DF4D924809D1FD627F4B6031D85E13E3B07C7D710A0EC 86BB8269797E745D7A7458F7D15D1810616EE9699BCA0D366FE106D60BE84D24 DFE7AC0FC125A70D7FB057551E737C5675D165E3DBCEC1E053987D078AEF7839 2F73428EA2F6302B6313E162DC81D93FE0E981F859DFA4CAD80A78515BCD48F5 708D332B4A621D8848561893987729CEDC45EF4022E1D2A6A6BD1048201D28F0 AED64DE459AC4CE272B170103D02AC44E3646396B251CB5D70A418DAC1E1663F 890F510F215C03092C96639523566C20957E98EE44BEBEEF04D7E9FD33D8356C 468579E018AB336E18EACD06ED8273F67475F6A5C732D75F52703D019F40D53E 2B26C34D5C91269F987268BD26A0AE63325228771650091F9D1D8E15A4210255 C38B54E8EDCD23FE74D1B92108892192B274B7181F2B214310E37DC5557450F0 B6020D9375A4E11BA6C4F476B214CEA60741454170AC24F1DAF8C45D07D81E16 E5229C27886C32BF404B151602A53AFE13485BA120940C9BC32C87C3125D6B60 60136D024377C404D34D5F245EB14304C78BFC2C2E4769250DFA386A171395D2 FCA9752197E38E568F5FFB81DF03299864ED405068792837A14D23E4DAEDB8C9 90EECDC45C21B5273F120F1E2F8960E62FECA7903A9AA3DEBC031A5D3FCDB717 2C7B9F627D7B76F47AE0905810B0EF86503EE4D747EEDF560B3BCFE17822D496 C77A335466E6C7CA4C5FDDA4523BA7B2AC8D438C554B9378977D64FBD56FCCD9 73ABBE4CD4FB36D7CED8F6A0D15B0D1C15311E5D77694AFCB14409189DD5E386 4026AB274BA33F6032E4937B1D345BD4FAD3C2BF0904E5A246E9EBBBF1FFB7BA 789726B9D7F39D64A29817C40C9515551E19775E50F3F4BD1EC47E2D8FDF830F 54CC5C4371CC30B0856C00DAB9B1ECEBC0AB17BADAF8E2E2EDEA95EE74938E09 B3CF241B9E09C0DA8E0AC696F4C98A2EFCC526F1C75E637B8A31CF9A8BF52280 91A5543D6DFBDF49AFAA51CC6C7B50F6DD1958121EDB2A0C653C3A32F08696D8 93A61A7969C35E6127BD7A2FA1055014A10286DEB8422C9ADB8765A11082C7C8 DE96F0092F3637466C053BA316379B3CBF21D84A7B01D174DC5BE1415BFEA654 2E693BFD946BD7569733B0FBB2C5D247735A48A7C841BEDC92CF8A799C07A478 E7E398817A355F875789A28715AE0C95B58DB0F1F27572D16AC7BA72F98E5895 68848616B25441D0E1269033AAC8A6C997B124AEF387D72F0F1BFFEB5D3F345D F6A5DD7FCA0CF5AF676C62F6174340AF7DA870B6D406359A7B294A818442472C 799EAE9D7D9C388F2A302459D30DA7D5470F8CCEDF9486B4F387C5F50DB4E409 C74A09BAF62217004C0DBB83E3E73E169BF945253F42DEA5F568E28463DF7328 9FF0CAB049BF700902B78AE3ACDABA17BA4B0DC6D547FFF45818D34B7EC699DD 290A420A9DB5567E5109FE8646CC874E057EB18AB1B298A5F67012C0D297F76F 26FFEFF0F02CF4D7E2E8A25E1D99E5207EC9C9BBA6AE7E6D198AF2ADCDC536D1 A784B82ADB0278740BBFEC9A8634AB35DE798A23699048CDD5058F0BA64E0D4F 906D8869054D22948931BDB65F4454567DA31B3B5E60C8201CBBD7F05339BCE3 999E22049BFD2660F750778FEE6D5294FA04D74B7AD092173C7EA8D77C44F6CE F37D47B42CCD6623EF57806EB9D752C098FE656395A77B5DB10B910979B7ED1A CA360887161F01EFE8DA8B7F6E6F08139977AF1959F6525A73D019714F5ED0E1 9349D5B3EC3A26FD8D7C3AEA1A6747003C24C5E23551816CE52EE19EB2EEB486 28DF30EC3988A852F002B1ECD24DD29F1B49D6F3223270AFBC25800DB1693656 203F52D11179DE90012149A324DE96E6096B6FF7D15BF3E5DC51D4E8B321E232 77E14621B21A103322A4ACFA7C4B76CFCE1F631B94AFFA67EB0C2BE1AF4D91F5 B9DAB5DBB40C79B54FE2C63D5DE4C59E92E7C976BC6A085E81A3C63C9CE9DF55 8D54219F1362EEBC67839B4293C2467827A9FE0B34353C4857D75EC231AD9ED8 659F3B608F3C8FEB8F94C5FC60D6F9E05752FBAD0DD4F6BC6AAE8462FA9F2F4B F6CBC08120BE84C15BB337D33B20D6BFBE8093C08DFB59CBC2CE586B6216A81F A34605C0657706309FA7D20B11E97AF4120F7DC50947CB8A11F9294CCEEBFA48 FABA56438EF8BA3E09CC74AB561CB299E444A3546E8F230FCA5CDD3420B65D0E 39770B4AB697A0238C51EB51083C4650E7546F5E7B6FEE147546E4D679EFF14A A19622DD442741D296B470B9AD458E50EF4F8D3024B7ED91E65619EFD0A09621 83B4F482AC70945077C1C7543B76BBA4D4D131D3FF755DCB3839FCEA0FD950B7 394E68521F744344B2348EA92BCF46A232EA96D1F3374818E66D9CE066F30CD1 BD1F455F36FA1DF4D09D9A81A330B2037BA5DA8B3D511876B1C37BA3790B5C1E D29072290C558FBF170CB6296E052313801BD9F45ED2226D11A46640A10D4F9D 8F2ADB5AA691CC3BFEAB8E0A658F03C42902DEA8244EB9F6DCABFF415E7DF538 60562788DD8017210DE0F830BF6E6082A6381AFAE03A7DAEE1A15D0BF16321F7 ECA7EF7ABA8813FF7DBA12B78034C64DAA2BE22A5905D8C27C1B705C9FAE55F6 D9599694E3688E6A2EAE40F585BC5568EB3BE264CE97DD016BC1C763B6C11638 70C159E839EDA20BA075D84762C9CE8232A32A6888A0ECCE7459309000735CE2 A4646D8E947A0ED36EE490BC472EED575D05D4882A0A104205D2CABDFDD77134 71ED6C39A01FB5FE23D3DE562BA399DC34F869FA8DFF1C781FDFE1B5E1C9E467 6333B433FA29679252D93DF71977CDBA50424F3E97D84CFB7F555A80B0705B2B 4C0ECB9747597A32D198552D7705EF4263818BF6FE9F4B2D7AE1A6BECDA40945 C7AB6E19BB324B2EBB38D003F49B01598111BADF7A03F4F006F1604072BF72F3 C2636D8CAA5D98EC25F7D9B3E0E3C99F4A79BE1F144BB11C7D8BA4E5726CEBF3 EEE5B37D234FBA35917D724BE0B4FF9E8C85DD923A486364FD44CF2259F0313F 8BE916E7370DFE34CC3CC6AD44460CAF739E24E5308FA568FBC08552B643EB18 D86EA125D4EE98AAAD884D2BAB1D5264D45346F81556FF310D5DA1BB667914C4 6272DFE61BF3BFA30341A21A6AF4681C4099CEBD51FBCB3C43F2E74AE7E262F0 38682D6C78B016A997E4FEF8959B05ABEEE29E00BD3F86DD98FA3210E1691080 374666B5A45BAB3A3C8E231DD5DA433CD5C1D5DC95378C9C6EB6AD10801C27A3 76A1EEE11A9D1E086DEADFECE2C039DA804BF4C647381F0A0F7FFA9B70568710 183B0436EA4AB0ED9A68D829C1DC77292512DA2711920831E96FF2D7DEDF7CF7 9E075702E1D9155ECE859AD5C28A10C3F1A5576ABB2196E562B588EA9681B9DF 378AFC9F47AC346E10ADE9508FCF5F208AB4063151349CAC48C6B1B1AA77AB24 358E29488FAE43C44CD4393453E1733925FC34E4A32B26E23AF0F9A73DA7C373 B1FFBF09D893E83B08675B4D2A05FD34999973796EE078DB227354822E55E3E9 7DA31FDA41AD4693B9219268DF50B81A75713A8D8202574E6141C27C56A2ABDF AE040853FED550A96B86A1BF802597A987D15AFECC5DB29D13DBC0DB83605B5C F4DCDCBC7FCA89FE7573491D94FDC06607DD8E3AFB4F37816B755131DA7A5F91 20AD2409A7BF06ABF0185A8ADF5570D85615113105C9F2DCECD48E5DC5E63D7A B22275DD560B3F908C6800CEB8FE2CC90D7D0A474F5BA7F5547C570095AB1DF2 CF2CF8C0198B4DB8F63056BF3B22850DDC5AE22C06236DE26CAB01FBFB817060 CB3A0FA3F266571910D117A3203D28A18117B91244DD3AE911461FD73C9F78CB C9BF436DB0B6A7B99F4D2574B397AF876BAE65B337BF7D882279BB1F61D71E11 3B2A773945AFA21E13C9F80D91656A01B1EE0E1BDB739C215BC2203D7AD28456 4FB7ACDE59ABB24DC49E9799ADD8F7B092002ECD40A9DB0C46CA4B74AA21BBAA 4C715DB3CADDA99F79A7CA1149F2D24FFB8705C60EE84F258F023412DC042F00 9893E3C2F10AFFFF9FC08143564FB7E99C885589F3A9BB4DBB2D3207F2C715C8 E3147793DB25BDCC2CED771A606CDE35B95B261AAB560BD6A6D7380CD09EF766 F069EC63E0C98AE637A8C3A6E3021F0488DE5D6D97971D82EBB3DD9FFDD4457E FE1C9C9BF09602500EE7C45767A1E8126586045CDD11A397448961DD348A55E3 5FF7BD0B3D1DF585577B9115BBEF9510E64F47F2B6847F04E117FB59AE43C512 7EAC910998069FD61EC937DD2F58E4EE2F5B24A79623E8AA5C515DA73F6436BE 4E94772B0053E8C565961E9D767C506339867BBB18CB833FF42A8703D676FEEF F7668BFC9468881A006C10436FADEE8EA4E6C5593CCACFFB740D0C6C31D6FE8C 77EB8DC51A69E671BD4562B815111E654279331D97F535A23E6B771D857251B0 563420B8F29F15C5AF357C73792BE4358667753A7A85E80A1D4FFDFA38ABE03C E5D21F22E02522DA4D82F50BB743FDFA58E7A435D4D1047CD38F3703F3F20EE6 ADC9957EDCF47C852B7B030D0BDAFEA6863B1043C7DC2CE6EBBC62B8BBD26E32 32C79231B4F48575752865FEFD92400FEDFABD13248257C912C930FB26D440D7 CFD294F626C36421B0FCB03F2CDD880C66D0402DBF548C6A3F807F4DF4DCCD6D 272AF53B21899D8C5C0737929949753F012B8D07E21F043663928EF17DA51681 2066E48F5B1C9117F45F0010C512627A327F99493699264E6AB69ED86DAADA54 A100036B079CD4882262FE22BEC5BD9B701FB077FB970123E009D1065AF4266D EFAA3B6FA0333E4803F81E6495D8FCF35A16532673F71B7EA505F05B569DD75E 0B3F39F5CFAD54AA5C80F8F082C312F952222AD409FC850DCA1ACC78B7992A78 939EA3A4B51DD2DFD10FC59F049619FCB40DB92A9D6B16E93093C994488F6F9B EA42C3A835E0CB93F0C1534BC9C1F4E33EE345B4FF54CC4FCA7B641A8F155006 CE79BE0B6D0B8CB74170B6667B5949C6F9BA4CC90FF6BCD2322B351894035934 CAC8BAF06677832E40BF90313CFCC979E6B8581F6986F5D5A9529A5778F4927D ACE747DA8705058D22F03697EBD239A4EA64D77519EEAB4A72E719545E3BFCB8 4317217726052E32239D2A34C0D6B29DCA53899B4C930B5B2034D0E6894F5110 9EF709BABB60B8C65616795F40C62B611CC0703B8E9F394A61B5EF1C14129357 261984E369EAB3CD2B58536E84333D9F80946BEE12F342F0650F2FB184DE6165 42BFE4432E3AAAE9341D8068FE446291F12524B2A1B8B5A4D60150C642B18C0C 0E5D74B2C4B508652729E342F27497D769ABE54E45EBB0D8A2E01F90393C6F59 8E4A6C278C755ED6633D9C8FAF5C30BF86DBBAB912FB22BA4F30912E8E9699AE 8CD0D3631AE3D192418939D959257CBE3B39404C0111AFE56C81F5932478CC4C C0453C2D30956DA085457F43F079E94ECF6BC61914C63E240DB5CCDDEFCF3EF0 CBDCFE02344129A8DA0B9F986F6686DE8E52280401460019CABECEFEC7E8F98E 8AE135A5E05DFF8E62E75BFCC7EBAB8EC380C1FD1D48FECC229441C4CDE93B8E 60C96E6418A9D286DEE46D0D82AF9D2714FAE2A30A4D9B9D2E5B34D5368B39EE 266B2CE395CB637EF2676610E303E83A0CBB53FB71D5FE08633FE3207970A864 48F03997798A209D930B8A92338D177CD0C3FC7520FBB7FFC4E776009AFF4D0D 9FCED078981ECBBFC8B0911F830DABEBDABC30A42C9E60FD5DD4672AF1048621 8E3D98F92A6156D31B4A7079FBF1639BE20B24D1439007C200519E3A870BF5BF 98C2A9962BA8449FC5E48B9677EBBC4CDF8070BB6BFFC4FE1A6635DC735F4801 DC0176C98495B2AD37791ADA6C1FB8264CE0D27BA13BA315D08DA1213CCC6748 E9673881C4183F20A8B97FE13ED651351E5D2424386962F578205C1F7653AC26 D83239B66A9C567CF1606CBA9CE574320107794F9229ACC234987FAC848FBC49 4D1253649515BA36B93A1A09FBBA2849F20A4F5C6F8AC8B4EA054219D21D3849 DC6D1E148BB0D1E83AD1FAF3BEC996E016C32BEBAA421A94FE0E64D4E2239E42 5CC7AA4590643357472F59DE1D25276F4E8A6DF2DC832AECAED359D2EE0DA6C9 AB1EA510DD4656656EB736D8B1AEE07197BCADF408222559E39409D334A2BE2A 81B7E652C20CE6435A11B9C03ED0CFD3F9EC893F74FC4899E2359D4D2723E0F0 89595D06DEAE8E448E268ABCCDB833CCA7BA37E2FA9E2A827CD381EBB2F5BC7B 03718C4A68DEC9F9542E2A1181FD444A1E564462FB492F10F290CEB56386B141 F581E2BCDFD93A47EBC7D6763648030CA866EF24DABF14BFE929E70B4B38B605 22F9C0B7724371EAA474B380FA5CC0DA0410FF931BD9CFCC6F7CA04EF1A3CCBF B86F1D1EC3FC26CB85E3F07B0E833828922D03A347267805D279ACF38943ADD5 7390121B316BA0F20654FF0643E241F78BD48AAC1A4E511514EF1D63BAEFCE12 C78FC9335044190E899B70781CC02FEB37262C76DC73B30CD60699CF8AD070F3 C3409DD6242709E18A452AD935ED9DA19F3FDB7F5F2009115D2BA0FAD270D183 5814B26902689058081D48DD84BB2B9B3D76099EE6856CFC9556BB88566A3F7C 09A2D66F5BBC5A3120FB7804E958F29452A26EFFBDD0D774614FEBF45136710B CDA86D589241D213BC7B27B440C7D60901BA9EF08DC84421BAB0874686E13D33 2805DD8836DEEDF7C9995320B9F22091D30A1A176B516C71B67A92CF365E31DC AE54B695714E16F85D16C80189B5A8EBA8169419077742AA0A150078A5A9E902 875CD4E59AC0CC9FC1AEDEC76D007FC53EBF36D746153960272A0998EA05AE4E 447B609AB48451DA178661D7B4F6C40F5B2D40D0C7D08EA9BB55D82FF6C26196 9EED42B13F570453E30F282C1FFE8E9F0231959682A39B8EDB3DBE83BED1714C 862E92C0A1B5F96538B8C14F06BF040B387274A27EF0561DA0B16CED92E602D7 C221F55542EB8E712A48861E64830260D1251C28B124425D37C1BDF671DBFE45 89DDE5CD60D9E592B5173C210699B12F449CFFD9FC2721894094B5143A58BA84 3C45A4CBD1BBF9782755A91C3B006DF983A543005BB8BB89FD72453A4DF16E92 F9D2C6399F401360D475C44DEBCC18F61E8429ED28178DD8BE8F74014A4DF429 4F149489773120F53DEA4CF78849B4025057677B47D82B8130D2583B51E576FB 1D3D5C7A90B820D6782AE44DB08D1609C9415686FEBFBE4D0882C03DEB5F4899 AE0F205F2F31F96FD55FB7AA3B384A 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMB10 %!PS-AdobeFont-1.1: CMB10 1.0 %%CreationDate: 1991 Aug 20 16:34:36 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMB10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMB10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 97 /a put dup 108 /l put readonly def /FontBBox{-62 -250 1011 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 2DB0E39996C010F3024A5A3C69C8485664A4E3AA81348AE21A30280D0E3B6542 A770F048F31907891EAB8B57DC70FF775574D6CD26B8AC9C3E64C3631325BF0A 99AB413BDADAA3B51A3E168B03A856EC7D346A38BBB0A2700A23B2CA91120B9D 2AA5BE5A359C60CD78F055253785CC9701F5D670ABE4967D74838C3B267C6563 C9651AC41D8684AD5E913A5C9C547CA225A74782D1AC62020FC38E29C356950A 00E8F2B0752CDBF81EE4ACD59BDEBBB9523AE4764B995855F3A401EB4B04EE56 B10758196CB661448A3617B83CA88C41756EF131CFCE0C968B94B6C69AEC1E9F BF8B21837BC422D766B5089D81CF35A807394A026FE3160580695B1213968D90 8ECD1611E719A871E15C6085A17906F77B5B2DFA6AE670976758E67F8A4FC362 FC7299D85ECC3C0BBAD4649B9DAB4A2FB248D6481CF0CCF274634D37A5AA4DDC 31F3138AAF10998FD66F3817B77060E71C6D8F17205F9C098D81D952E0FE3831 2264C55D73215176470D8D75E7BE6E44514984B9D20208DB3ADD4767CAC09D41 9C8DAB6EDF4FA1AA2CB285CA28E30972B3BFA4F8600DB92164865738B015A331 EA9EFDD478132047DAC28DD4FFE419F94CF5FCDE732E53FD332ADBED32F76B2E 69531BCE0D461BA3F41A528DB0CCEFF9663FEB3EC9CE0F760604F835699D7C08 CADBF7AA3DCCE9E813D66BC62C6E452FA02FE7E5F4FAAA527B4567AA4FACE790 87910AC2498C0999866614C90AF7DFD65A59B9183FD8AC5DB9AA81E8E8477F07 3501D4BFCCBFE32C964D3549B42070D43977640A289060AC0BDF951B78ACDE58 D95548DE8DE75EA7A6F5922BB463FAA93487253414EF4233C8BB976B280E1A92 A77D2D907599AC9302D1143597D4CD494045A0261DB9245A613EE31DF8994568 F7D0FB24D761F5B4E8A96B5AB339418462C29EC1DE163980AAE4B6190A1AA91A D935859055FF59BDC9365F825C409B52530DB59A099FDE62E716090B6B14D2D7 28662E609B24D00FDD9F092F15D94C0726B1D3610F20A7C658F19D26DC8B53D6 8DD06EA7E45A8150DCD2DB3AEDD9239A029FD6B5344B0FF779CFE958A5889AB6 E941B9BF0464CB0FF3247F17290F82825313C171AAB70BB80D21EDCB7628B5D1 8266B3E93852BBFCE9CA6D38170F6CE57219A301EE8B989D66852EB7A48A8177 96722414CF3B147E046617BA46F6F1439F90B6B3812D61619904CAA0B7CDAF29 D6868D7F8346CF4164DB12015292BFBCE474B05BF886430411E8E937B6F09D74 42A2C0EB14BFC76003DFF172AC44D730214DEE512BF257C8688FBED139C01604 2C34B2E4C33219B9 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSLTT10 %!PS-AdobeFont-1.1: CMSLTT10 1.0 %%CreationDate: 1991 Aug 20 16:41:43 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSLTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch true def end readonly def /FontName /CMSLTT10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 39 /quoteright 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 121 /y put dup 122 /z put readonly def /FontBBox{-20 -233 617 696}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0528A405DF15F03DB1C3DA8B850431F8 0E5F73DAC973450D1ED0530313057E971FC7E7CA88E61DA6DB9A5CD61F0F76CB 4DE9105D0627B8DDF51A655098229920CF429CDAFC3F7788C95E7AB30E84F840 8CED52E98DB4CFF161D2E62B0D28CB8B0AC82E7A8D2C007953BAFB3056D66079 8064956E257D31C13509FB81A250D9E875C77A4E91CC49E9FB3C0718B2F691D4 B4A64F351F4DD68133DED7629B0D96E5124584A16FD2AC7A3EB244A934FF059F ED7297B0505F3C2994AD66A3CA5D2728B034DE94B64A8AFAF341601BD4DB5858 C9950A8BB9C598B8960609F48116ABA8C007190AF0ED335EB5BF61BA6871FA5F EAB5A26AEB5C7C352EB80799CEB983F19EEFA801093F62086AADD0B80BB6580F 2CF61B1390FA56DFA1A0B61C58DEF96BA767A8A37EA44730783C600706606C60 4EE74EA99B7C0F8E2525C8847F3D31907C3C483EFA98F6C416B6B2C343DE6370 52FAE423008D086A76A1FFB327CC7FD84B1C66B203A4F41582F4599A82F8362D 38108452EACCC937FFC4F3ABBFE3628DF51367DA6BA3F6826FC6522D6AC5E8EA 00BAD300FFB6DEDAB93237704202BACD030AA824B1E97C0AFE17FCE8C75F4FA0 B8A74329A6CF1788C7EB34DA7307411E9AD7ED8D6582884456E06E033B4FFE7D CD4DD8B06AD01340CCCFBC382C18CA451E4C886B01D082FF8CC5793F4727C3DF B52B4F1A242F31D1EB79D1E39A1D4FD13D6C5E2A42AD4B4D1CC4EE7BA0E5F80F 802E5AB57EA15F4DE44D82AC408AA86D4BF58EF967FBC6497BBC7F017C0598AE 32CF865DFFF0FC7FF9E6DCE9B5F2F4C7491AC674F46E8E7660452CE0A77C1EE8 00DE382ABED85350033F8ECB97398E4E0A75D4877A107F6A909D0C76D14F9A96 8A6CFDE3FD9D79B6FD82693A9F354BD2ECF30C6D99F7AC522F8D6C93EA214F7B 3D0ED77F042ACDE9414264C0698E86398562E2C640DEBBA0734AB4C3ACE3907D CC79E6B2C6C3C3F9B01526E8CD98237D4A9B403FF8CE3132222FA60C196A19BC A2393AE6935C0F8B67FC1D1A1359BE7E7BAF694B91B61BEC6DE6C64356746771 0CFF188ECA9A543A49A39A046F96E819B541E5208755E19B080CB0FD9B42B72D 855FBEBFF32292D435852A14BB713396782BA940E05F38593D288F107CC0BF82 14A204A7CD65F00AB44D48036E58F687DC2BF6584C410AD4A58F5A7CA173FD74 244C7313B0268589293A261CC08460EE65079539F5E68D4ADA3BED2AB983A354 3D653F25D0452DF9C3519A0FC8CF71AF81BFFB48CBBC8B04AA3F9B3A60D933A0 40299CB46697044F849FBD7847BBA0F7D5CED705C8E4D74B83671F05E5098857 E87FBAE522995960B125E2B91D1A565DC09646FD83955162C3A583467C792D2E C98B830FAF360BDFC63AC345EC6F1A79006953121CFA26BA7B164A1125BAE4F1 2C2EDECDABDECC2F8D94B6F1DA48E3D1C4B1D914E14DC08AD7E67BDFBE327092 2B48B134784FDB084B654398A1037BD95483F8873FAE68C9F31CA1F90284ED16 951B2AF75CC16F2597E0A72397554CD53CA9541B09B2DC1A45C6FF503E3528E0 22D2C1AD257C5E564FC4F4F39236FE6AF9F1421BCAC7C2790B2A855CB7669D42 752639F74EBFCF234E570EBC7F2858144D17CF17D6A16950BC6919C73CD4AB11 E948284006DFE50A754DE8217B23D9FBEC052236F8486448A6D3F9D03B0FC959 56471B443DDDFDC012BB881C15AA0F03A34225364CDEF2FFC5BD9452B3179174 90FC3114D948E15FEC13B03D08D15ED8DD4F99A97237B46EEE8BC7428FE2F3E3 1737E6D8DBDA770EDBC95C27317191CD77DD1961126D917125BBFF006F7B96CF E84E90D56EA4AB1A0323FAB001E835A90DC5349CBE9AC0FB5FE253DF6ACA2571 EECFDC1256C947C29455937094F5839D5665EBC1F0DB67FBFADC836A09A82FAA B38C9854BED9DEA3B4A1118A382B2DC930D896716D9E1075476CD91E6FE77940 4EE4A8F2B77E8465E0267D0FD471667CD258DA593CA7C6C478D178F27848815D 1E2F429ECE1015C3805B9BB5A94D288D5169D2DA94016B71B5276FC32B336576 F7CD75D2B87107F7B50C5A328FA139D42359C3AC6627E689C02161A8FA5718AF EB2D49598D96C64A963C1DC630B1B1038E7AFD48DBAFAE5E0C185D312BFEDDC9 96D8C394D73CA89E7C26DE76147F46FA239EC275F1F4E17278F7F8C3846032C7 FE805D50242EBE4B4D60209C414A1FB50489D532E1937CCED646DFA4A8965C04 4F2B5DDDED79977D93B8BC10F89E22674947E1DCD565E0F71EA150F5525A228F 523770127908408EA2825D9FD41B6FE442B1BE570EECEF2539A10D07E6A0FA1C 9ED9054606FB92312C353DEB64F9F99C52C7541A4284BEC6B04D8BCB19BE7D47 B386B2CBC7E2726B7906DF2B9C60BD0EDF02F7BBDBBFC77A6E923B2627AA48EA D25F60AFD1DAE1EAC5BE8A5BB9E9F8A6A71869B75E5C09C43D7C7A42B3E48351 72704E1C990989D63839643504DEB3AB1C65EBA7F034926D26AEFE92AA8CEEE2 D1C535BEEB93F5E671281F6C20435B4A873B4CD9FC8DDA212A289ABB97932DE5 C12B848AC1B0FBE149D0AA9C5A0FEBAF15248D56AE6CD7E306BFE9C21876159E 5ADF792D6335A5BD308692C674167E08A02FEE67090D58BB2B2D9EC6FD598DFF DFB6CF6B78F8E1C8D4215CB33AAD5E897C75A7C8FE63ECC17EF941B33766AB2D 2C295DDABC784851BE6FCE8EB6E8DC24B332CF836D2AB3888B85E1DEE331060C D7D3677489ACEE8D77F64D9A833AADECA12191611163BBE545A4C75E4CB1BED9 95F2C06560FF628CAD961838DF4B03739E1C946F9E5F369FC86CCBA63DD638AB 67AD4A40EB009700C2FD6CED16BACC301F27C12B797F480E73ADA18855876816 DD85E5E2AD2C5BC9CB59E7F26DAAFC5848BBE7E40CD9E334E97F80A7461CAE07 6E92B97CA810486F696F2C8BA8912D19F2C0D434011F66554B7599517A2FBD7E F442B85BC639C49614363A126A498365435C4398CA0151DF8EF87A81F5282EB3 EDDC5C39F2BDEAE08555113F9B4C61A4A7DD1BF8BAB286AB2E971DBC265A6A0A 931CB6219FFB8C04E8208225E3D686315EAF39F674B63C661B23EC073E82605F 1FFC94BCDA637C86574319C41CDDF97768BA23954406741B9134FBA45155F390 B18215B80BF01BE86C325E612D50DF2F0879A2DC24FE71C9BEB77C42A67361B0 D9DD197A80D16EDE3AECFD703D1257F9433EB845C9E7AD81AED36D534495EDC9 D68C856231BD7DA9010A0E6AEF18B11C0B392A4440A8F56FC28397C1A073B618 B0AA06543507258A3C63C24BF4E1BA06BD3F8C3930269EFC2CC42BB4BEF7E363 78979A2B8456784550F744513D8BDEA6A946A3F4FE5E48C6766A2DBFE4BAF29F 97231EED7F9D916B4545091E974CF0129AAAF6B285F81CEE555D5ACFB8FCA47D 235BE102E9305D4D0290651BBB4037887E1AD6E08C01D13C182109DBF68AD805 C67C792D7D3A9C099FE4419B70F6D932F325EFBE94931D5D28C79402A1C6837F DC6E1811168038A342BD5B4F5371C9783D0B74940633D7B7B8F8B8C32BF5C71F A06112A87225B4270ACCF383AACBC983DA29281C395D7F2342696D35197D4CC6 661DB9FAC95FD9EB4C77F5F83159604185AB162347DAC0EE51E65C8C5098F7B3 3E8754211B44EE1C16DF2B59923CB8FF64283B5C01106A978EE3C09AD5AFDD64 A881049FF8B17FCEA0B0CDD92A9B366617167AFB6D18FB19DF70BBB6DF205536 5C1D58F8459FB03319F3B5F4D43DDA15C8323B57CB2D5686BA1A4421625F47D2 006F73993BDFF70C7FA63C0C3B3B038AA907711A2958116895E75C0C99ABD2E1 F02AB43861FB0AF5E493471102BA57BA6E3995996696107D1537F9B92F5B0767 0C3A5E374D3B34D7A67AF8AA012E9BD904033EE95FFD412C14EBD51FEE69009D EB8F4194E21C596F529243F6A31F1A5631C42990D6249D1EB330033ABBA40405 2CE62AB60FB1AB122E9A40FCA88D97410DAFB017153D37EC4AE4AF13701752EC 387EA20846202187C1F4F853B6D4B6179E7D0BB9C0E208845E975D26DF1C2B7C 7EBE4B2DA5ABAD95BCDB294E50B42FC032D8D973626ADD10142D69B4DABE2C89 DB817C2C1AF9EFC62DD501A9C91AE35EAFEC12CBF66DB9318DFFCE7EC3C9246B 569A2DE8A523BB6337D9828EBC0E639179C94E067835F6D345731FD98483DFD2 549CF02C77E1C4262860DA5F182E248850A90F5C23E2BEE1F6321482F040E2A6 8B83C7B2502702648694335B177504E757553050DB684A254C924A5C9B8D20B6 10CB6D8D7D495E473C09E271E8A315D7E3829A429B085C803BD6EB1BE5F1D210 C044B15F104EEA05CD5D90078BDD975A8EADDA67721895774C477A8913B4E97A 34939CEE30608A842313D30BFB9FB4846EB87A939C84C2BA314EC87AA8655183 F5F42F7489E067FF643F159384EECD7B679C6F34F8AB537E11D39E5D897AA913 6037E8DDF13094E0A9EAA04AC7D70F9684E36813BCF872C39C0DBA7B0AB54870 9D1F991B684B058662CA8C8A7D57F38ABD15CC50C71BECE67F014BEC61FC5809 407EBBA0263BBC1C7C1642DA4E76029BDC9D8BA94F527A11BE9AFF27A87B91C9 7E1C0850166433609BCEEE28EA85DA21E1F5E312B5992CF94452946B525EBEA9 658D1F1CF8E0CB6A36C6446F70C4EEA466CF85CA50B051A73998CE1E9E1E308E 36B04F3D129BD618BD671C52E8CE6C8EA7CA47C68D9864107413B6E8D0113BF5 6A076BBCA316114C7E3C0EFF2BBE5348A80D09C4F8BA51BD544BB23F554511C0 9ECF91F8C6BB507003AB73C536DA96FD4BB21A1E0D23DC3E754D9AE220A88944 A70B01A8E4565C4E8FBB9FD6AC5BDA3BD91F896CB8CE67BED7182ADCEAFF58A1 8441452D10A158832F40BE2214197EB41DE2F0ED9E407A0A0011ADFA806B88EF B3991ABBDCE871996F0B17D61A0C76C6E9BA926ABF8BD3752DA7D757B84C1845 D864C5C6BD8FDAF3740CEA2D0300D53605C9861D4D86C188FBA84F1281C4DB96 E22D31A7E218AD251111010B0DD4EE7B32745542DC1D4FFA6543CEBA105A63FC 59F8DE4578B263901E38787E0F4F197F1BF90EFD29684AC0965B66357C1F778D 60CE61BECCC65BBC134D6A77EAD3E498C3B8639B7A4D95B08353104112107862 85CAB073714A7211F36E2923411442210A3F063340CFEA003D6F85A0C11B5469 581BE31AB60EA5247D3E5739393058710F0DDA36CF53256110AB08F5B422A291 4C402CE894FE9EDB5BC468F379CF47258518A01D28ED3E3941768124F5C71A2A AD7AA8BEC0D8358EE389CE8EA9AB646D4B9D55E588879AA8566C6723BF43AFCC 0045CB2075EFA3C33B9D2838D6D0E99F3A1C0068231D585B4CC7E81D44F5D04A 2CBDEA50F302603C1E5C67D5570DAFF1D2DC87D5D85C977085FB505E48CB425E 35EEC9E447ED6AC61B28CE95F33ED271D2BF80067D4DD723F8B719AE06CDB75F 68844045767BB1C7356974099CAB81522DAEF863ECF0F0FD272C7826E66BCD41 2234F07E08E0B0FF5499D0BF2F7277EF2FF8C2BD85C5BABC56B7AB26823F7C4B D0E53B0DF1755FCDE48804EBA05DB62AB79705B3B2C53C981855C6094D304878 F6284149A86DB115741C7E6C5CD1D8A0BF4A0BB1BF316A8E0928B9656F0B6733 59F2516A1F70AF77722D8F4AB51A77C19CD627A7B784C9C24914DCFCCFC64176 7576B4DC562906781880F6C1560E62584C781C998DA2D127DC5003E8D1DFF54E 541B4AC0B7EE8CCC0C9489BF39B03556B97831028C842E9F20B3510766D8432E 6BCE9C543E887E9D9A6C092887A443C677FE7E900BE4B1313996B4062304ACE2 ED7B88B8861154A0C216F7EC643C7226414B39E4E6929BB826E02D8CCEF08B80 006ED1FC42D95E24D9B031915D350885B3E5AB465FE01232D2F27C4A3FC92D46 DF76B2B123D29DDFE79ED5E0EECD1D22C830FF9BC789BBCAADA52BABD7B66C10 A658251EA32AE3AE94F98315461A29BB044AD943D7432CBF48F725B1B88A5501 431F2E748ED9DB9D13FEE67ECF01848424FA21B8FE8BA16577672545D175B37B EC018BBFC6CCE8C4FB88CFB8D7FA37FF627F32D426A574F58DBCBA705A7798DD AB6704393E10362110FCED17EEA2DCCDF84C5B449D689E74E7AD7D98618E29FF 3509A62E807669BF1F7F95FED4B1AA76026D656E215D084C7ABAA01E420EF290 D4ACCBEF1881E199529966845F3182B6233749B0CEC2F7B391783BDBD36E4202 6A274DE4B2FE4A4BFC9814FD6DA28E9336D01DCDCD574DDFD55E2E444D283128 D3AB410158380922B04355D6A602C9C90485C0E85BDF27323BF4564FAE8CDFED 5B3AB5829B57A7829B86224096D5F5463486AC860C86C1F2F7DB3B6C94A5652C FAD0F54ED6EB58255695FE737A235D38632D78F456CFF89FEBD32C37B5B6A5F5 16FDAB471003158BA994B284051A7F597B42D10EC6236947C5B54E4D7FC7B011 3940AFE4F4CAB864A07A8962F5508B7C2BFEF24E89F38759C1A024858C44FF0A A4D4223A416FFFE7B852221936701DD392DDCE8A1F2A39D432A1346B20C5A8C5 AA6052F7C99549EDD81ABE45BC03CBC6F3BA94CE9682F3923EFC7D564E3E16FA A765B61A0CACDA6D0DBB26EE38F16670BD31F3221FBF040767CF6D5686971E1C ACD791939837A0917804CB320195E99322FD79A03CFFF2EB313B9ED7747B55A7 E8992B0AAABB424BF295C185D4DAA77AF41D0D7D0BEB29BFA5629B67C1C48174 DC2280AD1E80ED5E429263E9CD6292219AD5B4117166FCC60E675172C335150C B35DBF4FFDD7EDF7B646C8E1E8BC00255664A2548802B4D33A5C26790658E4E9 6F3F75A64A48C26F90F7166B48D3FEA6CE661AEAA28D3EBA7611C9676411B1BA F49EB8E02E41FD3F9B69C76C843DE849696EFEBF9E980741A6C05EB7645F1946 1FE7B49DBEF2B29F808D99BFBDA0E85089CBA26F5343E7ED1023830F 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSS10 %!PS-AdobeFont-1.1: CMSS10 1.0 %%CreationDate: 1991 Aug 20 17:33:34 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSS10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMSS10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 40 /parenleft put dup 41 /parenright put readonly def /FontBBox{-61 -250 999 759}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BDCEEA888D07B439DBD4E8B4C9 D198C03874B5E6F8FBF4922065A92BC3E66D05DE53971CB1424510E892442858 D69CE1F76E4DA76C87C763A4B2FE36321E54B1328C9155B8ED6361855A151723 3386AEA3D042B8D89C8C0E9A33E5DF3B466F7BB8C2C8A4ED4CDAFF55FC6D3EE6 0AF2CEBFC1AC3A6E6692F8BB81F82D86BAE85016AD62FCB05467082C2E5AD348 44D1439C2B59F65590E57CA0DE481A7A34E79931B1513C4C30156170409A4BB8 46D412D1DAF88AD30722F12DBCA1CCC6B4BCC28D06B0D29149DDEC520C8FBA13 6B82E2E1790F00B216282FF122EF0D47B70A1B29514DDF7C0435ED238C14BDF5 6DA243117FBEF7398F97EB95597707ED63C6797EBA1B46EA19ABB1DABDA171B3 16CD500F5D64CBFBE4F9CBC3E66A34427D3C4D0C432710289381F9BFD91B4FF4 1E3A896C3EEA2F3105C218877D6C0C6B763760FA364D00065E1CAE9DCB5676ED 286A9ED0D1C946DCA6A2A670EE0936FB4706CC62E234CFEED34AA615C48D2872 A087F30990C85E64BA68F3D5C117123467DB411C9F2D6F6858CC70C1E352C477 713097321B4C4FD4C5CDE305415F998E7245908EEDE6E056A736EA77BD8C639C 3A79FFD0B74B3D28F0494A115F2841CF8A8827AB5608F96FD8998A5F40FB3DFE 3AA0C7696DE4E1D18DC0D6E84B943175FC38FFC42A9C0CBB13A908978C98BFE5 034F88480F32B9DEB2FD228FF6CB0B89B045AB02020C82E3F5716DC640613185 9F597CE262729BC52132F43922B9E28BB71A30AC8709634561B22D13C4FAFE0A 12C4451969226B220038AD8DDA990A4E2CAD53DBEAB698898BBD3046234EB4EA 901287E71CB41296C431383AB85F18882F65BE36923F6C0FD6FADAC5B42FDB68 64C06E047434FA7A659EF7F3D1AA8E547939FBF9C2ED7AC829F03CA59AFFBFA5 A7AD2E0FC7BBE619961AE1785D09444B333993199FFED007382B54DDAEBE21E0 1E75E0AB6D309DBE53BC7BB9F95D342F51798574D70B95021FA40163A86BE6C9 342536A5730837C522D5314B1289D9B7E4EDD108BE7F35A20AB2A16608F6F007 6DDD702A5A9BA1325CE2C1CD020DF677872135CF04F4E4F1E9AA6B494E2BC22F 107C331A7E80718B030A1103804D144802E3B03EF7CB083BCCDEAC7B43F1B4F5 C1BF6016741B741CF7E12B4BF95221A72CC9F4657264771AA69C73DA1DA29102 65D01A0E61F3024E672AFCCBE13CD0B7F54AE1418B72E357A0BABB4D03073B1D F4EB54F899AD4A41A9F94DC200880A0DB99D67235A2451B25F710C29A882865B A922E56E9FC16756014FA5CBDB1C32750BD6835A70EB715CEA19A8872041905E 8C660BACDCA26C8247D6B3C10FA5DC240E433E479AC6AFCF57CF96697FF46BE6 44748E 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTT10 %!PS-AdobeFont-1.1: CMTT10 1.00B %%CreationDate: 1992 Apr 26 10:42:42 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright 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 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 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 /FontBBox{-4 -235 731 800}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA 6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F 1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF 8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19 741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79 E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712 E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7 D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DA 726405EFE420635B5B7F0B48752C06083E92BDE06401C42A2C528C8A60381227 CEBEF0C9440DC034DAD9C19FB27DB399BDAEE22053591D6538587C768C1B7B0B 7D1E222D2D8AF3A6473CC4C0D6C3E0DB49068CEB8C9BD1C5CD486A50DAA10BC7 7D6286142355E3F21DD254E27C00C442728A0BAEC9D3F17AE9CE320D365152E9 EB0D5E3874F2BCEDA98521D23FCFC30B4B69DAD2ADBE80E5964ED0ABEF6C73B6 DAD30E2C5061E3747FE536E1A5D190D028F2130AF608F5DDF9DDDF1E77DC8437 ECB3EC93B33505DF47884DDBD1DC6BBE4098DF04A29AF6FA3AE344600D0AAB53 B3820DD7ECB600A3B8001C51AF2CA7A39AE1485A0FCD5D16F0657F61E9655AA1 B8326F1813FEB669F4E88D7C1F3AC239ABDCD32171C7377F7EBD25E7B38A2A2D CC6F434D57D1F1E4A22F381E957EC31E2211714A3A438A26AD3CB48F0463CD4D 3C0B6E5655214FF177BCEDE954490428D1ABF0CE50C21797E455D0C97803A32F DDBA51C36537C0B104011AF144043D0FEE36BBF1959020769522A015B3A4F77C D4AC56294BB989CFE5BE6EDA938B4850D347DB0724353AF84B14EC964B9BCD59 1D8BD34EE86C37A97CAD9DE966B6612C23069B547004CD96B116E4F72E75AE37 D506D9FADD61696418EAE950995A0A401135AEAD81CAFC6035C51C38E7ABE815 CA5D91B363F99E41F567FCEF760C57EABB51EEEC484AB72ABC7E6D2370999714 1E5B9B8292424474931AA278F716A9314EC34E7468432DEC2EF2F54639BBAABB ED7216DAA183A57CE0906AE4FCFD17D58C24D5FCD2A2DFAA6BF09C0206CD22E9 C690E58F9ED3E42F4171197F2A5436A906955B6859FC02527328EB346414A822 A022439DD30559870FD88BA50555F481DCA6D4FDD3A0086577262F9D73970E63 E51F78D2372D0EEB83478AD15F449FD9F2A740F61BAFF20CB34950ECBA703C18 188F61C71220FE9D6EF6AE399AF0A0DBD5145F0FAEBC437AB87E300E3F30DC68 5C9F034A31E1B2208A0B9EC2ED38FAE85644B1EEF3318B83B65DB758A8F534C4 587F975B83727DDE95D037DCF497CFCB87A8B0CEF46466826F3AF1C20B6248FB B41FAFE73DDAAC1F28D9DF2B4B96283DB5AFB0B4BF4BC77963CFBC4030DEB130 9E95F6085A809C1C55CA7528CB18AE5659B97CE789191095ACEBE4DE36E77BAE 62868382DA764B7E37E26D998B0F1B11E702A222867ADB96A95D2D0B48013158 CB5B61831BB5360220322B06B40E83B547BC3422AB94BD154B5989A564B0C242 28C6BB5A72D2E81F0265B42FF6E9C80D2FFEA7262ABD942B5DFA28026C213ED8 F7188BF6A9697EBE10738FDA63DB75B9D359678278B0A9347C56B1874FCA6BBF 336684C315493454C21A113A8536694D3788080E17745964EF9AB781BFE4E300 DC9FFA8593ECC54626085F0CF4C29A58F0CB4CB3FBB253334A1CE99B1005D474 321A9FCAF141FCF33C8A703714F4AE0D13CC2E3AFE4EE2899664CA159B7FB652 157A0A1B9FB4DAED19CD969AA216961A83322BB5C721A0D3045BA51ABFC42A5B 562312C71A1194869785E52B95F4FB6E05551172CA5723A225D247F94B70ABC0 E36EC104DF35EC9D3B828711D1C504E3985B66151A53436F7F2D34A1BA5390C2 249DE9E1C1774FAF61D33F9C93ED13A7C39F4FE175A5855507D4E5BD34293E4C 0B2DF8716BE8B2471D22E1223F2886EFBCCEF6307A5B89F4DFF342EF03661732 F50E63310BCB76DD35990B51C879333AEF0A866B620B28F1DEF079A303BC81C7 980D145314ABD0E7D86843AFB41C2506071A845FE3AB31FE4A6799377A1CCC04 418E44564114157401C86633E565D28CE20708934612092F35D711150E57062B 778F00F9F767B12EBDAE7C18565D7C58580DAF4712A191341FE9421E50900CCE 88C29297090319473CFAA9C1C6F0E35D7FC6CF9F10F44AEBBF800DAB64302F72 5759BC755BF27BC7FB6F02082A0541C7033BDFC30D8D42B80EA15419957895A7 65CD33EB1CA613B9A8FF77EF032B58AD8EF314238C7FE95F1B679AB74326E651 C068F3CA9D2F203AD8D9BB78328D79DE98F511E74F1E414086FE9E226688791E B7560E6875B5071D3933E1359AE9C9B5651AE3E3E146EC413DF143208ACBA46F 3286BE9BF866F762B9BAB698501FEF48FA9A446DE48509625E452E28A5C3D479 637B8822F08996105488333826117B10FE03148E63E5449D443F312F1FA75F59 205E581C337E4FC0873DEBC65DE03068173FD29DC102E2BAAF151AAF0133F98F 830B0E94CE4E88038920CB2BDC3A62BA1017FC5C2E9A018C4174DFF94A82ED65 1B753E8346315320078D179199F7F3E1BD405D1D7016634157A905FCEB1DE060 A2B191893D00B070533DC64C6867C36DA6098C236F72C0658A1236DF8CA8792F 3728EB1007F2E7BDFDB4181DD0BA60B400CA843F03DD7A13AA207ED3EF09829E 0BD28A2719C9B02946487C3F2AE4FD533D1997170D4A2DA1CFAD5842621A7D1D E90764878E5FBF38480E31E46E93B04D43E4B7C999B074E2E81A1A033DF6C055 DCAAFDF409CA61BEE8C73B0B1772022469D3092F0FB36C72B0F72E0DF211980F 5699E5C49C931A3DFAE2EE88F8B2AAD459765E717440A516CDAB76A9DF252DE2 A2DEEB02D6E33484C674FC96957D485E66FD625E5039F0C3403B29AF9C64DD61 645010C7C2B9A6CE8ACAFDEE5DD8AE20265FE8D7C8FED619AABB8B038B6F165B 4E104723948C65CBB0BF5263954A297A53C6ABF631830F9136104CB0AC30FA7A DB482BAA1100EE9A61C1F8D6522862F80739DC8A32BC913A0BA6656A377A1A27 F96993C0AA6381A1AC741F3964239CB8DBE83937DDD1F19B5724A444F3CE569F DFF25DF2C3AAE4B7E05C8B8A57417F21DCD326E230A723C17ED0D368EB6884AA 279F775C902D075EC47C80549C4F92E2227B120F901A5024C51CD3221C21DC03 D6B380DE7150CF00EEEBDC9E9DA24755B6EBB322DF923807A6864ACFA24A4690 93E6A9DF113303DD59993CC57452D2DBD33C20B12AAF506EED17A40D986F6F64 6F0241AA13009825827BBD20D860ADFA572C82B92DAC8C34CF8A730EFFEE9D4C A20F8DA47FAA3D317A31B5AC22B1D70CA6228B13783524D6D691EA04BE00C5CB 18E3785BE3521DC4651270FBFB28DB2B11EB3A339B308A8FDB54DA6A83AE6545 D672C8D3E706B46F71153991807E88F3292F01A7E1B6999A45492189E2251F5D FFFA554257E2388CF8F286E80F22275B743CDC9E886E4D881EA445A5002730AF BA5AE30A3AA5F08C28EB2A87FB1882DC649D9FF31B80680F8324C4F9F8ABEC87 24411FC65DF5214F02CA47560F970DECEF3383EC36F4CFF7E2656EBDDCD824E4 F55140BEF34F501820476B5A52A93A6DC2E6C5BCBC3FF23A9697C447E7C37199 AFF2BD00D8E89A3B2D48E9B8637E35A89EAE4B168B4A4980030CD3A86F66D425 B22AB1B57912CD32B5DB582D1331ABB2CD414285A7924535DB49BC23EA3CAB29 2BA13CBED6030F7B5832351374DF51571CA2FECBE5A1350D3066B71E6D01D499 133D0B554A6427756935877FB01ACA4FF74B937F39AF455CFB68B7E839BF4B7A B2C81A989C299677EC5357B8DBA8D4D40599B4FB5FB5A6D088B26261DF6A476A BACB78C7BDA294D6D41B74DAA6C03ABFA6C8D26CBAEAB428633CBB8532DC4659 4BF4B97B4591920D029E36C5410AED024950D093049A988DF9C196879171BBF6 FD711F98502C975AC26C7BBCDF239D69E71A8C642DDD96114DF03DD473BE5E76 AFD77445F4C1F7A432B85C741982CB82E5096C61C4243269B6A3618EAB43BEDC 31C38F15F09D85EE1BAC19C2DBB5BC03C8FFB21065EEEA0737A2E0B92450DC58 707B5576BCE4E89689C5AF2DCE7FB3DC4D2B592AE161159FEF9F211228089861 31C18036B63B11EC60545D482A43AEB754509097C3082687D430DEAB90D117C7 0BDC910CAD0D70B6878EC6A10DDD6E38EB4516D8403C382D4C41223CA7B43FA6 08D278D1DEB314CB03C2CD37FEAFB7B551E76255B69E8D2211DF32B233983B9D E81E5A484DCFA8E36ECC4442102C2E13CFDD7ACC518C144FA06B44893A6B5B00 5E1525B5FFC203A8FC62F11694700E2A4A2A229C0B44BF5FFC7E7E566AF8B055 C096B8FAC47D09D857AD239AD6A0E10E36011EE11EA7191FA593E59F95180923 280E8BB7CD0CDE4707649C0A08B22014266A5532DA92A84A83449D3C31DB030B F543F95780E69CD74E4EF523705495F48B903E85DA098DBC3FB850CD059F71ED 6AE0DC9D17180B7DEFAC1E1281EBD468A4A8F654CF2FB5E23572CC195FE14D83 8777A436297D3FEDBCD7BC627D223FD586D3491FFE3592D3E802768510DD3A7F A422E75835D83D10874E9F4B1D7DBBBA0AF639492366B56770A635A7C25202C4 569B75C7293545C46E7B371D8FE7B22AF4B1ED670067BD59FBE74F7283E3E56E D455003DD54BD626CD77F806627F2518E08745F7FB5605A7152EE0F08390AF33 47821BE929E621CE3DB5CA7244462D83F674BCF47C87591202C389D427B37A1E 36E1ED9EA23E24A086812F239938BE4C19D4150BAF6A9F04BE819D5F404ABF91 519CB7D81C81E2D624ABA46D40C531FFE4219D0D631A0D375757F95D96327216 F8F795674532AA64D8B32020F8FBD5F092E6785A669B9D5923C08A8F900BAF1F 56E90553705F35D12188F1104FCB390FC29ABED2E0FC9B731C4ED40946C544CD E26AFE5DEB68912A5B532C8756640AC31087E7D4D64139898D2E6F69596DE462 91E664EC93C9A5C22774AC592F8BAFA074558604D54484D9FECE8CEFC67CA421 49227640944C67371F12ECD524FF392A71826494059657CAF454FC870F5387C0 3188725BC7F25DE5383B49669AA4339CB0021788922FE0C65C7374D3D2F2A1E8 400D59551C6BF5F603DA2396FB199656D58304EC8AA7C9AAD8F056AFFDD2C453 7245001DB1CF6550816E6BBF32CB30E01B15E299A35D55D079E10BF2AC459E14 1D9DE4DE1643DED4C142B81AA48E28BB11BF478860101A4A4067BD5AF109B9CF 90CE0370184792EDFF55BC58A95EEB80AE685FDD80DF1727D141232ACB248697 225658511123C3CB048CDBE11E1C6E7CE2A5AA350D29F9EBFAA3913C045A55DD F64BEE7FED3CA1C5EC310E50E8522F3C1E4FAB3EBEB73B66A57C3CFBEE29FA99 5EA2EC693D0D0E4B3BBB7456FA27793A65CD19A04437C582CBFC7001E2917501 C62E2742A24CEDBDF9D305BB9C963D500A330464C346880632D6F5BE93DCEDD1 AC943CC68D0836DCCD345F786825A522C2AB7C296CF72C8DB96C1A16F8B0C621 48F546EBC38A5B3F125FF8DCCE82FBE331672E40781F44765D6BEB98BC5F56EF 365A217C72728A96ED69D0C80BE128941357C1E9149A0FD5A3023054F12C9CAB A087BB08CB9FA6842B4C7721DE3A9C199AAD120DAF05E388D8B7A73800146B08 9B0ED26E7335AAD093FBB191716E877F78A12E971D17AC3EC33B8A66B18F7959 D7AC7757A06AB638AFF519DBDD13A35373B3F6702FEB07AEA752C31AA23E6E94 ADC876DF120FA5F1C359E94B5C090C3E865FF59CA439573A5AA49F0EBA152FE7 595EEBBDE95968EA675903DF8FDE3964FC26F46FA5DD206E486151BFE3AC88A4 AD6D5EFB678E6D8A8BBCDE2648F812DA3BDD7FCE3112A091C66075A360FB8BA7 D59207FAE2D599030BB4C21F5246E69A7D2EE02365FBE9D0CD1BC02839681F50 9B2E222A117C99F26F271F3E416583FC8BD968419EC92CD7C4FCA2B00D31BE83 F81A69D97764CE9E5628B82CE4C2F071344C363C2DCDAF071D83BEA3F76C72A8 243DDAEF2DAD4E483A9313938B8148179EB0E8550B038DD746F868A6A5990BC6 B87BE72A4D814A74CE993CF39120F18615A71EBE5433B3BB36B6F8237CCCDE40 65E8D9300BA9E587B37E201570F08FA9E2721B843682C4475AD4F21960CDF6C3 2A75BF94B7CF2ED1DA55C3102178E12C19E996B6295A375C8EE43AE06A92EC8A 1332AA683BC4C482A116961B151F17FD79D9A5DCE58DFAA03F8EDBAB45501F12 C4211851344ADE9D1EFA5A2A207A7240F8C908A46F64291006523244E58D359E 827AE19723DBA28D81BE6BC801CEA57EA324F2221EFA51CD299207E7B387B6D7 B66C036874A673EF5243AB21A02BE1A393B1FE4955E264CD967ABD1B487F79BF 2B387A2B47C16938BD3B77D8A43F6429F492A44426FC16E84D845C093B60D2FF D0A79A46D01C22CA62BB7E09C24F1AF8D56AA6A11AF916905817C052339CCC40 48286A871FB787C7DDC1D9AF7AE66B8E7667B289A4CCA798352391ADB9708201 E251F9DF6CB4733295E53CE5EC5EEC41CBC550C7BCBA80A2BCCA1077910EB375 5442F341653133493DA8FEAC695135355AFD2E64E60D175AF7C9DCD309F09C13 8B3304D30CD5D7C4104459C20D81E2E69EAE8A2EA9E4E37420F3197DBE6DB0AD 398D5426847CCD123B598D1CD01F84C148040D41EAA7D6589206D9B84CB533A0 155587C14FA4DF9B24594B485C4968EFBBD55AC7D971734E41FF2BE9FB4AA5EE 3536B421A4F0CFC06359ACFF92A57F9992B9E871F35D2A2EC854BCDD077CB0B3 501FF0EB2432811E630AEAE51944FBC370B568F4D2585C0E773056D1CD0F516F AC1A02C8EA3CD2A8ACC50125B02A8D72B5950411CA46C0ABA6F71015533203A1 94944681B76CBCCDECB62FD214FA405E24D413F4EB7D86BD914F505F133CB409 1B93A35F2FFF59EE10C16BD76703594D7AA97AA8C6894A4C13F53EEC597BD968 DBF9EFD7F25BB20273E21F145350BA1E5948F0279D5D13F315B6D9A4C90BF3E3 944E3ED4F94635A75A18267546579D67D382E3A86BB2CC8EB2708D2A185A52AB 1C2A776131DB4B1C0A158204555D81EAD0A7753663D565D0F8FAB8AF65CD0571 7273A1B5D5C48FF093D25215C7801FE36EAC417A66AE1B6DE4C9E58306FC0308 F39A29896D86E1F539AC06DBB4DDB3A38877793B1BA87B8FDD7D56735181D18D 4C7F72091D269F3C064A571923BF0965CD83999FC15C826DC0FAB85526BB8BC6 56C737A6BD970EA5483A0457D9445AC8532DF2BDAFE1B3A560E1B3B8ACEBA811 C7D09E26E1CC7BABE9A1DFB6FF4CC2F06422D39C340C75C4B48DA31A3E904381 07259E70A86F80C53F4114AB7CFC26984A1E42024FF29185554D99B7C80227D9 CF1670E12D4C428E2A590ABDF6A30D209111C8E84469303B7E887E20BC153306 B4920E9135E38D1ADF227CC7C6AE369BD2BE75B8B5EFC43CFACE91E77BF29F95 0006BFE766A925A71EACE1432BB7A32D48963A6D47341906E6D1599B4DE5183D 4DD62BAD06DB145E17E316C16873A310AE2F37C2B6AEBFAB8F740E293B868080 1F7B1B61B88257465F18D762A96A1706587ED0D32201010D7C2C9A1E10317804 17CAE6BAB1B82E4B158C25D46BBCD3D71D79C00DA53271A5AD1FD8B9383B8765 50769DAC5F9A39EB90523E6D16B5FFDC97EAF49F47DD21DC62F981BB7C9CF11D 47A74332980E6A8E61BAF0DFC4D359373FEFEF52A7F633A06DCC7671E843477E 5EA865D2B9870967E1CF67722651C9D74FB64C45BA2A8EA73656D76B38A5B189 491E84A948BA65144419F40B3352A2835B170F42C58A0F333FCB1D271C0A4BC7 8FBC64C387C7A26339EEF291135C8B2F1F670C8B14B920EE77D00F37AB0CB285 87D47C102062933A40BB8E11D4ADE52CCB9AFF7F64C21B0CA8241D88AA4330BF B880775CDF71FB4923F0E43DFC64B240B1195F2937D4BE746208A219E0549184 ECD33BC0A20D8BDDBDB6126D85FAAE8ABD5452FAD1617A42446BEFCF339CC49A EBFC20FF4E40555F07A9C81CD3E890158FD6A58BAB6ABCF08D1EF2BADEAFEABB 5FD05B061C8C2347BC1A5AD9F6A653CA34B925CE12E5F5BF1696EC1C44D3AB2D C8E18134A7D937ABFF3BEF5E3211F4DB70DCED73DA1FA2A89EDEB8CE17967424 5F2C26106E3546B9D9ACC389749C48BBA619393CE649E19493B918B81B6B6E57 D65A97C464E038C46F7AF946877052D9206D8CAF1A4480EEFC6D95B805670A39 BEA382487050F25DC205B3572C64CB87288EEF7E7B458024D55F96B24E7A74A7 87DC524E5A7E3B7F147E2E79A0EDF219E6E3B7BE8345946D742774F983F2EC9A 73F5B1D0E4D4BCF5EEE3DDFDCDC08419E594843FE5D5FD41C72306C6AA43E4EA 93FA44F2AD5E0321533CA468E6A4E086D9A6CCA3BAF1A7C5A96C2E65FD966650 448BAD418CBE74F12F6F670858FE6E362D1AD40CA5DDAA7DEA5ED5AF2F6FE23A 6A43A1198F2C026E8C65C7F1614165401C484AF0BB292EC25A651D1B359C019F 43E21B2F07239CEE4B864C2B818EF7B7E49C3CFC195AA104C75E72FC46CFF69B ABC86A00A2FAEF49924FDE58F117484670B655D60404D999E2AFEDAC3B59F52B 5B1DA087243458A85A8711CCAAC382EE27E727CBD90BBCD51414B2698DDEC5D9 36E21D3B50D897F78760E7EBB39B957DC044A1557C7D5912E57B23E82ED54860 6E2DB6181FD8C19A3403C2E57C9F71B904DFD85949010310458D50B23BC39B13 D0DA4EBDA698D75C9743B36128F8ABAF389B19C0F5CC71CDA37E722209250D36 742A8DEE4F994D1D71405C5855B2CF8B18AA5F2FFF9D4B9737BDE81B62EFA298 2B6FC900B708F08D909AAB33857FD9C06D7312F7EFC3DDA166A9B0B110FA42C5 3DB57F5C4E39A534D1088FB0826B81EE5B672033A5210E5CB9F478750DF96626 34A9362965A7F51F7C00B5664A95AA517FBEA5EF2F9088ADC2447DA282423BB6 7540FE63C61B564F60F98CBC3464E77AE8845FD13C349E8836A01BFC83924E49 757C3CAE8240573B3E194E5CAD718A8D43B28CB6770AA4C89D5D7DF98B1FE6CA 3B03DF561DD85A0DB4F165AABDE7636EB7B3177055609FF69D0391F7F31AD816 0EE599DFBC9B9196F433155EB21077A222146C7B1FC54761AB32DCF4DE556C2A FC4CA42E22FE5ED9A7C225EB82A070764928655CE7048E6BD62EEAC38143EAD4 07F325CE53345968BCB486988B3ADF521A440272E6A0BE7AD000D9134F758DDB 470351DC64D38E8A405E4BDD3AE550F1FE889B708F368D85E2DC65D59BAC1E5F 854EAC12D773978D2E46316671D8BD27EA45F422B74113C48353DD2600EA686B CF20AC731D9A7E7FB7649F1A0878685F5FCE8A9E3E4705B2D27ADDFED696FC1A EE7BBAFC660A41812E422C4712EFB79F3A29E21196FB53987C706A15EAB3C986 0353D345BAF4645B12B441F35BA9AB46BE7C0ACB3E84E0A066EF1B44E76F7264 E548F7022424819EF56C7A917AD5DD80268898632FED22B6057CBA76A0275E72 69A3B27ECF7DEE9C1D43F2E15BB7A18D24F1FF9C02F1BB5A737891BD4252E142 40DF98670F0897B9BF3C60E02BD243125C28E177C19A18639F581AB7C5713D0D 618BA5EACEF18947E5849BBD2CF752696436D222A4244B1C713FC4AC9D0FEFCB 2C52B26FA451A61FA9D770212E5371EC2E52A39B8EEFE2967F15504A19ADCF3C BB25EDBE61CECD1D4E0A9DB5EAF6EF54071A624161F0113E0FE525D83180AFAF 8CF5D27D08B51E2AD43B22539734540E8460D1905A6236E07EB2E383DF6E6F84 6FDFE96B5EEC8759B0DE0F3EE2B4F984BA6D40CEB8654AAF7094F71C51134E38 9EFAC887361E885A3753650686E6C6797227211ED0D927DC8ED6E9006D4C5B0B 6EDBF506067E9D237A42C7FA41640A0E2CDD0A71A887BB2745B103FD3941F9C0 1B1092FBD68B12FD6BF6AD32814CDC85A0AAA9DD55D7243314AD90918F9EEC5D C0823FC5FEE0D593627BEFF2DB78157570692E6A849FA0DBAA77AAD8EAE7DEBF 336AD33663ACD6FAA6355BC80BCF9F8643A647376C973F8497C6EAE0D4D5CBBB A8A61CD10FD528775BE2B136C526070BDCA15269375F89731E32A331F33EF1FB CD242AB1B191E33B532294EB1283CAFA53F8CD8730982BB4265C89FC674D1A78 E675AD20F8AA1C1DFFB24F78AEAB8BA223F0E31DDE797032AC643E330AC79895 3EAD5E107EB71092AF2774E0C3F23824E2DA94F4529B473AB6C0081FCBCBD9B8 45BD11869A86E267822589F4A45EB799BB613DDB85202DD5E305E3D172CD605F 30D089E3AE70A158089469899C13BFB769958C8D37BEF2F9ABD085A40ECB5C43 9B2CFFB9AA0036A962072C282FC27D8FA9BE1F0B0AB113E80F96A455949DCE7D CFDEE414406F7798BE6BA284FB860A694E2F81821EB4A95F456ECB407D4504A5 B0D47152E95372EC6E81B2B91160BDF996614873BFBEB361FB8FDDB22090FC29 D5A9EAD120DDA69EA88CD80300AE2DDE878DAE1694F46F590BAAF718FEFB083F A96FB65C11FF4CDD7BD821CACA9A360C2084F96D15C33827CFEA6C6C36791B6E 2CF2CD24269128FD7FFBB32AF1E345D5DCC768CA3101404BE06A9DE762A051B9 C7D1D87BED457E65C244C8E257451C3BC65418E77256516A9AC64FB58882C525 E1BC1A58CA5E99702F36C368C910156CAAE4118C12CF1DB5B7259011976E93B8 88CE0FE1F0B203B3E40E4BCA7491EC69860A25E8A705D3DDAF0B9ED24B30A0CE 7E9BEA705D6D7C02D78341322405F0A6D6E1EAC98C4A7108F9C3A8D10B76B1AE 5F485BB6E359FCE6EE10F346AF7008B5532B05EFC7E4F0FF5580E9BA357F5ECD 5D86E6240E0A0EE3432DA7CFE2D15B957CA669C2273F61F8F92709FDEAD7EC67 420939BAB8EC9B7BF52D8F19CA81FA95D58AB5F19727157018C2AB45CF258FA5 BADC36BF706D5B191E11E30C1F4F5178A0C5681DE932C2B37B1402FAE1125F58 0BEF22CCB84A9DD65EBA52FAC12A115CF3B0CDE54CD88833769ED08DFD9F80FB 1D97D4BEC3692B287BF34BC20E8FA407C675C2E150BE17FF1A0C4008EF3FC950 BE7A656297838C5737255A18C39CDE6A53518BCDDE82B6A8A43A4685C9350B80 7F167931298612330A36EF38625F86F8D563A111F8BB3B02D5CC032386C5AA5F B2E6AA5E791BD1FE540FF315E6D07947A9CCDC04EDBF967E01BA02CA8E8AD66D C693752CB0F1A4BE087D63FBE452048F2513243ED607BB4541767AE959EAA325 D0DD64A5A55C3CCE1BFE2467DC08E90A1D9DF87B44E0F0268D0B1368997D671A 5AAB40F7DCC697124C62623466FB10909990A6724A601E76FAC0668C06953C02 C8289FDBCFCB07A532DF65F562D4FF7FCE9F5166E77A0D82C7F5EA434507BCE5 0204881294D45DB905DC353EA802F6251831BCB3A874E2E1797061395233055F AC844805DAA79DD8402BF902CFE23E6589F50295AFDBFEBD6D37CD0B82C45693 BD22B4C566B99BC8CA4C46B7089E46BA087FB380BBEF1888938A3A554BB9CA2B 45E206614D29DDE153C3A5CA8EE3DBBF1D77D2F9905AF06BFF7660CD63D92C96 D311734AD82D249B249D30EE70D76824EF0A7C7646DCE9A3C337DA87B582A74D 1B30AE0C5E822C352FF3C5DB0BD0F367275EFFDDB50011A5C39327ADC6A951DC A4C80510E7D96ACA191344AFE2D1A5EAAAD8007EEB8A51F581CD7EF460C87807 0D274570F8B651EDAA317E1E50B2E194B6F762E28CC7D4B1477EB9D31B46F78F 0C73762DE4A83B9F31CE2AAD9195712562BC40628402843328B1E1AE8D6F4298 AF7C9C0DEDA42B5481BBF1AAC4E6B3ECE92E6AB4CF48139214187BC609F3B6E3 D4F1F909E24AA654954B103BB89BD36D9F76C48CE7A0B17C6BE9D8E24184833E 391A96DBB44B1C9583B8EDF7287A52BB43187F651E4848649EDAAB1DEC3C25FB 79FEAD19E901284D1E84311DCBF128063973A32FF6FF386B46AFF18BF1E7C64C 18B069DCB3E5B96EDFA17AD846496F69C1F00DD9B81F4D46B004DB63FCE9E27A CE9FCED4E121B8FA784FAC3A49032621CD2BEDFA831B42F73814A97D22B11E1A 38D3FB4540010715890707828B3CE11B17D1ABD42417238A5AC472D9C8D8DEE4 AB6736D60759A1003A38AEAED363C71FBD05B51DFFF7D8782B0F1382E9C6660B 5E35E1BCAC6C69A64CC0B62561DB8C47FD8A9269969B9E6CA02A1D18C0456D65 C24DB4D14377784EA7490A2C054F80C7569FF90AD1E264B1E1EB3A9A8E0F24E8 E31C4D63ED7BCE3E6444F485278E4451DC1CA432CB51083F22183FD92466BBF7 FA4B6535AB0DF6DE9E4894A9B4F135D6C34A16D4D03FDAED260AF506117A66E7 FA012B2A97EFB0F819B2F579B99C9867D97AB6E6997C908C7D4CA2B8F305533C A4358230F2F1D1CD48ADF1C0A82F79DE6419A1ED438759CF1C103A830A1C1D77 F188FCE9B55C8E17109B9CA82F2DB0ED325FBD1B06A84F72EEAAB6D8D70189EB CB5E4CBC49FC1CDAD7CC380D54F7A98D62FB841FF387356FE397293CF0BAF503 33B992EB79DBC524868D2989CB59CAE125162C1396D8807F02D84CEE97A3DA5A 18D432F6FDFB91CA7124C135565BB5CE067CA968DD62F8F19733D7B246522D01 AD892793950ABA979506F15AAD043B4BA66D6A434A74AE41CC84F181808620EF 165C9C02AB17C9944EB9BEB185215FA79E1B3AFA7E1D5DFE062E35A0939D041D 6FCA58CDBAFA993EA430DDD3929CC16A75C7D667DC6AA302C24060CF8F9890E1 56B99508CA4FF83053C9EF6AC3FCA0322DA0E01C9C15560363DBE82CFC54F35B 5C436943AE6F16C8E99AF94FF64EA384AFAAC1ED0C2A966924BA4CBDB5BF6ACA 45541DF9F9755E0D5CB9B48530A49427D82201BE60E1CD3BDB389F48447D3BEC FDE1D3A32DC028A457215CA2A3EFC1F2E4853291825DAA8FA9DF148FF67C3299 3C03AABE7A43133D07726A6E98FB8D4A1726AE3A142B5032A7A3597197B47604 3A3EBD6CF2F410F7FB49FB6CD0D6772D9152D0328DED242054F11B0F2EDA6831 E36F5B24A45CBB204E884BCA15928615B2397AA1E564E30F15A495C0CFAE9079 186C2B481F7DE57E3CC324525AF90C7382A6C7445B4BF2BA89F65C4B14889E19 FA79BF4CECB93C5940A8F1C98DE3CD9E73BDE466A6D8A804B732B526AD4BD51C 3BCE1F2A49D7F96D4017F9C79BF0E7528E6EFB666E14567E5C60D35D0ACDDD32 CDFE5D1CF0238A9744E66FB66D5680C24694A88406BF44422DF27E4B2E5C25EA C4FB115E0FF66D6A646131FCBB4F2E621C5AD9EBDC5BB04CE4E029C957152D8A 2D7941E84DF4693A8F588047D70EE69215B0B0434BDB60C3BCA352C507394522 4B8DA22531827260666D1A719973713153F5F071C0F2EE18AD6A65466F414C78 78CA9535DCC0E1E56D01F59AAF961D2275EA14DAA97B873994D98C1133092BAB 589012509E648CC303C60C82F7346F897AA20151397BC47A4FCA4EB5224418E8 F877A5CE3267AD3C3E28865600649459D8898224614157326BB6C731B0812895 6D09851A2CD0AC24E3564EBDF859F795BE32DB1DB06FA2601CCCFB442885252D 565FF2F2CD53399BCCEDDB5552EFDC6CE6EFCFAE5077D7E2EC26FA50E8EF83FA 07331406CB529C10C2E8834C6DF8A03BFC4460CEB7B0A47CC3A2E5D3F7D4595E D19E181443CE00C992B97224B5F044EDD6DF15CDD48CA29F6976E41A67FA94CF 312D7B5F3FD4F1AE0AB22444DAF14A6563A557E0AD3BD32EF135C8D1281CB608 15EB09CAE15F4FC36E3A4FF5CB55DD29CDBA97EC9F0A480BA4D809F389F2D8EA CBAF9FC3CBC1BC601122823A2E095D5F46AB81E10F7D6E9E6A41FF12A7467079 E0CC02AF9D4F50F6CC53C16F183EBE4FA08C6C8D14FD51E1D4FE329525647F21 201FA180DF3792CD3CD5AEE51340B026239B9AB2643C921631C1111712621C78 C016FC996D1F7EB658A496CBA87EEA09C23020D9FA3D467BF71D6AA1C1D235CB BD4F5F76D7631C4A104C91233764DD7805CCEA7D07C7564F2DCDFB03BBE9431B BAC79C9FB93002787873B8A6936375F317CB3A2E4BA3E989FDBB2A0321790997 0241621DD47916EA28415178B127DC9058093250D6E3730F8C57BA3C04EA5170 7A327543C9BF4A8161334F2C4C1DA720DFC24AF5EB127E38067A12022AE64034 32DACF7CE8E25B2B6DFD0896F509A89668198D67FCD7472E903FA33501B9A32F 58491A9F669B98A25ECAD38523956C7EFA01E79AE208F5444B12314D37CE7EA8 EE90E036A59636D687AB9F56578D9E5A184447A638284289AAC1315B80DC3B19 1C8D1FF53A5FCA26655D2E4BA6D8779F1E88EC3BF28DDD22140BB975FDA72B78 02E69808E8607D93584F4CAB6DBDC1789534FDFD6B8719087D6C77992FB5B640 5BDE8C8BFAFE1F9B691B2137BE874B1A98DBB76576D40AAD985F8D745340BB89 F95D3EB90ACD2AA4FA63E47DE606E16A78762DB1533F04F0AD55423C2DD5EBFC E37EB91C7413E95520E9AF74A85B6BA31372CAC89A91DAF34AF9EC87C1E5C19F 7EAC8C50F30CC681B4ED75C08197F7AD6C4A6C95C7304FA56732491A4C667631 8E4B6FCEBB9C8C186536B7B382B10210D157ED4F3FC5A4F040EB9EDC43C0D70E 829AD7297BF6514FEC0ED86504C192AAC7EC3B57B190AB635B95B36C168A4D1F 1C7F2CC2E90664D4F0F69DFEFEA54D903D12CE3121A9767C14170FFD867D3D48 42C6826642AE5B6A5180E3DE0D42170256735CAD47B26DF5068C74310D99F9BC 04EA14BCFD1F1BF51DDF86B4566D89AA583709340C7BBC3665EA29AB1D061938 D449A03AA7EC41B595BB0885ABC137B0EBD834EC4691AD71FE0DF9D30996FDFB C359A5E109C5EFD0152D4AEF651389BDBDE763EE2C1AA3C7897135F8FA97F171 E3FD9E1D95AEA8F2D31A4F2F18F45250B452AC3768B1C7D728ED1F4D27BD0467 CC6991ECD1C2525EA4BA1D9ED5EE70C7C9BF579A6F04F12E34AC933276D92FAB F97D45AA75F1CD0C20701F5A9480FF5CC6DF6C8553348EA0A241B44738646394 DA236F88F53D1A183382B420F6A0D3F7871A39E578BE8F883BD0C6B03BD7EA77 24E3791D1D6BC2753F1F84EDF2B242A7DE30B354F1CFCFC3A429C427250D2057 1E879577A62DE28728F96F1BEC12E1BA409D66435D587711CBBB87168E5FD45D 4C405B2D61E223EDBBEC483010D21D8E6733E6314794ABBF19917A8506B37183 0CD6931742F24D1589F27EE6CCE04360E0B1C43E440349A731CECEBB62AB59DE 94E738713F87322E6F4B5F4D403426FEA0E45E23F32746F37B7E0E31A69F6EC0 DAE7AE4C3EE7DE93AB54DC3325AD405F389814F7622BBBA247A3CB858EC62AE9 D2489E2252E0D1C0E7AE7C14E5B72E18DA81B4F14FA56AD21BD645FBF3334591 9956F9D4DB6018FCA070FEEB31E6CA0638DEE5442EEF99F9F0CC4675EE3CD551 8004B682A1649B050CC874DF5FF1BC5DB4D33A5C6CFB4E529D33A45983047778 96E38BF80BC18CEEB6CDEFE2BA8F65E51EC9BC43E15E17CD9C64F45820962B40 0A91ACE263E8B78F440637FA55F506163C8553FABF89662703C094F2EC622F27 F1D83ACBD9CB18FD179B172DDAF278625BA1CF5C2065D25733D9942A851751FA B2A9971A050370B56215C98925E74AC36B2AE4B013CBED8F23C0458EE99C9D11 B86272D90D984E6C05CE153BEB0C5C2E7A66D8524778C31D82EE325B514F237B 7988F1A94394F498288B4401D4B639E4E819469A35FD4764BF0D0354EDE9E046 DF7932C34420471647FC91AF39588AE076987CF39145C28CDF3C82987E7DE26F EB20F52A9E2050CA53B8EF1F78B846C70FC4FB7FCAC52D5BED0287B01EF7394D 08E96544A175405D0C2BE4F443006D1D9348346CB2AC9FF48646709A2BF61BAE 0059DCC94DB11EF0BB3653A44D8CB7B3275C01B8B6E09B0B389CD7EC5148F2A8 7AFB64F0E4DFF01DAF8B29E628CC2137924CF68BB433E064FAB734314784CA6C AB3771A5BD98FA71DFA8806935C14C9016F3D8674182E3DE603B02D20348F876 A413255AF23080DED1D288549C4685643A3FEF2E16D05A93CBB7F5C69DED541A B3927E22DD1632537CEA77ADD04633D7BDED8C988EC6770CD83F48B74BB32149 9BE1F4C5364617BB1635336EC1D442DB160A51ABBF8AA3DFB9C93E20D9BC0951 98AAA43E29527FD9BC3DA340B7585EA73D5180969EA00BA4B393D6D88D33F7BA E4B2736AF1FEC5F24B64D6C64428CCFDF53F1CBF3DBC36035708C593258CAA8C 14611422F204148981A15D01FEEDB3D98551DA34357751C5F47591656C118F5F BA3452E7CB4F08F7CF7F1569B37EB2B64E8CAE7BF42E06DA94B3B261C01D8523 141E1BBE5B1491C0E6968C4337515DD0C0CC523D6E1852695E6EA5ACAF98BBEF 120E44166FBE2F0EA02EFCC6AB694BBF56A522FFCA2F3C2D43E5533A6890F217 99498AA38260AD3A4FDDC0521964534A74F99075934086F01E761CC37DB5DEEB DDAEB22354D17F4DB58F502BD23D04C2B23410C359E1C0B5B6AE4C45D929D734 33F500E907D9FD913E0D174C5B01FCA305E006638376E8E2791C39D0878EEE91 A72942E0F4637169DBE7A7089A7F9C0499CF1AAC87BC8F676980E0B99AC4ED8B 33F0F531F25392C6B35B5C91C649BBAFFC7E3312B2DE35ABC74C6E52BC042B6C A013F7E6B73FBC32E12B2A24CE86FE30D727E7A8F4D70CC52971398E9276315D 58D5F787068F3AE820A5FBC0EB7ECCA3C5A5C316CFC77DDD23BDDEEBA20239E3 F3872B6934C4AB3FB522856754143708E6D8BA83493723494329E7B864891A6C 5866AFE1AFB3E7B1C589795D073A5FCD201222A848C2044E5DBA03A154B6D992 AA0614CA56BC35D679BE120AF3EA4F5D65C9DE663917897D4001305735D8894B C4F92096450CF3B47FB0B0E4E6B703F70936CA5F86CFFD0DDAC00AED05369D2C 5F0FEDD9438242D96F5CB8B55BCC9BCDEABDA9BD33194200C4C4B6BDDB84732F DC9B6D4340B9D1CAAC41097CB74F0DB903F563BD0F83EAF9DD3F72EB33800B9F E03839C6C8F58A554F2A6AE4C5D87DEC7554A923E31D992E582F8FA3D87AB199 E1C9485F60C453126A28F9D713B0703B2E5FBDC6FF9E43DE0042152F81EA13B5 9F87C01DB8AA4DC7A79A1A0C10F953E284D51990849E20C5F5830C940FC96BE4 9E8B8A4B478CE51B1BAE7E4F37126894DC9BAFC200EF9E366A4D054B80500867 31E8911B0B75E16E690638471822B07ED3C230845ECDA423D7AF521BB5A8D230 29E019DCA98DD25A0E3587EB037FEC117966A28717BD96EE6BBFEEABB437453C 9563CACAF9F3F0BC5FF1805A596B1BD178ECC82AA33B31A0DC874F31159A64B7 58B8714958F49B334C285808E051FCB293239C364DD48EF3555D0E442D60517E 168F8D4480DD284A1B8916130F7A3CC9BBAAB9F95E43C59F8A21FD739523BF98 D5D851737E3CAF0E5439FF63BC9051BEAEEEDFEFCF491F586B1AB7D8CFF61BC6 0901EA7E4C9E770A4BFBF6CE909E8A6DCCB3819438D70088BB3F1C87B776A4C6 A90D03F224851A1480B468E249DDAB7DE3212684B258EE29194A26873ED61318 492C8C9091F3DDF4094428FEED2B39E9667E8344CEE8E93A7C89137EC66841F4 51FA538E5733606B1998A7EE5CFD4267A1CB0C01500503EC8759A825B395172D DEB3CCDA35F921175EC34A414718813BF9875D1DB7CC6513026B0A9D4D851183 DDF5E88913EEC31201F22F67773D1DE48DA44DF515A9AA924853E73ADCA771D2 5F2AAC342DB76EC44D23973FD8CAEB7E1E5303F42872AC1904F4EA6790CABE65 151EF130A25983B375E9BF4A5E5514B56CF5563AAF41BCC9F5A8DBDC9E3EC344 C387D43912FC70969FC7C0B6BE5DC1E0BFD0CC1264DD729931396E99D9BEE3D3 2339B4803BB8185697820D646F8CC15451EB9D8D26124B5CAD7389A8F3F5DC87 2DE9B3F5A6E4BE87AE282E8B8FAA9EB0F559A369683436E6369AEB562DB3231C ECD34DCFE68E8B660A3ED80C0CD85E4B29E56C93320B4434F59F9D36D6F9AEF7 1001305EE280CFD4C7F84B0CB42C8F1A2838F78C08A041B3827D277831A8C49A 54 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTT12 %!PS-AdobeFont-1.1: CMTT12 1.0 %%CreationDate: 1991 Aug 20 16:45:46 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] 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 /FontBBox{-1 -234 524 695}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F0364CD5660FE13FF01BC20148F9C480BCD0E C81D5BFC66F04993DD73F0BE0AB13F53B1BA79FE5F618A4F672B16C06BE3251E 3BCB599BFA0E6041FBD558475370D693A959259A2699BA6E97CF40435B8E8A4B 426343E145DF14E59028D4E0941AB537E34024E6CDE0EA9AF8038A3260A0358D D5B1DB53582F0DAB7ADE29CF8DBA0992D5A94672DFF91573F38D9BFD1A57E161 E52DA1B41433C82261E47F79997DF603935D2A187A95F7A25D148FB3C2B6AA32 6B982C32C6B25867871ED7B38E150031A3DE568C8D3731A779EAAF09AC5CE6C5 A129C4147E56882B8068DF37C97C761694F1316AF93E33FF7E0B2F1F252735CE 0D9F7BCE136B06EE967ABE0C8DF24DCBBF99874702ED252B677F407CB39678CC 85DDFC2F45C552BA967E4158165ED16FECC4E32AC4D3B3EB8046DCDD37C92FDF F1F3710BB8EF5CA358ABACA33C7E5ACAD6BF5DC58BDFC3CF09BA2A38291D45A4 C15FF1916FE2EC47FDC80911EB9C61F5D355BEDFC9DB17588547763AC5F0B1CC 12D2FFB32E0803D37E3281DA9CE36C5433655526ACFB3A301C56FAB09DF07B5D 048B47687348DEB96F3F9C53CE56DDD312B93D3918CD92AF53FB9461864D11B8 0138918D0B1270C54873C4012CDE6F886DB11BCEA04B023EBB43E0D0A06BE725 741D08B9DB688731A6C9886C15A83C28DADCC81385EA239E045E8F3670CE03DB 9EE77ED067036595C9F3B1854343BE3A12E486B6E5A2F8AC44FA5378D28DCCEE 306B0E283AA444423F9A4FF38E2B56DCF67A39CEB2C643DAE86865517D5D0371 CB8797208ADEC637330A3A57902C9A88EDB75A7C16FA9850075D9F19578EC666 1353CC1FC512D59DFF847ACCD3D03959C548F21BF622A6C3224EE815E753BC87 E0364A12A1728D0762C266515BFD30F7711A9F1F796BC4BCF679918151320681 D3202FD01EE5901981E7EC55F58812978105DB71D10B0A5A39BB69F703B11160 71E527862BBC00736D616BF295EA94ECB611548BE15829EEBD0909514403608D 4C7C220B61E9F004D1CE7760F7D96A75029244E5505A2579171BFC831AA0C18A 5D09BC573A582787ABBCF9C680DC4A5F41F6D7208A4DE3DD4E566675781B86D4 7631FB52070FBD290AE6DE90DDCBECF4A71A9C04A88F4DCF468E3256B3E240D9 86688B5DE5C0EC734599CC85478045BF32033E14B99C532D3192440F4D23BA99 AABC774E8978CC4CC681102FECA5969C404FD82F9A0E9F772ABA32D9A309E140 C33E65CD55DA1973802702A9D38953F95734097864C045690EB370F9600CF504 1D8C256C3F54789A39130AF465468B2EC43496CD305352AB5C50B19B6D025C0A 8D85950ED3DEDCE064098AB2EFBE0E5470B1553AAA691B108AC28B169609B244 B9A4596E9DDDBB5017847AE359E7CFAE76951CDB353ABB5EAC83026FDD24BFA2 40899B9A904389B04CA8EDD18D19574585FC843F2D8459EDF6A296FFA0047F3A 7D08570D877CCC8AF22684DC4CC7BA11F5E2296FCE728087D5394F3D2E4CD157 399E3BE34CC8A97E4D9B7AE8A54747C945C23C3A2E3C07307815EA77E3DB8F02 FDB2E31E2EFC2F4FB10A6CCD14D6C5121AD7DE0BC201BDAB24998DF9797D7F37 8C00252AA9783E54023EED68AF1D0A7C3DE94C0D51DFD79F6D1CECCC35FCB852 C7F523D4CAD562FB00A60835EA49753F176913C4B79708A071CF88E1757215F9 4844D934D0F0DE9E79A4E68328C9AA900C8351B7A51B5504C651FE9C6832AF05 72A710A16C7693C544D585311E6F81BEC2C33BC8BD3FAE4E82B0DDFCFB1CE847 B4BF65F30AB480B329774BF6BF1246E2D1F402FA72F4298B90887DDE0AD09DB5 4CAAC75BBD2437B7B50A9F42206421D0AB69DF3DEBA9F0134BD699BB223EA67B B65E5BFD4575E7DDEF810B768D568387AD94DE8A6673134B824C78AE36D0922B E21F10BA2267BF39AF9D7C06E64A467D96A0F8C4B6733BC9D801FC391D426B46 7FB6CEE46D3C2DD27770565774258E5F2C5773D82F491039976FC29DB4E86213 0A4D9491E5EEFE362AAF37F6C0FC0BD6C285CADA011201809FCE904F0C558834 FF6EDB62354EB38795A4FBA53A670912FF984A2A702B9898D4723FB993AD10D5 E8A3CC543EDEC2D6CFC69E6DB0321010D6A7FC357B9B6292A9F6D5BCA1FC5B62 E769CB1BD40E7711A0298D1A425DA896B11A68DB14795FFD9FCBAE6C35DD3FEC 6F914A57C65068473594716B2CE171E7B59270B129233571D0A5D6D477907286 70057B799C2BC43735E2807CF34BD920C25B736BAE8034A6B8CC5E39EB4B7989 84626CC8667E5912BCFE3C9FD65DA80D6CBAAFA6795E8B9AB9895EFBA2C46704 64FFB18CA92B5215AFAB89876C41E34E5C1F14118714F73E516210C21D44D038 F860AE5512AB012BA7931B8411359B63E6013B3599EA007B774D6B6D85E872DA 979837435B5EC037B756A26BC1DACF1050AA7884F3D694CC4D829688D599C994 3352EF1436AACE4E456C6C8E1DCF29BC276D6B2130EFA0F2318B7904F3391387 EA5650743E6CB1768F4A9ADEB48378D1B86513FD8BF92864812921D262407DEA 276AA0A2ED0C36C7678DD04C5975A8D9CA8A315FA127DB1DE6AEBDF79375543D 654BE2B92AA5BBC5461CEA72A689751C884E7139AEEFF88BC589DFC285CAA007 FDE71A258B28A382967D314721B5D29A2D31444C9EC9A3481247E6C878D3BC6E 43FBDE0B6E18B7540600F0060455FDB2294C88A0C67D635103151F8FB91696DE D372C14C3742AEFDA7DB3A5719CAFC7BA3BAE587B239F2D55F33C70347558225 1C2A16490B20E00C8976A27FDD326D2151C6FF53CC045D2EC1DFC9E01C169FB6 AD694DB6D8CE3489977471CBB867AACDE52F245BCDEE90C3A23F07BE0E7E2094 7937446BC05A1705D86BB65AEAEE557E4B922C542EFB6172DB59FB9B49785C7E 9DFE1F47B9FE21B6C0D6436EC7E8B1A057B8AF5128E5B888589EC1307734D22D C2B20BCBCC3DE667F067B44E9D0C9BB639B054CE402EC991B5B12F1A8E2E6BA2 E50CF2D44A7C4C10EC7DC93C472B75ECEE779FCAD56FB7F293314ABEC48CCF74 B04B2AF9078D0E57E936440867CE1BC1FA8FBD944E3EA779BD89977B7C0FCE9B 6B2E4F4895D91654FBB5788FBCA84985E90E92E5366CC32DC874B51ED2281CF2 2E6FE6BE3B206CC18FE73233F014451BCD5D8C2F4873DB3EF2A393F62D5CB2F0 B98CB8D8E19DCC6F885C4E8F7BE5F96BC34661DC6FFCB457F3642866D393DC45 FE66B8AB77F95B02ED26A9D550860BFA4AF0881BBD5D0F01F035FB466CDB8C9D B6406B2679EFEC268CA1AD8D4CDEE2D47D6EB641D13AB7F3151722588DE3E2C4 3EDFC0BE4B9A65D0CBFA0F369C9900CC105216A86DB6FC9338910DBFBC4F3447 531A32AD80C30F83BE7183E30D9C49D00CCABF3C615A94917851D3145F7FE82B B62C60EDD92FEC634274679B1BBCD979F502CCE2D76A7A273D071BFF9A6EE664 D88B56896613CEE8617A239391A3140C55D8EE40DB0EF84E1E6F378CA62073CE D0C24F98F07BC80875B0D07E8D449344826CB71659AF33E196C925256B11A737 066C9A1FF0BEF8C90B068024B012A25E605F1CAB88856FCCBA52F23ECEB9091C 368D3616332718EA80A122C74089B911DA55F7AB3E4BCE1C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMBX12 %!PS-AdobeFont-1.1: CMBX12 1.0 %%CreationDate: 1991 Aug 20 16:34:54 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMBX12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] 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 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 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 /FontBBox{-53 -251 1139 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF 20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D 68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E 26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23 337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598 0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6 472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26 30F19E1BCE69BC499D860F9B17E6A78469F652E1FC6991A91F9978B9BC027D54 369E4A59EE1C03C9B0F21DE425F4D56FFAEBFE015BF1C1368DD77C7AD0C015DD B05A6EF47AA55E82DF783AC53A410FDDF14211892D18481CFABDEDC5BDB93027 4CB70E6274C41C2BAF35E928CE449181BA6E7B26F0DF1B397DEA0033C1923E1B E269D731456CF82C1518E140455451382F5EA496D0DDDD571BF2DD94843DE64E F6E73F9748288C2BAF3C59CDDF0D83BF7A36C90963E08DABB212A738BBF4066A AC8CA286A0ED2094A19A22D3A9EDCFA19D855E8471EC346255D502520FAF6C7A 1E8C11240EAFCE3BC6D791B01F27BD942963524FEC6A61223871D8DB2CB89CCC E139DF92AAB0DC529D47C74A55287C5A846F7DBDC633D3B2F3E1FC9E3657F8F2 E53A3980D2731E05D4A590A5F7F31F6C2D8067D40BFB024A8F97A1A8FC6A593F 26A6857FC8D7F50A962FDFF66658248FF36EAD6D024419BB101E0CC0F543CFD2 12CBEE8D9F44D3F8FD5A4FF70626B462421D831E09DBA3E54738A6F17770002C AB138BDFC1130F8BDE9D34A3FDCA988EA810008B2F374290F3836F8E08AAFCEC 77F78ECEEDA7813AD79824026D20FB106DF5A508330C82371BFB2EC25D24E409 014A288ECD37145E2BE9B2FF823E6EF37E2694EA922CD758E639FFBB70E10D71 CB4F0FDE41384220D7FA3F32AA91EF012B1B1471E993566E73A40505EA2E42F9 9E88EAC350E5CA9E3F7B6D616B17C007820F4269D6C3DFD25BC8E592EAAAEED5 8F720213E94A15876B206E6A1B2E999697BA23250EAF883556D6A226B9B762FE F790243B977887442C7C31A81A55A056C88A971BA41B3008275B021AEBCAC643 3008834007A66A7923D0CDF62E492E47E3AD8E852B0780F7D449BB0F96650F8E 8443B9426ECEE46FF25F2A9FCA4E5EB5B616CD6C68E4B84E2B39EC2FD713CE67 BD7459A5567C08ED9BA05F1DBC9C535DA766265612666DEFC3DD11F7C3FEC3B4 0B78322832C7984B4379AE0EC025A27F911FC4F0386774985C96399C1E7355F6 99115DA7497132CBAE3C9F87A9748225744CA4603AEB70A5987C0A2566CEBAAC 49DC3B4C5CBA09DEF0AC0F07127AB83666D0B35D783DCCC86E858F9393C0F52F C9D21C22B383421404E7D8F5C2E421610D1B48F46C7E97D2443A596C158567D2 5F6871CA1D0D01DB0C423A86C50826A2C052DC01B8E7AF94D44E30433585124A E07F813A15A23A9D8CD5840228B74182BAAD3F7B1652A1B30340B9D65388C7FE F3F5AD7CA7E91074125404607BABC9B04B8EB76E61C4B1004FD3D3B97290DE56 0053B51112AD71094C1FEB4C7A23A07CE32FBA8AD35FEA07E3EF3AD81CC10EAE 64D84FDE52992DB2B3BE9B4C2C36D1896B55A7848210C4A010D864A3FA8A3579 0874AD97935317B618FF13852F48BA817E2619749222A030899A70B13F4D180A 8DE07BF7682E5F08B38F95FBD8ADCE85521CDE3B2516F22F0E321FE0AE2B9B58 9D52147DED77F651EF8BA7C9541CD79D9F0E84AD5AEF9EA592068AE5771F20EC DD03C25845ED10DF57F33D2A5D0AFE9B7721E4B4CCD61858D9F52D6CF6377EB4 5295F861A29F568C14DFAE32126EAAC9F83694B83C2B7411F9CA1F52F99FF2E2 CBE734427CC372856C18C6678EAA8E7412448FF0947B03266A9999208EBEA70F A60DBCF81DA579A49CEF39A8F7942CCF4B53427585F4F7810F28E20E921DE8F7 9D39675C943A554BB613F16F3EF64062BFDC7A99E3C9DF5025A877095480DA46 9166288C7172D8FAFB26CD89CB7D5B1892AAD1CA865F2273ACEFBA32C7D7E72B 78B863B0B9FB7FE3A707AC1A88B6DD46432466B05E417ABA7C80FCCAF63E9B43 14E9B98DE85292362B235DC195238B468EC5AA1969892F2C3E0D501742ACC8CF DEDF269DA4E5C5D9DCE7F5D939EFA5D3064305D0C2F867F0D22C17A56CC7F8F3 74895BF8071D352446877A1BAA290A3B97357E420713886E17ABA1BA76C504DF DA93A9B2DAE9A5A47101A20A359976806DF926E46895F8937E132658BAEE64D4 256E739938AF703B05CD268FB98F86206134543B73E191337458A4AFBDC8601B A20664ED640B95F5A2CF4AD52BBC3D81747E4B619E6584A11B7BBC4B3804DFC3 205EA47AB5FDDF018DB9824B447BA99E290426A8105F9B6E11E1644671483AA3 8645D62B6B07F1C5D27C69E3147B09722012B2A56CB41643205ED7D9D00D7932 FD436F2FA0F736C99C6AF7C539DE2F458C8B3514C5DB64A78F0A0C8C73CD67E0 EFAB859D00DAA765C13D2FABA83097A05877E937BD542623F392F8E1128557DB E401EC34EECDEB59EA1CAF3C8CCCE400968DCFC952AFB7C008D1ED6A6D2C818B 39A77A22E8EE72EA118A560ABCE819D9F8EAE383132093669D7D0DAEAC591DBF DB7805B5E5A04005BE920843271D8130870E3E6910DB62497FEEBBFADE456CA0 1F31519DBB7578A9BF3345DE30A2ABAF83A81B1C6058FD328F655062AD58D04A 7B21A4961991AE7A26BF3FDF644AA1606D4196EC9BE4E55C590FB2061A767B2B 831B876084D8052F4AD711B06277A92435FD2308D26C8A0473B599A19B6D5F02 FBC09157D9518EAAFFB6E8126ADAD815B28328AE89208F03177EBE3AA0B971DF C32C33BA930AA726F777548D33ECC7F47015F9B2E25D93657E840F46D4F209A3 D3F5A1C682DC2B1AB4AF7FD9347EB1018FDAFD9C4402FB4F5643319243B9E98A 85AFDE9EBAC815FFBA85F8E8F87A0E3E0C011258782399D05B621E9744C828B1 5C30FEB98092C4158EAE6F3A104A9CBA33695502788DCE4CBAF736A36B4DA40C 40A29CFC4FA95E861DC9041E955A1688539C4468FC059ED1D6D3F8FD64C1B405 0D11B4EA2E0ADA8D09972AE83B61719287C7C8C7BAB7926563EE59E79A7C6958 C413D135AD43E4574893F8EE9EDE8E8979594FFC509D0130010B233B8905F440 C9C6A0FF1BA97899F2EBACBD98E55A9A192AFF23E070BCD4598F09779F2A5EA1 8A749DAFE106BFA4803B9FCC327E9C9181C525BC8914D17814AF08CE5E861A48 4266AE3330FF6EAFF4A1CAD6886FD4F216A6CB7664EFB7D6BBFC88DDB24ADC14 C0EA67F3B3EBCF9AC242D1BAF8D0F13BC23B74EEFAC85D77BFBA4799F61D150B FF6E20D1D4A3C554C2DDCE0E09E78FD93A9C918D9C2395E440F38015541185F7 93E496FFF81B4E71E322CE850DD92E81BCB326005D3B7D77B01245AC631D870A 73F917717A6A5377620FECC0E5FF5D3315D4621EEE65DEF2C3B9E5C3A9C771BC 35E7D3066C836B87771E171EEB2AAF21DD79417F1FC8B5A920CD277713BC3820 038F87F979D52500CF36B783AF02E9EC2EAC7BB285F81D45A34F92EE8E5A4189 35D8B2D290270293A3EF3E4CC39912F2776B2FE2A4E711BC481773113CB9B9D4 1D7387458BFE25C412E1EB4E6DE05371325841BCC75122776B706AC6A63AFC47 00946468EC67AFEE6E6F8F9643238F80E39F2995405D850FCC2842163DACDE1B A48238865B68D82E80F6415E33313B77E9F6203F143C05FDA28893F96C65A119 741AC7F2911A149EF804EC845CF1616559AFBAA824175D31B385E9851B3779CB C182F25BA5EF008C67C61B422226F9DE470DE590EDE30962E7BEA93BE1CA59D9 5653886029F399431C11C6805053D93BFF8CEE4B53958EB6E14640370C1E1BEF EA5758D169239BACC3D3A6E7A3DBE36FDD7BD3F12F64E5BFE896D8388FF6ECB3 561724E1F66F5F95F21B33783A4ECFDB6107B172198104F38F9A9C34CD41D396 E6F6292C53429092D1ECAFBBEFA55187510A4FE01D9AC5296F17ABAC96B5AB69 C5F7DE27CD510DBDE0B889C1FD0F896EECC111CF40E92E37E96564B7CE3F0ED9 212178D6B27653CB412CBAFB6E24C6834B5CD4BE2A76EFF5FEA4C818B0A99961 64860AB302820155A018E006D72214F5765C514621E3490279E09E94C34F91F8 3745875D9CD03AB430E59229EADE37E1DBB9DAF7DADC7E121B7F072B1CB03300 663EA733D6BCF6F647FC3688242ECAB263D4DB751A4D35BFB61225D1538382BF A2634F378DAC2076E415D82AABF67E6FFA138CBFB37260DB5FA41ABA1CEDC05C 1A1A049F0721645E7C96C00849887CD5B0DCA715307605DB92DDA5B968CCB0B0 894B5C0E4117857373F886A5E99AB0A152EB37CDCB0ABF42FF642747F98B5F22 3247AF6874892D1435C5C83C435762B371D808BB40B6A3EAA72529DBABD167AC A29BEC7173CAE80E199756B1FD49ADEF2D9253DD7E7C991C150F3EFF7AEDEB09 BA787D3CC7369CDDD87EED4017C0B42BCF644D9058CA6AD8B436422CB87ADE12 F8EFC558E2E43940F6B69C2811D3EEF0D7562F455566FA57518B8F8984A58772 EECE76024C630B1345065144C7A921773044BBFDA029CB1B9612AAF872E87FB0 946851021E24AE2EFC0D84677BDE5FFEF6C55861B15035DC06E2A941FE802237 E1CD0AF81192DC69492C81BF8503BFF377B3C12199B30717F1A1E81020F4B385 31F1CEA123464F7A9B8A33E6C9B1E836DF6A7477B9ED9AA5A21281B4464C5791 9203113473218B0B5C1F2EDEEC257A31B5B0286A4158BD7166FDBFDF19B7F294 27BA3968A1812B9C20CA8724BA005150117146B9A9532A7FCED73455A3CD0579 28DB7764DE2F0B5A9A907B5EC2F477C3BBAC430301BAE4E615646FB1EEB62890 BA0268D1BE1DCE7F845E70146CFF852CADB4453EA47DD6341D1F8434BF19B4C0 1942F870AE6E5213724CE2611254A101E346D3492326E596A7C0B984B630BD6B 5145C5E91C3875F3244DD4965A3B56D759050B3B37ED0D2F168C99C804C52570 D83382FFCB4D06399DD3A0A102752E3050F111500B2B0D075A5A18DB72E76C2C D6FE1F028FE2B689FCFE089B49F3273143CAE314C986E6D1F56D7C5BF580C7FF 0CA51006B1F044436DFA4B45C21B0CA9E9887525B6F88FCBAC59BFFD7504EDB4 E6B8EBB471F80CDF4D883FE75CA3743C57546AB890ACB7815D8CBEEC38825F82 BE33E462C79C9585E909FC987FA86205ED2478E8D1B0D7A4DD70FE5A9F8ACAD2 E70B049C6FED63FC48E3D5BDBAB67282A66E07109272505BB63C480FA9B2C753 60F58761F294154498B8565BDF8FD01A3676D39B8BD373A12CF298F281929260 AB2B5E1DBF2817D15D6FF4B57638ABAAD031DD3EFE44DCA5F2DECBA4DF397EB0 83B4C9DEAB025C75D8F65A339F3FBB9A70B0D786A836E4FCF2F42A54CA292929 A431A35CB7DF6FFBB0F9679601270AA19C992F7B95114F461054B38ED9FBD6A1 2EA3B221DD2F357BAC157436A537B37168FBDBABD738539D16216D9DAC15EA6B ACBF9072E209817F370DEAE812247391DF38FC245B803EEBEB2838C3BBE1269D 8FA49A29EA9AC18E12D122605FA5FE2ECFB65F57D03047A09BA5E0FEFE06699A 1A078CA7CA4BB6AB935248CF6392B6677CEC876F86E434FCBAE20629B7E78997 13F4931515FDDF9865097788B3047C0C3172CA0D8B84B2C27FB1BA5B4FE5FA1B FDCEAD06D4459E5BE0EE94DFA465109036B3A49DA6359A33A7C965D4BC834356 4EC4C21B58212EBBEE3D0B0F70573E2D35CD5410C3A6B233639B0919BFC95899 D0DE3B347B1026817CA0001AB441358606F664738244E0CB8959F9503EB46D7B 944BF6B80E4C1931BE88E813CD360E13122511167B560CDAE652469EC7F61AC9 A68402D951AA93E938DB6CBE3019D8EFF62F9F09D148C3CC3C63F45A1AE229BA 9BDEB00033EC9BAAD847FF6F468AA838A62353A5331D7425ECAD924C3939690C 6E7AA3F888F9FFB41FD42F0EFF4784D442D82BA5B3647189F8FD292689FCE630 5331D2B45480038D37A223C9BE0F9C3F051F7F27E953CD343681E9A8049437D8 5198D7634E3352771FC06BCF51010E0BA04F318BDFBA1D90DC49898D72949F8C D212F1CBC219C7377E51B2E01A60049B3DEE629E91198709703F027E258356B5 5AEEE1E71EADD63D43FBE0F09F564C3EC9C321BF23C07C541D3AA214E57EC8E6 FBDC9F0ACE3DF926FE5B4FECB8743A2FE52A68ADF9910B2ABAA072B137A0D83F 006570B4C31972993A3352DC54A05BABE799D315AD54968023CED4C033BF1242 9BABF562FC3168175AB0AB6C191640A29624E0F42E716095E631EABA67D37B96 F496FBB228CB97C089D844F6D6AB7379ABF982D1C62187B15F37333F749125B5 4BA7DD4E63699BBF4E982DB65824411020B0E414E0C8432F0E1AA737B55EF0AF 46213A161E4EEC0A4011185E404A4AB5231D3CA295ECE626CD4846F539921E5D 5061BC58D6D1114092AF8E3A1F704A2EDBBE43638955798AE058B94BAF7A5893 E17DAC82A6CDAC9FD46A41965C73E91CD6120D137281C4AA37477B5366477B92 985BCF335E802747CF7F261664C47AA4181C551CFCA84282668E37F7DB5EA45C 6E7D583D24F2DFBCC3A1A735B51833EA222918765A8DA94484C8B51B6CF2ACF4 89A3DF198D7DCBC46E9176C84EB3DAF0062E721F84CCFDF4CF6963EAB0E02F17 6488AAEF7D896BFDA94D99E6EAE2CA90BEFE6A43E346D67703A82CEB5B5FB013 A53A6E880C5DCA893D90AA9629F46B00226539B76757E703E83AAB03D2847FCD A4B433C722FCF52E5ED51372D4E2CD4FF94AAF6C2B6064A12BD5733813500274 9B571AEA311AF69F6CF9F940B9FAA34F4917FA97C09C3C2C93CAF2E1713FE30D B5A2D1B9D5F28D9F0A3F195AA6BE2B91BD8ACCF5095F62E474982D872121A430 87A9877149ED68A11E61DF7991C50E185DDA1BC88B209DF3464F06D4282037D9 EBB745D5A0D5C6BE0051E5381B6B85D415A81F936458BDE11049E8CCA0768536 7EC223F6BC86004770B18A0670DA9A137745CC2B794BD62DF93EB5EE077DDDDC 88C132C0A99BC7D3BECF242C384C61A1979BEA575C4BBC7041E8E5A7B9DED402 5472A375FD386B2A081F3F49A3F10B66F018F3A05BA063E41382B472491E2DDF 891635A8E49E5EC0F9CE94081249DEB15D8037A01A41FE2AC505390945A920F6 D877BD927F2CAC2CE8EA5EFE2504DC46D57F555721D278D8ADE95AFB502030D8 5DEC5354166941CB96DA86BF00F1A8C52AA988F5E09C4644F615EDA7280574D5 9C7CE7D6149D520B917236E87F5ED1194C6EC70223DF0DA086B111BEE5E3F7D1 9EB4ADB52C35C084222230F7C924FCD2F47911B8ACDF27D10148F5947F068946 C69264CC93C2F0D76FFCF64645C30A5B18DD5C2EC4A702819458915CFE982E77 95ADE2F0D067B15D4C31B7A1E3E278A627DA7714B720754E3FDFCE8A02B2189A 8A288766C242D23C2ED78E2355798E21BA67E90C205F740908F3307420AC8CA4 12B7C27D285A3B8412BAC33F69B4AFE9D0113A391D83E5E5D5425BABF1105D86 BA7768352D7CB3DC4A72A71C636151E314B83443FB7A84E35344C4B6F3DF3505 9A0108D3841CABCBA8D5D32A1EE34DA9EAEEACC3C236ACB198933E8F5EBB0395 98BA4667953D80FF1D78C204CEED88669B06A157EF0C0FC137EBBD82EA2D652F 042CDD45A5E120AFCE799CA85BF7BF610CFADD91BD92187F7E2AAB0E24013622 5F078CE0CE9673B4F6CE5ED7542C2F41784ED2A1C763F721569CAB3A436FC46D F10CB49945C096E903ACB895192E3A2577E81832CDCD52BD00832711ECFE9677 79342E0A921FA4BCAE2D1EA79AC6FD946D818C4C58699CB04FC349A0CB5272AD 5A4A4D777D1728F79E26EC9717FEB258788E54186FE30F2E9108992B522E5D6A AE97E4BC589340D06A28BD597723E8B87E8F2B99A84B63BE0AD0FFA511CDA1FC 53F198D2A66974EA3DA147EA6A68B2DC2F120B44F8101B724640D08CBF77047E 6C99CF1D0CFC2FC4A52F0A715B224FB81058829D0C0DDA4379B668C342D13690 2ACED593F76DA482DF8D9A9DC92A4A69E2C3606FC8BED180A7D22A1075918161 95CF0FA1AB1BE6AAAB1820A00511F871E0A3E55A036486EAD548894DF391969B DB87D0FD1EBDC8344667321CA472A6893BE7B59565479EC85D21DC03A7AA09F7 F998EFFEFA2C6FB93D0FBB8B4F897C08A61435776A24719471CF0A0C22240C6C 17B3FBE0EF28FFB9AB574B7D38BB11CFC62E0F4ABFF8006F94DE250706DF133F C97317ED9867045906F13B1ADA637E858D105423C6EF3C28A633DCD75308F80D 93889B99A89DFFD792AE7ED5579D0F2A82FA45E41FC6C0ADD5B6C2B9623259EB 849C4A4D82F88CBA96FBFB2ECEA6AC67F15407688319991E3A426FC440496877 3EB7F526F755F6DD3FF941A6A2F1AFF6B3A6A9DC60C48EFE924A54EFA164A3AE 20FA2448A41464B3B1E9D16249B4D861A8C91670B1F7994C81D014A25D35112C 4B34FFBE0DDA3F3F50F26F1E9A6E793EF026C0966E0B036E0C5D5CBFA5117D2E A00EA233035DEB0A9D80B0D63EEC8F78A0FF0B4256AC9B2F47F1224C4816CC65 B518DC59F5CD4264B88372ED513B3CF43011C48B4D1BCBFE342A73D647992FF2 B1FB8F398E8FC21F1F0A4C70D8A505B10E452B273C3167EF909C44472F55D464 DFB683574220F379D350B9195E409C34EC39F35E468D32DC1A6E47BAE822F77D 8B12A221EBFBC19A70D128251EB8D3389962708F82DD6B7408372BE6565139D7 A774A3BBA0258779C62C68F941C29C36B658386EB7DAFA96B659E983FC7BA3B4 C8EE0CD927CE9DCDEB6F3E4EA7E53112899CA7A3D08556557F227919291495E6 639615687F2D8BC26E10BCAF72E6DD89EAE218932652833735BAA71BBF80ECB3 C924002EA55127010EA56694ABDFC964B90CB9F2C33C9EF78701AECD00B23693 02A009CC3F8FC6FAB8ADC30679B74C19A985BB4D6F3D1DF3F3C5C09DBEEDC9D7 641275E1AF7B1DF55317EB3ABE4B9BA16FD41F9A072C7AC928BF7CF3EBAB86CE 464B6DF5FEB568C459CAC53DFD60D991F09F68206D9DF48752F5F1D073F014C4 06C627D70F22498CE826899C19FA15212ABD0CE18DBA483BC6A2620F390DBB37 422AF4A36FF7BC786E36A16CC0B29A8B4AA28B866263580058E1DE25E0E53223 B97249E8DF3498ED768FA5A39049ED70443B0E8F4F6A9C4E582AA710B13C91C7 AAAECA803F0C908656134A8253BA7FBBC55C85240CA3A5747ADDB7B8C01C6F6B 2B177226463DE6E4342C2CEC1872D384338CBEA3714B05540EBF7381E112FBD1 90526616F09AEBF836C16CFEA24E5B0EF78F2D97A856E2DA8C8E9428E7A15FBB 9DDC4F97C7B7C5FCABAB63CC9C96D059B2BF54BCDB4F32873D6F932A35E1BEC1 856700DE2AC1F6ABA2024CC733F5AA0B218E1D7415D22A5E4B1082547A3CC7F4 F474AA19A3838291748E4F49EE98869C0F01B7DDBC977A3B8E1D879C0BFC9260 70283E9FFB6650661623800E0E1514A160CDF3DCB5C305208A1243D8B6CA5D0E D135C94E5155DE8A89FC859B211EB26849A167CF9EA8660FB9E2E2B19F0158EA D00356F52E52B81C7F7E98D6D3D1827AFB9EF8C83C9DB91EE6E5767FB1A3BFBE EE596310848A822F323F421927AC215F7604C86486F560BD1DDF585D371FC54D 898BD493D4E49E1118CF3488A3122441F709B6DC4A44AB95704A9530938AEEDC 4A7F50E45C246A2BA91A7A9DDAA6B6CE2E9657E56970D0E5407BFBBC9A3AAFF9 A32C8EF2904F0C3E85AD10BE2456B8D2BFDF8913C718EF11E27B7DE368202FEE D6A633614A6FB095D544ABBF7F015B530A92E29843D5928FB74901377C4E60C7 84BE89074A79634E24FAE41EC7EC18C4652A915F7EB067C469D730DD5BA3ED92 9B0C11EBAAE911D207687EB0DE2438FFF5B5FBAA361E379B7B9E55837AC94D0E 98931C9345E4B3536F1B01F037BE24582795D547174F3EF81E656C5166510AC1 72F973AC5E3BBD242B7332C88A2E09129AFCF06899E549268AEA6F26098989B2 1E40B71F50A9359A84B8A571AAE3E9A46DB5BED194E2476A14077E11C4ECD532 2DD2CF8744A5A685E3DA650EF9357377C3906A2339E4A47A18521BF479683882 6617F607BC23B484318F67B54F04563656E17DB2278ECB617D6700404E137256 339C01DC0395246DCFA612534E721C0062527CB0B8FCC7B17E1D12F11B880251 7A34B2F04EEF3C459F34E8D12F79DDD9372B62E214FCA738D19D7EF0EA98C207 6C2DE95E4C910862EC793060B2617435592C0F97BDC46B7A271817E20893372F DBEA1627F24FBC77E180DD978B7671E473E8CCEEE8899727BF9379AA7D55CDAF BBB0F5AAD672709D529B5692ACD5C97439F3306AA0414FEE61E0D6B5700373D3 6DE8006F00FEC8F67BDCEEDB2E2B49941784A5087C4788C16973AFFA33D7173D 4D0F7F302C55765B4C4E2F42E7F5DC865A5154F73A7673173AFCEB4ECF23BAC8 20969C981F60816C13CB7221068F9099C9B80F179A45B85EAED3E7B211A53839 6A10AD15E2535EC1716345058F904B7351A023F7DC6B71B289A1CB8E41444C23 450B9FDEB1AF3D622707F92949317707AFD55332EF155DC1945073C95792C782 96261B3921F969DD7BA9BB1DC4B6061748D29A255D411B612F020292535B38D8 853030FC48E29C8896982894A2C49187940B5CA455D83DF2F0B5281AE3FABCA1 330BEF053EDF7B77295A064268304502B6270EBC50EAE1565325C88CA331EB02 FE8CB6FA22FE89D8ED81FE73041369FB8918D4B6D50BC160625DFDE9CC7F3458 A577891265F78157D57428C8E99963EB9878D9C7FC040BA3A5EC8AF488DB20FC 833ED2AD7F5082177C4FE884D37E3D5436C4BEE9C8B82FA2737BB1B92EF0BED7 F01564C45822537C5E73BC2D79D783F7C715987E89ED0B78D730B71152A338A7 BA661DFF0E0EC5EEB02B861392217777A569C41B80973509EA942B9622E55CD3 B4EA00FCB0440DE4D6F7889084D680F931F2B828176880088C610050C45E713F 8451B180205728742EC190DA46F0380670D59209211E45C91935450F0725F07D CD183F1FB8414F8356F37389B61FFED4F1DE6EE765FB265FEBB71D5DA6374D07 882ADA46F2A891A24FDABF57C08EB2F595521E911C75240F97B836FE62AAE7D9 9E886370D986E2F2421F18FE7FE4782BC9B6CE3744756B7A3B3FEB94BA3D06B8 5BCF61A18DABFFDD9B9982244B53BA48532F73ED8F6D696B303FD210BC0C3E2F BCD8CDA3C6BFAB7392253E967371D092B9AC2C10EE25532C1C1A1F322B122D32 CC0740CA5C65FD9BFF103F6A19B9D51A8AB42EA04F1C873F1699B6958AEC1239 DE30D6FD6CF8C22D0B2593692A39D6949EA1B0B53E6581EDCB1CD0A95869876C 5CF0BDE9C90BB5DC921E24D994F1B52AF67C041B5491C07A65A3F235D962061E F888F5EB9B54BEEFCB4203EE3DE6C298CF3F41AA7636A25304B085B150000E6F 1F65ACE847E85BC188E810BE698840BEC394BA6909BFFA99E0A76317F5725444 A7C91A27621DDB668E1408A4B42B0AD158FA4D1313B27046C40E355D1014DBB1 9C24EB133B3B32908FA4859BF391133EF71813FD63822808966239FFC96F6F43 AE7D089CF57C1AFBAA4CDB6B57ACDE095F46E9C9892B799EAD90067145792E0C E614C6CAC3629C2DB9B53943D7EEA84A68C549A13119AFB6BD1B609E4ED00D6F 7794F30A7C142D59FFBE6601961F0A184ED53CB07843204C1F58131F83C72F44 5B335FE76F5EEC8D4D322C64AB345615A50BD3BD1FAAA49AFBECC5136048BD4A 4E2CA4CB5CF2456A1426656D886325F989331DDB60F6BF9A7B9057C025283E93 6AE95B08F872082FCEF59097EE9709821BD16C198474C4AA76CEC70DDC916BF3 B12EBC8FB34411199F40642A9E5558073C63C379781293F7CF3EFFD6D0E309BC B7D49A606187943E6E75C0BDF39599C998A9B4F61D72F448F29FB1CCD49AEB12 14C7B83CF066742E65887DC8493EBF905092FEECC09FB1688D6F7C6B196102E3 372A138AFC23D7520EA86D64CDFAB8CCD41BB1F06578C62CF125CE83CFCB4D2F 62F7645C51CD43058906DF9FC59BB7B5745BEDF719E6F5BC0C43F78358B0D49A 6FBE10AE9E7C313444C210B14AA51A7783137448F21415B1F7A16099960D92EB 5357742C16939C7B1FE492261AF3E28797CFA336A12DD1FDB793FD845D37AA39 4A739F6DAE90498C21EA73372949B0C486D028DA7F2407513973835D864A0853 A63EA940D96F17142ACF1B5486FCC8D8AE40CD79D55D4557431C31D85797B1CE 7E113C1A0302C68052F0AC9F2616F85201F8F58E2BFA539D7025F289BFEFD3B7 72B6884368984751EEC27F1CA26ADAC6F7DAAD4BB4F28B39C657AABDB7487F52 AA973A22796EF8EDD70E6AC0722BFE2707675865C90A8F13F02C78DB32DBC23D 2D99E1F07FBD493752528A6E5C2F4E8F83B2D1051AD3844EAB7A27260F19EDAF D05BFD824C41051AFB18893132C749AFC43C264D924D42B60FFB55E29F591FEC 43EA5C1F06858B8CE97A75EC7B5787BEECE0896EA46457BB26B2D2C65C17A022 B1E870D92C74C799FAE25EF4C3E87587B0F435E54DBA42122C0AA21A08F9C7AC CA423BFDCDD252E20D08151A637113C3407276B41134BAF14FC488BDD9087613 A25CF4F8C4861C62E1EFA6F92DE91368EE171CB610793A06C978E1B0D641901C 0F310716DBFDAD1CDA7DF2975B6F5F5ABC05E331878B09C114E974E9C57CB303 2621D41ECC898B617485D7645980B35CF84CE5D28965F4D3273DB7808EC8C0BF 7AEC58BABCB0A4FD528E21E0ED3C41A81DB12BC0348963B55598336141E2B647 A5CF81547CA5E5EB9E04405385AD3F165A50586C7F9076A1983D43FC60ACA6AB 144803547A48D54477D3B4517A4FCABD360EA2EE9B5E3BBDF8C9D9C68743DEA6 6AD2B9628DF2C5535066E703E8272543DA07DB2AD7EBBDE49AAD5E37B92451ED 85EA239A42FA517D2D85174325FEA940407C0F88E8508747F3EFD7F25BBA4CB1 08CBF027E16BC316CE1DFF875A622A5EC59C6ACF8F4D7DAB4011841DEF0D4AF0 D93B84AFDF60433E095F1C8FEDA88961365C80E3F36C1FB345809522DA01539E BD8DE4C8FAC28A51BE1F43288AC5F71BBD3C05A9A30DF0043906668ADE23311E 4504153DA865AED7267CA45E 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTI10 %!PS-AdobeFont-1.1: CMTI10 1.00B %%CreationDate: 1992 Feb 19 19:56:16 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMTI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] 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 /FontBBox{-163 -250 1146 969}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F 21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF 55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A 7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B 19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F 244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D 993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363 2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3 309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513 F42EDDCF39AE522A1DC2DC523F046EEC4CCAE25792B702C288732F5B13B5CCE7 E8B6A1A1DB86B1EA38883E481BEAB54023EDD9BB94E7780DEEA577ADAA169E66 AB7D8607B409619E79F242CF52E618AC0DAE43317C507CDB27EA8A1472D4E8D9 17E62C98DFB049C78AD15560CE44A39581BD6B555165091C5D41071212A9D2E3 05965AA02B8A67AEB04D915DADC1B84A531A1D672AAA06E9F720BA88419A3183 63D1F9A3BEF8CB2E23CD1F9C003BD7849F093D3B4C83C153A5A790C1F9E37948 5799C02F004C61A6FFDEAA1F9AE884DDD40DEB1539CFE3C3BE03C7C33CB54D56 2C2A0F467049797B56D407AA43EE6B8C3F978A7D945A80BF711C12D6BFFA3DED 35FA8B22E68BBE4FEC59E4C56D3C57E14995A8ADFA51CC6C3A84D3D775CAFA87 A1A0F45C0283139FB485B8FB0BEF5232494C0CB564F966DFE0D0566031392619 3FE8F0BB6747BDA591DFB26132947872D3B209FFD838A17EB1D5047FF880E7CA 28BA81889AB0DEC353C3435B95D95C2F085D4137A62F570CDEB16C44DBB361AE 83DE118ADA0DA5161C826F65DC8323D7D8C9CC860FDA7ED795EAA20B1CC97FA8 AF8EA786924702E9D7923D38C729D4CF51F3FA68583E9CEFE4C7E2C46F7E343A 78D6B6DFF1CE99695B525932A36FCAE65CBF8CA33F19B5FCC65501732575ADB7 75275A8B076C41B49F6B9DD98CCEE4248EA55F396FF5FD3F2C535A291657FFAF 9F8670C5806792CAB5FA50A235A9D2E5357D8D8A0E05A75A790249CF09AD48B6 05FA7E9A8751BF2EF4D2AA0222D20E405D2471F19DE6D58FAEF624A437902362 5D81178CD62290E4B519BB1C5003AD7D7FE7A42A48F04D640C744AD138C159C5 0F88C3FB95A0E541777EA35C392F09182FD45847263DCE59588AC86D95FBB79D BCDABA5CE37C217572D6E450C20DC0E84E25EDE104ED8B8E840530134214F0BF BBB2EFE76225C286D3FF468E55477CB868CA563C7D28C94733A75DB8947B510A 3F4699FCE22CBFF8C01FC6286CB0F64415BD65CCE6A80B84CA751BCEBF315BCB A3675338D53AAC627C2DAB1F230D056CCF017CFC0DD87A3A47CFC0C126D408B7 4DD99F2DF57DB3330681F0F9E215366B38CF48284DECEA833DAAC926EBE5A535 86F0EFA4474CB1AC1DEE03AEA22D5AE1484355BCD2E6B5A715F1BE34FFDC7E25 5011233239AEE2C49A61AEE7B63068F3FCCE4D8C498E120BA9B13DF0A067285E 49887B2653BE88CF91C6239FEC6192E9DB3A0EF33095056CB4D28588028D61EF 16D171D79CC6A01C4C8983D992C72179D08666AA484F8842335B3F348373B5D3 4284A7168B38B18DBED86BB8E87569A61337D79303F889DE30E1E3EB8A9F59E7 A5FBE8AD4FA13CAE431276AA758B55DAFB8087E3B4B5BDA6F4E491E32010F7DA 1622BAA5796897149FD7A0078B9736039D38E61B3F45DFB9A59791207157B4E1 A9B7A6ED061DD169A3DBE6AEBB360102A01A4A9A939D5B1B4D88354435384C01 D90646D9FA33F52A6F51AE7BC3C20FD35400B7EB9E0DEF902DCD5C683A812E0C 317BCE806452BAF0B635924B29155908F9E398DC842325E7A805CFBBECC780E8 858C4E651DB3F21D7C2A7B0A136320959B4CE6648C443AD58D8940E892160AE4 EAC7A410773E0447C1AD979935B5FCBD2AD2A4700E60F5C7B2DC3B6F952307A2 284241E23617650AC6F7D4699032B7AE2A33429A74EEB3147CA630BBCF023F57 0760E9EAE801D873707FABFB28F845993C74AFC7DDDA61616273420E40D441F0 87E195147C084FD24F5ABC665BC8404927DE8C7FC1AD3905336D6B5C270AF89B E30DC11A608A6CCE6BCBE3965B99462E74F4104B025134F94F9CAF6355CF48EE 36A0E6E93B01C8A47B6E25801AC20A70055EA99BE72E82781EE7762CECAB33F4 5D2D49CF6A3762310C0926D9EB6D02EFCAE6AE0F19C90F9EADEE2147665594A1 61D1F4BFB9F9F026638A63392DF68995369084E8878D0DDECFB9014051A63949 10A7E2EF46B2E13A6156C7EBC5953AF095AC1DD4D0046E4C5BD5AD4AB5551DFD FC79F4B1CB623F49131D78C0EBFABA072734D63AD9060418DA63E769B555D7C5 503DE5766C2E8E58F18972DA3A971E059D617B6C87BE20C0D7F35C6DB48A87B9 479E2DC34D28F52E7581E1500ACE5D297FAD917497329D2C861DE6CCDE674AC6 709F1560B9A3815A137C94B3656A9530C94A8E93F785D1F3D3C6D6B572249C54 8096B03616551E37F33EEEBB6E8F51487798BB139BF82DFD0B920F30FF3CEA03 9337A75AE908C570BC7DD9BA08C06A580DC513383EE610E916988B2CE823374F 24394F119F5CE5B07E764FCBF963378288A5250EDDC7D91DF02F7D5B46F45217 F7B52D7F80F82E0C909BDA40B366D02E85D35F2C3165B5D13BFDA6C394093EB9 22AC1D7417C2D8AF50B8EF4C4331FC7C1966BE7F1F9F50847A52CCA3607BE7BF 6508E15283A54B1532BFC2F35597A006CE5427FF7C114B80BD33B58FE42C811D 6706A12A615F4B7BC1CB26E1D686ECB4FF2A962F76D5E946EA5C934650BF0816 988D09E7B49917BC4B33F68982A6D6A0C91A86CF1ADF26EC250FA56FB73813B1 79475C929EE854F49CB11190E94A9173E7C78A65ECAD54643127F8D64F84FAEA A6E31E14C146A3A3C6DC59D0C29C4C7916E6D2B60B17650AA80EEE170ACE051B 7AD90FED27278C197B82954E63C566AB102CBDF0FA581117782F3A6ADF241ADE 7826CFEEF17961FF5C4EE4BD84C45047A300648F4EC19FDA8212292DBC54B027 901EDC9AAB0D6F5274A1A20CAF591A4B2598409676C9DD3522515458F226C946 7C05F4D88915BD2C149A025027281C92C6EBA700B57EAE12702BFA3D03F5D079 A58999697C16E18F99865FF93ABDA0EA4D01AD8C14BFE3944704AB250D9E7D58 B4E2811DA6C1C1AD351EA15A23AC406F2395F1FD1301F23AEA6CE23A8EC34BB6 032AB1C4B6F3E748FE852BE0C044E07852579E6D0A84B72CDD725ADA718AC14C DE1FF077D87D37D7282166BE35BE1D6AC4D0C40A0C11852F3F9001BC78E2BC78 35D0B4CBE6965C515002320BDA2721D4968C1835406680A72A0B02B6D83329BD DB81D24FFA508AA58C8A509C18D9854CB4645A7C05460297B32A2FF9AD1D2F57 4828A85DDD879B7596564425611A023FEBA4859F1080B4F4AACF4565A152697A FFE891139F18DB6691D2C9CC4B10DF957FCCED4CDE00DB326382676C38F25E8E 759955441A70DE8F722915822357183302742447D892C56CDD3E74D007BCB5B2 27B25D0507053F4EDB0BC66289C83A47B4633FCAB7E626AD5AAD6D24BB252F52 176F6F32826442D59D2195B2A7F5DD540599229A6CC6371D4D94422E31A64047 029DA906D2BDB4B267851488C22347845B0BB402C8A97E7E5E133D8917236A1C 30806D41551582E7C728AC0FB480C255EC810266DE7B46E52A6423579CBFC06E C8E2FF9FF00EF9FCC51FBB22DE4428E280CE1FD5241CCBF81070486A0DB9536F B6BF451F7C706EE44D37A0D78793D24CE9049BF285C1DC9AEB61BEED88C4CDF5 D3BFFED602B26D4B3788E171579289859313C918CBF70EF8F655CD4FB73C514A A34BCFB555B6BD835FA0B80997608E9F938257050F1673AE03E6B4C6F96045AA A8FE116B8A9C0295D34802D22528B80EDCA6AC2C5CFCD57E12F12ECA8C0BDD0E EF7F3B6F4EC14C3A9C68ADB70B6454CDDDCD3181DDA00BB3A9DDE3C64F162D0A 9250AAB836AF3F3C71589E1DE6B542E9D82B1266E23046AF5A57A7FD5A3EBA92 B137FA2161E97A54B5C472BD23CF56F3936DAF5C468AB88A6B587226829516C7 71BCD7CF1D3DD40CEC1A6F7895DC95C9C9BF1A571878036428A9A42E9B363EE8 64FE7D1473CF558A246F0921C3257F0EDC4EC2C1FE4E342011AA9CFA4472204C CA1DF74F5BF01A3D0F518FBD76194711589E02F3F5290599E0F066F617B8F0DF 6C9196A71F091B8D7A8FA8A72E907EFD9821E1A023FA4583B1BFE762A07CB409 FE74B4CE4A642AE77B5FFAE5FD7D65A1C03EF6FB31264EE51BCA46A8927907F3 AD83EC5B5337F738F44E204BB64FE063A8C7738F217BA319F23FDC8A65610014 D99A05449EC21CECBEB27602F66708B1207810BB167AD4D4FA4AF54767A35B1F B17454FD0D82F04386A595397E2246ED339259A4B70854BAF3F41500CD1FA69F 799BEB5C6FF670D4E0623B2385D545E2F46436FDFEE4F37DE68308BC86551E26 0DAA88D7A8E54B4E5FAA94B88E322EC04542C3F8C9AD3DB9954CC32DDA1A7002 8793B4532A5D6D31DA33470BB6D812891A52EAF966AA1629461C25930BFC4C8B 6B03832F4AEEA5D0B27EDA93F980E91B5493B9618F143A4CBD26B4CD8F0C3D16 5B2F27AE628D9AAFD99F4A1677557D68AA42A8832A7D44092AF20DC586290685 48BC89B6DC4734F8E13F714A54742DFDDC2C85EC30E53E39206594DB51BDCD17 5A68BD85E351CF51E86163748D3AD70555FF1D5F7B0E556E54744181F7C48BA1 C2C56129EBAADE51F7764AB181B6FBA1828107F61E8047A5CE36B58F5D6C2C17 61990478D0D44C23B1BE2BE6CCE369DDD14AC25BBAFEB3E33D5D50285E947EED 3A23B5A8698CF9F42F75A514D7B3B0EE048B2F2A4084912CA66A14D1977AC21F 7B2A332F41CB33D48E09F8F0AE912170F6019D655DE6827277CC043E001E37E0 88C7898F6ED2FDB215E4D4EF79787DB95777151B1951A2CAE8A9528D7E2BD15E 37F3BD6449856E5150075B92F10F9615F66FDDE2111A4B7BB546DAB5536B9437 2290D2405C5152996CB1D4B217FB16D6628A0FAA3DAE60943C98F4890D18E18D 3E2740F42CE9151E388827AAFDAD7CE9F12C54A932837464336B5575F0E2FA55 15DE03FD73C73060E4AB72F7BB3B2FC23D1691FD104F0330193915910A3FA534 B4EBE0B42222AF6F1F8E2657D3CE8AB1E8CEB40686CD6953C233E52C3D1534E9 A7B5EC22ED0CE565CF1B414FF50B6E3D6CFC342DE97F723B674E63CF67D8AE5D C786A0F6BDE30587A1CCB7BB049B73559AD44CC0BF2CB3934ADF7401E5A8F327 9D701A04B88CF62B6B57FEEB8A36ADC12DCF241AA96C019969BD00317C36D0CA 2642B811E7611680AC3B4DC34B1E98426D7F85043A042B74D8711F587EF31CFE 3AC4F7FD9CC6CCCBA3522AE22809395B0B3BB1B4AB9CC1A5D1EB982E9F8C3F97 2BF975141C39AC80AB0904EAC1BE6A2C7F97A9AF3B32ED276373AE4D9FED44FF 4F1A91ACD26F957F9E50E1D4940263BEA65E273B926AA3E7DF828A43F54D9A49 7AA151A70ED55B8B5717527339C2A468608C1A5D665D0541F53B5386BF6CDE9C E07FE982E83975D173824F2CE58A357A1EF179483CACF1C2E95563C2E60345CC 21556A26D49F40B84A4B4F00EBE05FE36CB920F65FDACB38AE6EA7734BF35029 9865BF659669E1C829199BD232A128E494B1D6FBEE9D92681BD7C0E430C6F958 2054B0587017126033B6696ACF3ECF85A90B3894AF9FC37D65A6A8853DBBB25B 1E016D3BC01EFC65C13E487DA69A7399F57D02FA6FC3EE6FFA7EEB7186D1AB77 493EB4A36D0FD86592DCB7F28617E4EAD22AB1601138628F521962C978CE0D8A 384573776F31625C13F19D35CC396DFC57DC36173DEB95F8A86C3870DB90C065 70481E6DC8F7980CD49C6A2CFDA7EC07CA76FF8DA24E7B8A6364F2B734E1E645 1829B8652B838E7C55FF037DD51C13B2A6867000D3E8C6652DAA087170804F66 3F9E437FDEBA6989464E9C03528EFA9D82D5C67B80A06892B23F6DBC7FB79988 FE00769CB542ECCDC42FA28F34EBDE4C37152A6C6419033854C7351FFD8DFC69 361909D977C3E8CE7E1AFD26FE2B8A7FE5F43058233310A63B0E11F28C516A4C 7B82A552BB84C0294DE50E6969628C96A9506B1EA590E02D199A6174C0CDDC50 B7E822C9312F3534030FD1838B843375F0B30DBD4AFBAA0D0E3A49495971AF2C E98061E422984F585528EDC16DAA7ED05B4353424554AD2D6345D6767AC69675 2151A3A2B5C28561DBFEE99CE0C957E8BF045D790BA25949E2B9CE6F63BE452D 7786129389D5314E1A0D6EFE59139FA6583DFAD8C130C8BC8C5D4B9D77E778CF 175CFCA392C7D49331486E34C4A934969F61D00E32750170C7B70CF72983E39B 79C07A23D10937CCCEC01186C028E704BBE47ADD015EFEC387B6419F6E1CEAC5 56E182CC28172FD62A1CD65CF7CB008C637CEE19FD4EFFC27E6BE2ABCC70C5B1 C98E9E4975B21FFF757DBEF194AA8266B0D62FFADC903D525766B90D94F3ACD3 A7FC9C32DE3F22F4501B952AFA043A333C7D4F5EEFC8B8733EC891B1A8737D06 867EB30136155DD70E9843E5E240BE2A27B2A5FE49E681CE09FDF95580D6EAE3 005674C7DDB1F9CCD71599383B145B25B0E2F8D97A257CEC5CB815B87E866C4E C5742D0259F6ABE53CEB7F99038C604C3F975E43D8549C79C26BE9D90F3B7E8C D4BDF13BDA5FC962ABDD444491851D4C4DFAB33BA07ACFE9BD0FFBAAFE053379 E2524F7C96C62E2F32A9FF6ACCE2377ED03DEA4C75F4872E9BB2971DCE61F2D6 5E40EB4A94B72A99D95D10B1EA7380DE2D290F06E6A63F50F1C942AB62371FBA E81128E0B72132BC5967C2AC5863B8E849A57A4A9D21635DA15150B3A5F68E6E A64170777942B04EB0B06033F5C37CA43F00D2C513D6572370E16B8E381652B1 D4F4270B1ABA10CD543C1CA4F8B86E4A8A41B75733223D9F7632019B86EF650A FC8290993AF5B2AB365A600B766738BEBF9E9653FF5FAA418D73D84C60056D98 06D94BF718A217725D0EB7E2983DF02FE8D17FB2D3F269A0322839D5B0252A07 EB950B64535EAD9AD6DF3A623855983B92803E98A5B15AD12BC1A74A439B9C1D 9374691E7A77F4967AFA1B84034673A932B0DC5C8401347F5126E2C91F775310 84CC81A0DCE7F2F5B6C94FB0154BB6FF0B4AF290AC3E47AD945E5D5F2E1E094F 1FA125199DE39E768166F35BEAFD4F013E46E91BD2F3A43B1313AAE36DACF9B7 3D930CD6196960C6CCF6AC5898F4A74F00C641BB654C72C8F6F4019487892314 5D7BEA38D16CB807395999F745E89C2C0AF226CB5B4A37A01228457DC91FF7BA 768300416FA88230832FC3E5DF27756173824D8C4B438974947DCDB17FE523A6 E26822458D3861C4E3D94679FC72A3E54C11E4FCA8FAE335DEA7D9F09F3EB320 1DC5E1B69CDAEDF6D01999C3B48F27428FE44CD0EBD9BD2F21D7FFB99EECA344 83DDCA627C2B934935DB8C6EA42C40194F84581FEDD784F1305B49917EE2D745 CD43006AAB08048202F11D0461B6B6917E54717A8FCC254A7FCB525167519DBC B3A261DA71CA704743F06FBD3BFCFF50FDD815E1C31D3A07BEA05D8FEAA4371F 968D5593D20D351DEF6829F95A89B836D6F67F43C5A969A5495F8142B3527AA3 A8B0B484A7082985804922DC8704C9863C30A798854725D31716115801E440FF 37E1C000A901CCA9316C327F4C5CD651E24629A9D6DB57FF174619AB1BFADE6B 03F189C1121F12731A0BFEB2706E2E49802AECEB2C869E8F3916808FEB82893E D9102140B95BDECE891EBFDC0877CB05D5D693595BE1744486199A80D2F299F0 1532B5B51D44A81F6630285B775CAEC4219484AB679C387736AB657D2FAB5FF4 C1F38955043568B0923EED7871A79EC0EBE857CEBFEFCDC56BB88B8DF95A5955 B1B5C6C3758EBD3961A9AA8EB80F727587D52F520D9C2F3B16D53D04373C40FF 8B43EF30AA6905E7954B30F8CAC576C961A97D017E38333401D46497F464C58A 6F6DAEA14796130F4207C9A2C915FD60987A4FADCF15B1CE028E19D84741A4CF E92F14975B22E90408636EC2C6BEADBBE2F700D9C52DAB85A8305314D0E9EF86 7FE155A21200C540749897BBB8446DB0FD9EA6ABCF1EE1384401EDFBC56780F7 BA296BC9949FD913A6C1465F372FBE8A94ECEEB080DE004F68CA85D8E14E2FA3 C2C9F25A7AA3107560737D89D424415F4519CD32C08EE537ED3C1D868FD9E959 B7EFAC23F9A3391952F82B64900A8E823A2C151A507F13B5B8494D969668D5AD 18E616740BF5FB4FCB456948366D740DB5977F1486ECEEC222BA34275678D000 E72627EDBA485B582B3D0B8D39A84066E9EC9AEA514C99A610647E8EBD15002A 2A06B2B774369115542E5819FF5CDC8EFBB376FB8848BABC2A9FE36FE58664CE ACC537460646EF5BE3E27AEA3EF1B448F483352A74BB076C6C70F26919DC748A 8F8C8F00D17DA9BA1A2C6B2EF2991820AFE725820547C323DC5D881A09951743 CF93DBF69B34DB77E5179489647F10AE99BE1A397C3E9F867E32A41D5E648D37 D2A23BB0BCEE888C27357C184545AEFFEEDFD381F02CDF27365C2F6081A9F130 6C093331619FCD8DAA5785ED724C65C750F68AA4F0DB9482ED5A9C7AFCF992DC C7E835150F6FB2FA3B7ECF0EF9E2DC3FC4B662A39BB4E6647C970729D6C4AB8F CE91E89425D5C3A7CFF43E0DE81B4010EBFD6F4B59E6974D8ED78EFAF93403EF 2546021413AECAEC33F23DD20C120A352490BCB429609877704A5283163164B8 36B1F3C515F58DB0539340A6063F88E2846698593D5518413D76184212A1DF22 DD13C9CD8251056A988A0054F340A7A69CA5B946BA01456FD45BED04A44158EB 89AC05C4E21BB4CD9D1721250A8254B62795B4F723DD561ACD73A975B84D387B FAE002B7854DE9284C72FB4E32BD70F440083A990FCF0B35A7DFC987DF094D8E 31700EACE3BAE2DF2AF61E8675D5A55062426268A169B24CE0975982C76D36A8 BBE2559A8A48F3B022DA0E3339FEB3357B83EDDEA914391DF8F6E80EAACF0742 B31348E509D17A4C02582E854D3838AAC88AA0C0906C8505FCEAF8703970A3B4 38B0579D7AF0E0283FCBEE979A3E08AD484F0C1171E41F58AD8BA063FE85D248 60EA777285CBAC139159875E82165494DC8A35E3A67A75D8B9C8CCDE9805325E 39EA26FFF3BC9BC99BF2D2D70A5F00F410E50D759E1CA678492DE1072966BDE3 6469C249BC34CD048FA81F3241D36839491656C95313E1BBA617EDEEC4ED9703 DA7A345DE172C2760FBF66559ED167BCB696C93FF085D81987602B193E87495D 2A2A19DC6FE716765861A94108BC65FB38DB6EB504E7E351B9347B68886382DC B872968991EAE65F67B8FC8DFF6E3E97E94AF46EC98C89D877EBE2A9793CA763 EB155FF47A65BEA3D5D23177D8CDEED3523026E9B5132F6342F1257225F087D3 BF2C1177C097AD32E23138CDDE0F651AFB6F10FD173A3B73042669C116081E80 2A4868ECBE26189E358956839C56678FCBAE2D1705A1E5928A5967596A4CB329 AA02488FB3E2EE9E52C67FE4FC7D40F2030E7072F160176BBBD66DF7B2AFB1D7 2A5AF0F3564FAF8049C4B7397D1DAD17A1DC4E2099D3D8BA176FC81EF20A0A63 C3116BFDC1F0700720DC16B6C58259582B39D00B478ECE899951E5B8084E876A ABB69C19482D66277AF4323FAB7039AA9CD3B17539E75FD7EC8AB8474E9BD4EA 423607C7FAA068A9339ED9ED7B1C67EEE03AF3F3137CFEE8FFE71FFF275D900E AC82CEFF1A42FF1955309E22E006B69967452AB7F01A2C3ECC090AA180CCAAED EF42CAD566B25CEF7BB035E4C6F50264BDE376609389EBEB3EAE245555F49F1B C67BE891C11FE7A4FAB4D9C62974F4E0655A72B36A86AFF1634B6F5E5B569BA2 3C3C5D9E133A4229C4597D4B767C3F55009E29FEF97A003D249E1DF465C73A41 6BC404CE79CDE12E861E8455E88A5C8A92E325192599261D99C319B561B54931 518EC86D45D7BB6F19CC3C66069E597E1CC055C4A3BBDAB813CE6813C6D8BA2B DE6327582814F278D91B2BA37035F322B921A22EDF9D80DF29C0F6DD0D81C17D 7DA05D5668C25720338B7DD5D71683926279031B8F1C3A6585726F45B173E405 2ACF6F97355BC9856D0597990EA6A35DB3B1EFB83CF1009882AF73CC04FA44A3 5F4B1D9C72BE9F2441B09AF179D154D7964DD71B0F9469525D314330DD1C8BDF 0B2312D6ABF64290EC0B24BCD55294BF719A222D945ACEA9E427A42F32F5F5FE D839F6378F381BC8194497A8A3B4F042EE1B960DAAB4148B5F1DEAD2049D1726 F28D34283E1F2A2CE61C3DA6E3D1B25F21A2617377C4C5B3B275678A158BBBF2 430A7079B4FC2873DCA92DD3B3DD4903C71E544302E76AA5B855A51FFC17C7DB D11D7906E024E2F193A10ECD6E74CEC5B1ED8A6A494F4E79E2269AC55A26EA8F 02A6901D66FCD03C338FC6614B892D011DC089C36236AB07DC5104B8266790AB D464B1775BDEDFB991A9015DA95A6BCE1B3E61B71BDB2C08D3C58108929F1E6A 5BCFA64BBF4E1EE1DC873492B686DA569873C0EB51DF8CFA743FCBBA2CCDE3D1 F4DFB080A258BB14081593ADA424B77DFBA348CE11E723F091AC89C0D25F6794 5D0DD2D1A78CAF3AA1DD692EE3D76C6750B1104A0D6512FF293E23CB895D3285 F9B4CFAE9F4B44129E45102104786D8EFCE9F00B15AF914D27CA7332886D68E7 F32963740C6ED8D1934EDA3A3BC3D16FD3121E76040657E4C917AE56512E46B1 B3E57AD1A83FE1EF1A640E9D1F532A30515CD527153C9A597C5257E6B1DA8018 63A379B4B36F7C0352E184A30A581CDBEDF325D9D92CF9FE2EAF2B4056ADCC46 817C75FAF27861C519C2EECA730EB6215EEAEAFF9E13E9636E356B24C1FF32E2 BDDDD4CAD0D46769E3A4CBF16C9AF3D2C739723CAB2427464A9B5FFCF7BC5318 8365C834564EA5B11F1A22CA59575D07C25C30567983467499F27352D34457F0 DCD55D488CC9E5AB42DB1AF140B73EA7FE27CD44D8E610D9012FB57EA1438F85 5DA3A2ED40810B23A6A8F814CEEB2320CE5E1A9A1BB117EC249E409A06BE8BC5 A37EA89E74B99FBD237917F62EF1CDFFC3893CB8D1BB527779417FEB0351C69A 06231B2BA6939CC21BD9414B9C1C1295D6BA5745B2F6FFA498C20964AA73DA93 F2BB60822D88A77C029C81CBC8118F1369AD883B16CEE5E59E892A027681D02A D67B1389B10A2A0ABF8F22B6F8382F06F3CB90CFDA91AC45FFFD7AD3A192DCE6 14201D03D9C5F6331137715B6B10D0547434E4E129EFD3ED59C5B2134356F265 E2DFA95CB62EFC4B820966A9A172E5B2A134D359D777B68186704FAF7DAF575A D201A26C6194B9FA36D41DC291A62613B5522552D2CFFA81D276009A8612212E 293FCC8A5C85EEDA263009C4FB50ACD7B65555A9174AE37B1DC8264A15225426 C43F8A6ED11198FF1BE2ACB099D3A03197696AE50238E20ABB729E5E52571C77 191CF13CCC1401723756C86B0A420A0B906EA5D42A64A44E519F55E03AFC0661 751F9A3C792E69FC2C33129196534A91F1F939092789965E9477CD9BB709ED4F FBE00A1C99CB740844686E0376C00AD3EAEEE30EB00722D4868842EE0892E746 9659A2100DE024835D5CEE113295339BDDF6DEB2A98A0AD1BFD3B14F635D08C7 AD869861D8996F6D62C1E427117BD63D64EA42D7BA83524496C4987056CFADC9 63125C0FE0140ED103B5D6B0E1AB36A0B1D4CBF91F4169A7D9AFD33DE1797C81 9CE9D164F82D8FE0A418F6C507BC58553625BAE9DBE8BC9C32EBCE696D794999 0CF08A51E382D9D61BA9A775E65AAF66530FE0EC1AC59169B9BCB4639D7BA735 3F2EC8F2717E3FE8D5DE9FF5455B965D020917253C4D2547F2181C4D654D212F 3FC05C4228A594B7210983D1CFD275B1FC3ED531ABF2ED9C2D7DEA0A76803647 F39332BEF79D7E9BC27B37DB13A0FB28589853079C450D5CA4DF04DB318C960D 99AC8299307D088A4FE960B7A9825996C0DAE4D079B7432BE00BE3F7464A964C 5C3C3CAA002B275224F74A1D321C88B5B5A1C75E4BF4D6CFA08A5757A9170235 D6FC628111A061B5BE909D9DFA94D2C9AAF14485C29C8E989E4AC62BFACA48C6 1446A1815C66E27532A8C4739EA1B66CF6C2B1958EA6A4D5050437EC38EF0611 8029D9239ED52DD578381676619C50EA37B607B850897BD128127EEB1E3D309A C639B8EE8EE137E869CF4A7ABD7A95C91A92843F10695BF222727E1468E3C441 8EA028EF7DB486CF36F39B3FF362C8B1EC317F3308593E9161D3344B0EA7FCC0 D2F9DE79BF85D1FD4E99C08C739F6912D31D564D6CDD5259CD1C4F8A6CD880FA 61B17D640C53D0FDA25243FE24145E591D5AE252F5FFA4D915F7D5A276F24734 C1871202059121ED1925B364F6CB73BC01ED20F15C2DE3B8A57BEC3573521A9B 983424E10A5912C522B1C3910959709D1CA6059BF5D62CD29F839E8990DB94A0 D2F2F933E6222C7B7D2AD2CFD06A7BE46A88D0AF8DAACDE46F75D49A34C4F272 AD93FB97BE8954A737C1703F7A0F838F1D0B3D5087ED11B65E48EC276C768325 A3BE5EF5D572A248068D9E620412F1B3AE3B7946A213712E31318D888CB42AFB 1747CE163ED1CA8A3EFE18FD59ADD9911A8D8106104514123440BBBA69E5CEF5 08B630C56C95328280FD4B222DF082439F36A30FA69D24901879298B98925255 7CAB87C2A1B917A1382E2A7B4253A9FA3A72A7AD0236C9D75910DB3902C6D3C5 2D81416C240740255CA5703A3EB0DBF6BBACFCA8A76EE8C5F5F00D71234556F1 5EA0C1FE6AF7D11E5AE2430405A0031F82BC23C50F689D5521205D6188FE143F C120F809C26E1628F32CC760D4DA7A4781DC7EF8508ECF12E141F2D9AC668E8C 6E6A41E979AE5CC8488B365F78C9CB2C9B0B213AB9A57EDF56E618B189129E95 DDC72CB8A9DA836D83A01C5909BFCEBDF3C696E6DE0D1144E0BA3DA3FA20006D C5C73BFE3DEEC1FA9504F2F09B34C269635F6FB343FFFD7BA1562539EFCFB33B 7448C2A38564FFE17B1D9CA7048901FFD113163499A42776AE0A30947AC65D75 4735A13414A2A533A0F1575CCB273C435E78398D74A731E940B750CD4F90FC9E E03A7A20C25141BDC34A5D729647939D4D90D583CBAD8DDD432446BF28D60362 958F81E6A99F0CB2DBAE71D6C17BEF29ECD901AC4344F3BA01E631467A9938D0 A1188EBA5C2F40FD98466EBFEAF7D4BD6E7FCB269B0992FFC5BE3AA4F1FF7AE1 6A5CC0D5D4E1DD0EC2F1B9B879785048BF5791B06F628482A44159BE758D62E6 E52911494CF6F0E8D0EB25ED90D0641990FB7A39230B47580A34D29F2A900476 A515DF6568B93E22C53C98F7C36DE18EA8B4D501C16190A7C4C91EB7BF7BCB60 74FC91B34B8A6536FABA7E00E0955F5E7A8D382123C7A01D480C8CA3D67B2D74 10BD37407A3CB7F5304D5B79433FCAF67A27453A29467C231B4C96F0A5244EF8 66939723C6B14C7B8B12EABAA8B71920FD550DC8B709333C8680EB548DB9734C B3759DB19C0AD15F16D3558570A1B2CC7EE67800C4AF664886EFD5198862559D 7294CA27D656B76DABB77A757DAA94E81AC235978E29AF 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSL10 %!PS-AdobeFont-1.1: CMSL10 1.0 %%CreationDate: 1991 Aug 20 16:40:20 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSL10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch false def end readonly def /FontName /CMSL10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 42 /asterisk put dup 44 /comma put 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 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 121 /y put readonly def /FontBBox{-62 -250 1123 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9429B9D40924DC059325D9D4CC0344F3F997A99E6CC0676735EBCD685AAC9142 08DAFEC78BB41AFC2F1C219910BDF41D6279284EF600B69776CA15BC8A34347C 30783C52AFA60FBE3E353E2AE354CF87B558776A22C776C7A0B5AB5CE1F941EF C2D9CAC37294BF407A671F10E4743BF842143F4F7DFEE643BA3BBD8BB9E3F24A BCCF7F0ADF8BA500620C81033EAE8C4EF2C1DEF13AC575F1B3BBB66F093D3B78 5412B82B67FFA087AF57182B2230F9F2137180CA58A7D9B2C822FF04BE6CD01D 43B2CA7058C7B953F6D9B5D6E91ECBAA5CDE1159B0E59C83DBAD96D6C8C8BAB1 374EF652D10C0F3EE7104472C98DD3572AAF2D45A70BF7061447E21EE3C3BF23 DF39C2D1B35B42CD5297BEBE6BC94F7C9DC6E61EC67E4F677256FED9064BD3E4 B51A71B1D27CA4E5AA9E1D8080E6DAB5310711EEF87C40859FA935B19524AE83 63B163FA8397BDFF443227FEDF7DB27DC35D89FB1C5E435DA0619A5C88AFC73B 89A2DF5E767C5B536BC7167A840A0C32BD57A14DE69A7D0D819AC36FF32F908A 5070F32983BB007437E3500799DF5E0AD3710A4C0000F0098D5BE99F2EB9C1C2 C444FD9552D0DCA098A94B3BF176F511CEE13DB7EFFAED7C47B5ADCF8D4700F5 7B6DF50EE617C00966B9A2828882804DB7477F4A8CF5345B7F3568B4F72BCE73 2E2AA5BC4B4C70E21F3AD9AFC3B8605A00D67EF9ED1F4D13DDAA920D45B43CE0 0941BF17CF05D2B777C11D4D844AB20C0693D1DDF00B27D9E1AA2D98A4A06CC6 D342AD8F644F4787B66CA7D861E7CE13FCDA85C1B0C9F94009768EA89838EBA2 7818F40A3CBAFE9BD3ABDEC16E56A061E3D8BDCAA7496A045A55DB3EB2D2712E AD9D0B0A01072845B118D703585D7178D2306EC2D431C59708D066FC0631D814 0166966BB1D20080DB10049D1022989E3BEA3E88B7D448A6E11CCC2EF181C85E 07BC7C52DCF06C10CDFD186FE1571EBD33A7320232BC930E1C24E2474128885D 9119E6EBBAF80BD6015FEE94A5013A074425D65740F1C9B139AFDBCF7AB843E8 41F9A080CC231064EC885A5252649C7E9FD78E314D50C4DD9A43BE0CA22E1950 2221EFFAEC3B0D83B1BB3E35F871077622C8B7B2CFAD7DAE3BFF0E3814836083 8FD3C852AAC0B0728EF54E5F9967C494636B5DC17C6D539B1E72D248F3064B26 8386B3844794F26DEF6853DCA972E15324CB1D2119D7011C1AF4C3D7B6591EA7 80883658E0A6807C052F42B61638F650C15D427C253BCBE8F3830B4617014488 15700EE0439C5CDA4F510DF3465E1AAE17887771B35439B699B3A7A9EEE6CA14 D02EB76AB25B5B7381415BF4A2E730E0A80C4F72E8D7007D5113FCFC7A9F445B 01CCBC45E99F86239D840FCD3D588E3E128F6F613618B50BCBF768FBD373DCED 42125A459DB775A40A7F76E39B0AFC77927EFE9F159E3D1CFD11E41CFF83F737 28267F4A3128934429DC0309DE53618F51AFB0FD58C2D978C193F1EA19D16B47 F56AD6643D37F7DA9C396E3C8029F98E65F6A6873537A0B57A852D1F3EEC36FD 2E3952266E6325BE4196686CA4B7EA75F4A9DB06BC97AD99F948CBAB2EA169DA D079DF5C2F300D86CECC35AACBB7B49C1057A70E61886623FB98E25BB3A92320 F2D77F8A3DDFA2D6FA3D598741DB8DC28367703373BFCBAE3C3009E1D6D39B2C C6C094A761C61D7F4723BEEC4F0C9458A528FDFDC344C23F95CC1E26D0309F2B D1A2AFFC9B952B3EFDF90E9D645A4B45D63103A8E8D88EE21218D63AD5AE2BDB A46653268D12A154DB51C7A58FA4B93E7A5937D50BF187845CE96B248DFB19C5 99D55346984DA6173D893E5DAF138E16952C2FFA39549E7BBFE927AA995E6A27 42EF88CD074D779B05670F9171967727DA9CD41ECF5936C45EE71167C9DCF17C 4C40F46C8234AD63CD79B485CBF4DABB79AEBDEFDFD745FC580B2AC65682965B 250591B44B95B2FCACB8435258EA75E395B74912F4E5A811016277FEDDAD9C60 0E3F69F532024C9D1B85C67671A29E46CD6BB7CEED4536C17C583B8A2208CBB7 C8DF9587DF51921AF0F31360B3391E6D316C40D3B92BE722404AFC3BC2F0D75F 149637A5DA2585020DC6790E0F415639FC789B5AF7B17ABBF2B9EBC517576FCB 7E16C10DE1577BD4FFBE1C5654EDBE7BDD6FF6D18348C21393981C1C1E3B4C60 FD0C2F99719E87138CAC9994E346591E3879BAB9954AABF8B1171FE88B4B461B 7B3B9594AA33DD598FC1881635FF90CB605951FB20B6726872D82777B37B739B 9A372D9162E4DB72EBFF4E7D691F24A9751028317AA20DA5B7F463D79725D596 D3A6203DF5D51D96A82BDF2C62EF925F45B3AEAF135408AD0562972EF01DC686 8BDE1BE3072E5D717FE9F4623469BA557C33866765D4563FACBA00E615AC0750 45321E8535851BD89796FAAF929CED94E57AE67F7A8A1163613EE205F6D8005E 5F7C5D4F2CC25AD3776855F84D827F96FE80103EAEE8B740FED39149FB8162FA 0F9E76E3213327E7F24CB055FA327C4827A2252375FEBE6A501C45AB528DC658 6ABE430E25A972A5DEF700730334CB58E54C983DE5A56E41B29B76BD3E2AD1A6 6C10520A7C651DE43A525E7535E4F4E6A81FCEF5A4DAD2F2541CC26432AD8713 C09B16FC4A305E44A1DD538803D5936AFAE28BF5870A7585BF40EB36E24A3650 B464E673FAA258DC6F41BC844EA90EBF80C39B7FF7DB328A394EEFB37E12F011 BA2A8DBADC26A19B7B818CFAA834F479A182F0AE16F1898D0511A4076B8DE1D1 3E9BB210FF930779431C100768DC92CB2B981F46387BB7B6B6F9C9CE775CEB9E E51A8AEC07B799D58748E7C64A1C030ECDDC4C074B4E1B4AA4ADCF24D8F785AD D342BDDD1D49A5071B37EC734BC91E06A599F2F96618916DD73C6722FAA39E92 03F9F078E0A1E5EEC7D85771CC85D38C0A5D835B3D10C2A57A14D1847F6568D8 1E0B6C2C34A29ABD213DBA1EFFCC2C0EBF82CE289E5AF8CC1D12325EE22DF17B F9F85333A859D69313035A7372EBA717C94442D84E76C517C856AFCAD46B7B86 5991E71EA0193629440F31D731B0AC9BF1946002872CD75A681080C8A3F9722E 17840788EB6953C8CC6C8C07079EDCBA9CF1A490E5F21C1F97D73CDFA69A85FF 624C979CD37CB39388CCDDCC4A9AF90A733A41B4A2AA19B7B460369447F77B95 80F977981D0AF2FDED3882D2EBD87B4E61003B8A3EEB50D4AA59063AC2B095F4 455B0E3B5223C50EBCA6726BD030C1B361816774B62A6544C0772FE4B172CD79 22EF2842F2454B949F1E136F4ECA260522D4BA3B96C360274CF4A53338D9EF3F CDA148123993CD1446739DD3A91D8CBCEC2641B18F517705E5DD104942713E8D 41D9B51DAD6647925A8DACD925CFB31B481978E25934F126EF8D07E2C0528103 A52AAFA322F93C1C6C7B762870FD4AE5C66DD3CE7092BE49C16CFC9A6B58C2B5 127B04C953FB1F1D03FD15D93BEE09B2272A2D173A8B8EC6FDCAA69D0C32BB8C 67B9D2EEBE97535AC420BCC58E3F9BF055C57B4400A58DFE2D240DBD978D09E0 B464522DC94EF44A0A443B8BF2D73ECC08DBBB49CA8F984D8FCEA9A40B284281 09E4C0D7EB58BBC0702386782A8E22C6071B23BBA92489973C01D7D77F1A2A98 D7E670EB64124AA8C09C2550C944E922427071C453880CB1700647F94B194B15 EEF7F2981EDCDEF3591CA65BB912FD6EAD258A68893D0277E9B5E718EFCBA5C5 0ACC45329E6B108BE3352CA15EDF9A6ED489438FE8C4A7D193B8D9B0E1145917 A27E6ECC57F3926AA6A882AFCD751897C4B22A6AD3C6AEF20C4B05F2162868E5 FB120E5F8D971952B727015499B534C6E56AB71380F78BD93241DE5DEFBD0633 39460803E947A3BAD8A1D6E2E884899581ACE84137ABF87A595E8A9850B4ACDC F61CD5B284DDD28780C24D2941A1062CD433E715D6F4E238CA8CDBA305C3FE5F 82D6D34B1B368046F3E894CEBE62FBE58CDA9B9B4E04D0F991307BDACB09966A EFF08ABF5A2F4B12399CA62EB3E4CE3BF2E47D6BA9B53C5B6A4A2B55BC54022D 7ED98B399B40B9A702614098D4FD6584DCF539346DC3EBDC15213545BF4153A8 D5EE8BBF0FF20D54FD738BAE955E2B6F96DD0343D259532175E1B67C4852D31B 0638692C1E7B49746064F3708A9E09EEC84E93069B0A0AFAC2D5BFA420072568 B73587F9D160B1344AD7BC659B35CBC02E1F5FB9E94ABD1598A90FE8A1DF3F0C 95F942395351C765BAE3E4E993EDA98AD3EEA47F248CAFF122C0EA1802A36F56 A1E7E92246136BECB2460B01F0BEF6915F1C2FA2B377F1857644D79CAC458E7D 1CD55747511FAFED8863D8FEC568105FE3320C4C5DA5816AE4310449D412E86E 63C19EC6EB57A782224DAF30C864101287CDA0FDAC83CB837EA787016B40CAE8 F81E96E186AF5BBC9FD43AD997D2BDE0DEDBC7BB3D77406946B4A73A15D246D3 98686A1D69AA38D8EDDEB1A950C8F19999BFFD0AB4BF22C855945A76E91F407E 93218BCB50B407A7A3BC467D386C5178E8B7783CF67A07B2850655D6B02E82E4 6F7A5A75FC7C5F4CE07DCB94816627F38531239A0333A6E9B5C52A8FDDA9F4EF 11C9C069AD5E91FB140BAB9F743CB4AA42DE249B99012E73F01562319A45B4DD C0D60AE5E829E948DB38BF14CFD8C4FA83D3C9E28B537F704D204806EE161325 44E4E73D644820539BD992085508E1E7EC278C78804D52727FD40A4A0AD86B1D 5CBE493941DCE82BAAE014DCF85D7893103726DB2CF7524808336221A97043B4 7E08671801BA2DC8032424F362E545275462D1C0212F64E439F3027DEFC8FF7B 27488C5CB42464AE8A289E759CC1431D669B339EBE31B65043BBB9856FD6414B CBAEB80F47FDC1C64931DFFBA0B6C552230115A30CD88234E460DEF77583A467 A67B2B01F6263930F9DBE5DAC38E2C98C340E896EB4DD6FEBE14A5573DDB6D64 36FFBC63EBB55728873E2F1B0F065A7475DBBD17DB489C6D0BF8C85F94C8D71D CF2F8EE428079980742606C4475F475EAB5899C9E80E072134394638428B4FCF A9D136A96DCC1D554F3E178016194E52D2AAB4A743D0928517C2D52DCCB645E8 F2FE55F48D59F328D36ECFBDB21AE2F549588A165358BEAAA0F8D1D9E74AB145 554E0E5B18D0A547D7EF59D991C56DBCAA96E5C082D7EF46D1C815EAD659A0C0 601C579087853D66004BA58A818D65891D455C4CC6AAB94B0589BCD9DCF438C6 08B177F032DEFB683EE5900084FA33DE563485719D632DD7D0D432660FE871E8 426545ADBA1140CDEDC5F9801C378C534E25CAB24F3331973DEBF97ACBE84C3D B56026B0A3D73CB2874B97E7AFFA512C2EA5DB509602ED15D57FD768AF6FFA60 CB210D64B02284DBADF03C6C15F7F581FB8368A20F9B30161FE79DE03796D59F 974CC627E9B7BFEEE51EB74A49350B2630EC51132DCC3FDBC157AB39427A3342 DCF4B032600077D071B600AEB396534C128082A50FA6EAE7D4A8F0F72B933D99 6BEC6BD8655502AE0D9B23E6D3C49223855320782CF9C5F6386971E314E68F03 71F7E44A8702FBFB32C40FFB94DE1B3D41C98C85FAF8F9DCFC7E9C3BE042E298 4369EEB3222DA615FCED23047A9DAB956ADCA061F4B90B2524392CFB9C3C704B D2AE92068543F51D68DFA4EEB17D3EBBA2D7C8BFE8CFF1015AD696067CD0760F F889C8B0DCD0830FF2095A220E674F32E3EE8013D5408A28CE3367C3CCB260EC 07BC07D33B327CD80D4A977F10CA839D5F1E5D969E9BD8F2B70A4DF954132F8B 9F699F4A5537855D2E9176FB19B8FF90373FDA715505F87BF2E03DB6DA2DD906 B7B31D43B21106898048238BDD2FDEBCBD6F500CF3F52D00B9E1AF28081C04C2 D3B2AC5EF946FBD2E217729BB37938F8621E0E29682E50AF217D784ED2380786 B88D30703444C9ADCC2B8DB6E00B703B4FE2817107805419E7CD15D66DFC2C96 3B11441C1DCF7CCF4D2E7DF6462D9146C02F9C754A0F6D90426C72CED69DF0D8 75012645B886745241EBC350EB8499F69D1DDCE861C1492692E7A7ACB548FE87 ACD4D9A014239ABA8F086B3CD16412CC4E2195E51C6E985EF3DB03A98B74A8B7 F2440C9DDBDA65BB020C89C6DB704BCBE120178F79B1859491AD6D43CB56EF81 330D3A8126B91F09F751E6E29A06654C3DE21B68B86D25FB93087997267D4EF3 D46AB3339481306B932583A55066F3BA8A4BFB5822EBD0AF82FB6040262ED52C E0505154B618D164F658D8ED4A949CB989004D2CA045BE1B6C13A67E8EC1B524 EB432FD100858C7054A519FB470C3A5269FE4C25BC000A326E310E8CE55DE50C 6D9F5C9754E83FF5B08822A01A0753F316E25AF68E4A875348890485E1616274 2808EB2E24D75580074E9977B8057E406DDE63D54F3405551FD4A57315BC40D7 9DACA854A6A568EA69FC252C9D5308B177C91F4DF6C43DF1256F65E67449E1A3 AFB063720152E69A513209CEF8B9DB92F3116CF3934DC71DD70DC84BC93361B2 C6D6DC275A84F775E25FC5BDC4F1B039A69BF843D2F1799140852B0BEDD56B76 0ECD00F47DA42000035ADFFB9627443445AFD17845E4C1F140A66D511626857D 60E264D0B83AC96B1C48D44E41224911D7F115107647E70E1840B49A3C696860 736C7CD905129FBE0D3BD82AF2AC51E34C920BB8BBB403B1FF14DFE7324354DF B6164FF2706C40A80D1A3861BDB1E8C876704D860484FC5F3B9D10CD7A72618A 10FF7AAAE8803FF3939D99C1B8DFE383BCDC411847D557D2F5B4E383B94BEDF8 597C8150D4C0C3330951CB09BD2CA5616E4C75583C9C67FAB14F18269A3A215F 87D7E4A87158F77BCCB230787D7F31C6763B9C320B450C74E526616AF9E5AFC3 CDCB8ED572B536118C774BE285EAB3B2F50630ECB34E5E729A25BABE4D4B09E5 59C11EB1BAC23CD74EF2595FE0C39BCF1934E6E16557CCD789AF2C8D248008E6 CC693CB89FC05A586B96818F5CD4624C99D5195EB585CFD0AB48D2307FC769F9 46BD64068A370186510415A37DCE005B3CDC993C5E5D44361A8F6D2BB449C3DD 2E12F12E417A6D9F933F375A66682E6B68C8D08A793795D8E687B1AF330AD61A 0179974C61BD9352AB4AAD22B5C3A520B777E81D6D3D0EAE03801BF449332D40 BC6483013BA052AE034C6E74E0304562C4029052DCCE18A4B4BB962B4252BF03 A6FA16241D5F47E3D31670B4C034619DD64BE7456C6236796A5BB5C05DC4FB20 A2E1065F3B98A749240BF97C982679D07F2C74D06BE6F4B1BA3F63EFD82B1CF3 EE2BAE71542E9E7403AD59ED0158CFC8D7D9B680528D8DE3CC753A4E3B350E03 A90580D592846C0249C8D0F2D24B8D26085821758425233492DACB8A5074B1BD E5D531F2610DD9243BED758B000E9BED44113A2D82BCC31E718F4BE8E9DF494E 5621BC341B37DC790DD97E254F24F57B668B3D6A2562F3F705C27F6F9B564063 B1952888D847AA7F5701C649C62CF5B83142471715CBF81C4EF513C4260D5A5B 980A2B96F36F37F52509252F0C8D87D802018C1DBB3768030848BFE3983B4822 38FDC2A35163C44F7F55AB556C29EDDAA0146E9E66801B1780E86FD6AEB8FB84 9D73CF495D800F2C09D99293F222272BD613172446EDAC65D131EE88E08362B2 9270B016CF74D059EFA44B37497C2D694CEAFCE06AFEA6DB493BCBD4CEFE8F03 30628DAB9D2C720AD94ACFAFF6692DFE5C75D9DA1F09E62ABB647798D68634BD AA3EF0208EC3E1F42BB7A7F77617DB452CD7DA99BDF6742742AD6A4FBFDCCB03 2AADC281CC6493738A45040A20EE8FC7DABA5612A12A4A1C14A2E85A58A8FCE1 AAC9814F69507D49E458A18321A0A4BB97B38BA3B5A7C2C07240019BF98D2BF2 1A2DCA37EAFD96E69BCD773163729172E52B33B7E27A56F57BBCB25298FDF85F 8BE3E9286469CCD28F0875E9550E95968BB46D9546D4C0B3F35BF776AEC9CFB7 818FD280955293EB672A44083D3D724A2D1445F3E5BBBD6811F38744185928D3 64BD78F9B5943F9FEF1E83E0E98056433263B4A1085018C332DFE5082443AEED 318D97E14B48860EF380DA1AD90D4885D3E9D6B10E8686A2A5B3D6EEE8EA26E3 89A1CD93C51E4C5A26943D86664551E3926B06176905EF00597B71B0D2816313 63702C0C0CBCF117CAC0A0667D8399ABFAA0E1F6A531FF8A2BC43CAB660A93F5 8F26550D92F9203E404EE4F45F2B472F5ED9C2A8E18A89383330A3E2EE42FA4F B3532CCA28910FFC74E3ABB69CDE0E1B5D2AC466BC52883AE14C88C780841BD8 4F71BD470B26D17E6E8FD96252BA1FA4DF9516C762A28D659A877F79E23E5D75 B1DC530905C9927BEDA9AA5289A167EF6BB4CD26FE2985DA4A940015FB15C87F 230DC5A1B25F40FFD7F4336F9421106873FA7ABEDA96AD82C9E37C9BC7CD3FCE 2999994F1F213AA69CFFB74CEC9E6A94AC0D579910C7C015CA8DA8F37B34D2CD 126CDF54B815052E46AA3DFE319167CDDDCF12EF6E71CD663E8B0D782CCE5851 B82120513461C30820777ECF1C721B5C0884CE48E4E9CA79445FD6FF125ED099 82B6E10EEF47A8025DD6CFD0CCA8B06BA591984F99AA06F5202127FF29D47F85 91FAA2 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTT9 %!PS-AdobeFont-1.1: CMTT9 1.0 %%CreationDate: 1991 Aug 20 16:46:24 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT9 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] 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 /FontBBox{-6 -233 542 698}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E 2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279 650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35 F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1 4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A 438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641 AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74 D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A 082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980 9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0 4BA1EBFAFDBEC531EA1210365091671CE3C86A6D4BC591C37DCC02570042575A 9D24252D6E01A8603753934D7EA5CAC1BE4E5AD2BA047DE8F3983B23A8A1511F B08D373B69E5076CE4300137B8805EBCC0AAB89BBB312A77835795E3C069322D 42C893A30AD739E2BDD299679B158F7493764F2321E3965141B5ED1C6F4765ED F46D391A646B30C90002B1C461AEE79E5F094CACCA656CEA3DB921CC5205F328 A2C69F817061D6C60B121EEE844CA5008F23DF098C1DEEB7C8525A11FBEA53F6 98A9BCA2389071966670E9607563B3CE7E25AD67D95D4927F6AD572015F4A59C 8C618A3E7BA431403BC01F92F345DEF735A30ACA3B55B48B04258A2E82F69643 BB43967E4537DEB3745B4E276D6AAF0ECB79052F87DF71B2CFC2B8280DC2A205 30287B658793532220F980F87CFF6CCB40AB0439297ED795BE38C34B19D438B3 AF779CA633952D6F984C7A5885A627D4578BEA33A4AAB8AD0AA20B3F497E103B 64F8A3DF99B120CE03CEFD4F53945CD81BA0711100E332DECD15712080E13635 5EF2AB4C6BC0EF4FAA879390F71E7CABAB22BB3434E03CC272E68638810E4213 3E5F79D2202097D3597C7DEA0801441AD4ACD6737D8931C161CE677EC7B62D8D EFCBD4196B31E622FD652C9AF3219E3695D95C6EA2825456272BE77F58E6C550 47284D40234BAACB41CAC991BAC730396AAFB42342230DD6CBE47EAD192D0E9A 0891BF77AF840FFEA18F938E8B8C8304AA7EAB76116C1BAB98577E86F516EED6 5CB3E3C923DDA90A0F64B612F61289DDB52BCAF6AF0C29EF0CBC9AFF87414078 588FC1E8CB1A7C515CE7A2C5BC7A192E0A8E0F3162292FED4E663CEA07551CEF 82487875AE849504645DA2C2A962DBF82374D85C1BC9F2CC46F501A29A58853F 2FAD42C68AAC9E9EE68C65A47461A6466884E059670099A8CBDB54ACF54D60BA BB11B4D4578CD7574EF90B0C03FCC72691A04D73AAA2302E853A93654DBBA8EE BD619E82C7D83E77E0C932C2E7062371D8F2DF1F6DFA9E2636C863B83B4F2CC2 090BCC3925B4682C9C8342708EE6F1E4958ED3F2D926CC2EC3CDE8AEE0BE7578 D3A9CA50ED1E981D426C1145732D124451183C2E9B3BE6D92337A8DAB42EA95D D66F559D7500BD83F1534CBBE228D59CE583260524958EEDDA92C518A08A2F8D D3A6C9A663F6F178300A3D1E106CA4368ECA4DC3F1654CAD459D492C612B89E7 A73B0D580DBC2D8C2F1C4DE9466154B6AFA3D2FD6080FA409B8D57BC805B6F4A 5BCB9F7117A10A9A62627E8785F82B66A9CC2A6420F57A2A84EA372161B0DE45 2547D2E2B6100AB054681C488F421FEF1966E14072D65571FE2E17A2DA53F97F 2AB479094E10827D09E6D93799B071F2358317B7AEABF10A6F32FAE751970043 AC4EB6EADB7AA211F02803938B8C668250060C961039CC61337CA7B18A5CBC6F B0D73CAD8214D70B51BFE9A6F5AA2134F3EA364A5849998963EACA4060437EAB B7B1B0282F689C220608E90FE9A48E94EFA1EC325E519E19F1EBDB2301204629 BE170567DC4ACEBD3C9E77F58A18C9E7674E74DF14C06C9B79F214B1D9D68FB6 7B00556467E1ACDD873CF9C69B9E9DE4CB6C38385545D03463EF413652DDD8FA 546186B39AFC9CABF1C03988AF99E40DB41D78DAF0154816B06337C0F548008B A296B2C72FEC96D90537F123E349FC71F5FC3211ABF4204A392974F472AB1B75 BE473257575CEE78B5954B201B07F84F49E3CBEAE74F2344356D1D18C8DCDD50 3160341232C5C64F6EFE6DEF4366A077DD56419BC5E5AAA46204583282DCAC06 EFB9ED502FC0630248476D442E4EBCA78A6528D56251E82D1435B537143F5CBF 9B4D50C8FD5DD48C3404770471A4EC244EA3E1A29712FBBFFE73582AF4B91263 EA829C0AB264AD1B13419F571DCB6E8FB68F643C4621A68B9EB46AC0A203CF7A 4DFA6439EB79289099D6150138A259D69A88298F40EC9DE6E0C6D0166CCAB106 22042C8717E6699746A4E4500BCAD2CFD962BE58BA90D2F3C324899D795835BF 517AD51325C84354C799ACD9312FD1A68BF321DD1C570A64DA73F09D93F06B14 3C71FED756E583D7E62651871532A9A9DA08BCCB45AC9DCEC095060017D7BC0B F366446AAA9C5BCB400FED24E9029FA9C302A2FD1BE1F1623E0542598D631406 72AD661D5543C8E155BE180EEF97927F7D297C7891F116FEA273864B4F34D015 A46D3D4C1B57C3F0147585C25F59AEBA6566D2A1FADC2A2BD501E7049F4B948E 8C48A046F894F26E401A2947793C431FF80D5FD39411E2FFDCD1CF240446F62D E1147CED8F14D7C228EA87C84DFD1091580368000A4C7D72C522D7E8F00F5D8E 4228568FE0D0B5022E156E78C2FF712D6328AF0749ACBF204AB2733999017D4B DD3FA855AD1E814FD22D2000BD82A09DF349A6B04FEC243FC16292CD82A73075 F14E7C349A61E2902334C21DC5E6BD1F43892A0E293C8D23EC732BF0B437ECF9 284873394803C28728D538A3EAF598E877A3B6D45DFF61AB8A510627239775AD 9EB716DC52FBBC941B624BB6A811D1F1E0499032AD1EE979D81F933D83C4F01F 239F7A51191E747A776262260C606426DB43F5FFDF7413A74C4838D370AC3123 B888D7557335D205AFB531F4A731E708DA4AD6C6DEC091F24A3AF33F1F8AA506 3C2E1CE8C7A5893244C69DFA95DA70AC6415AB9D8650DA4A6E9C5AA347159DB2 ED57F24C7EC875166C12BB7C9E0573F6FBB499CD454D596424E3EABB80C39B40 1EC7CEE366DA4BE6EE8CB8B36BCA1B7861C9B6E2721163E81BC2A6D87D5092F8 069D41A0C2036751BBE07745D745836461688E7DB9623D58E01D0E9FDEA88130 8E7352684D89AFE8DD9E011BAA66598D777155CA7B465614E253B13B63204093 1F855288C0B98B0D3190ADDBF5E87204455F44556A8CA5540126ACA44639017D 4AB89665FD51F5B29709B987C7C6F7099FF107BFE7B164D2E875A85CBA8A088F D30E56836EDCB684DC803CFB800724B0B5556D2A7C018552BF7AF3056DF735E8 870FF3658D757FD8F2177FF787436C6198026CFC32E9BC779C0FC5DD1E45F354 CDDDF4CDDCC822B75CFF4F0F085E9908AB9D645CE8172B1ED969E2B58568BD2F BF2263CA6E814BBB0EEF1AD56BA8B3338A707E45F1F63B88BD13048A550852B6 67DDFCA53B34EC224AD5D318B7DEB4B716B4D7E839865495B9F02C622DE9E7B3 3A5122936AC6CD85E5E820813B96D5991EB331CCC07ABB27F0610D5B8D93C6A9 C212FC47EE042D091EB967A16C3B856CE98A6D77925CD90F7CE00E0EF6EFBC07 092DF61D15356B1086F69016194CB500FC4E78C68026EB5690AC583A39F3BB78 89CE6AE85B7399531281814566F305A6CC7EE4C23351547970DA591552E55D44 667746AB7B69A7B9F72EF84CA05C8B55BA2F2813B8A7168C12058056D1C004BB 3C590491F07752F21889BA6A304C0ACE9E018C533BEFB136A14470D42F2B1702 CA899800A832B7D169FEC902AD96AC59010F4E760FC708DFC25CA2CDCB18FD1D B1CAB76A54B8010A7DBDF8C8259E5692714C9F6865C7E1DCC3DD36D5AFCB3308 2BC00FFC4AF0FC58390323A7CB5471FFDCE3D0F0DA0C90532768EC4E75B398F1 1A6A3598CCD0CA764A52DAA7B904089BDFFDE26FCA6C8D79839B59E389BEEEE8 A316542A1E34FB625D02D53D5CB45C85E992779105FDAAB72336D9A090290AB9 E1A1CBF308D6F9B4E809A9C9AC6C884A07DF64213C8D11D1F68336E05C90B63B F19A613B7325C078816896D24BA0AD823BEF5DAEBCF36A0D21526D997ADAC3CF 2AAAFEC6434BA32FC483E3751061CDF66956B246314FEF9007610A8D3C5FBB15 CB195E5DA0BE543ED914D7D8B3A7F91302E27E1D7FD20AFEA563A89BBAE5F5F6 8446592AAC5798AD1E12A6645A376D1E2A4A3D7A642A21941E08D962C5A1C65B A7EEA14033EF11C2141D334F3FB706B8DD973DF78CA023C68956EC70311D16C7 232918F103B72CBBD6AFA52B332C01A2D70CD4E8115E59756C628A3F90AA2183 53B362FF63AE235B2B3735FF54CC0AE1B6F9228A63A7D26D37DF6AE0198E67ED F582A3D86791B83838D5B6BA78D0EAD90E000DA0091B5E3B0847B7EDDBE024CA 9B59283BE3A71B3E598CEA4E663024E6C6B91D8D14090D3DA7F9B11C447E92B6 E88DE37D38A3DC0D054CD58703A849C8981C9446B638FA6077193975B7763E40 E01E9F64EF040D5215309DEA22B76F428C9DABB4CB0F3C6B0D84759EF1C9AF43 5388D9E06EDF2034BF3C044CFF55AA4C24C260C6F14905E664BED7BFBD608231 3163CF949CD4DA8E5804ABB3932310853D79B245CF21023631DA0031F22D0DD9 B0B888768BA4A388D4E1B7CA211D905E495A5253369C38E8BD55CC440A660856 49792716D6B133B7DF6C2D0145FD4D0C32E82B36F8D3C4083B13AF8D536C572E C44B0A22EFB895B27FEDA2B4F8849722822E6ACCD47D4E7052C61C3AACFA0F4A C469446809295E4569C3C8B3E6FD162DDD09E86B78B6F516592497D0EE7D5182 B50DDC3C8DB358C713956721D2EC1490D535B0A6D0C2511916B34FB6757D4943 21918A1567DFAE0CF38C8A78E6F0F593A4E0FBE058C3FE7F9ECFAF3AD5FE707C 9EB61C58EF5224EBBCE0C59C21B8E81A974A45FFC728F139A6598C1DB4B65753 3E30B21EE83722B6590D3EB07BB0EC5576B078818F9ABF14D4288F78512986AA 601C898AE24B1F9A234933997A7419C08158F741AB22F5E5EBF60D92ACD46500 32DE53B95EE857F07CBCCCFA0D6AC16C55084EC3FEE4AE2339582E7BD09C1BAA C1037000E1600991E00B56DA3BCAC72B53A949938BAC1FDE9E49B812446FA936 A1D0A1DFDDFA38D8B917074C93B45F98B57ED664ED8A26ED68CDDB0013FCD1CD 4A0A7B83C456697039312C8F628BCF268D8FA47100B650128CB50265003F9BBD 743270196DBAEB0A068B47EED0DFA76446DFE8D79AD99B48681E0A93090F7E0E 765F44158F9FE895AA5729E9001F851A8CAC45DE0A1F4BD02035121A8A8AE1F7 B26A243B8BECE53A8318DBCEEC458D93167547B3C48A62D3E72CFB61D7973716 66F9C238083923289AE863658DCFF1AC7C8E0B63CE038FDBF4E7C3BAA1F04081 9BA3F81A5874BADBA6D95A9CC8D48DF125BBF01AB7DFC8C829E3B24A7F661FCF ADD7D786307CEFA10998080D09C0A97DDA55F33E1DB26776993A3E8FDC11EF81 47CBE6265BC9EA0769DEE0C82D5B49DADC978B39FFB09AE09DCDD22755B522F5 BA877717D5EF3031ED6AEC7AA1EA9F1A74E76EF146C51351531E7934C487B5AE 34A5DC732789CBB19D7D72BEAAF5C4C8270CF02337F8FE0751CC6D25BD5E3C48 C4C89BDDBEB07E54113AFAD5F4FB7C4F33F84AD8DB5E34D9D64D6536171F6871 6A67F70874F1485890CAC656C84BC92806D4903C0EC3F29108A936975BA12862 73ABE73AC5ACEB5EBDF220B509843D658E0043E742BE67312A85039F4AE48157 93961B153AAFD8CFC1C346A9A4F866CCD3751222388D9823C1B5A9ACDA1F2ADE 84432734A85FCA3B28AA8F71B0E20FB9ED6BB4CE6D349207E3429A1606CD0A1F 506AD97577E9FE13871792DE0EE1BB1EE78965442D47383B9079B9310D3C4C34 9B98F72423D9B3B73A03DB56D2773C3C8689B27A03A1EB6182D39D0637969499 0ED96CBC49ED0E96FF0176C092DF3C16169AFC5C41D34BD1739FA95D86252CF6 024AB0EDA56F0CED192FF0CD3C67E65CAAA788C09D89760CAA7788B0B585F516 437BFF42CB34A1758011A2D26764E510A6014758876D3F9F1E76759C79C8CED3 9279F0A1B303C44B0350E66607397AD2D7D4057C1AABE8AF47604C867E433565 1CE2B85A1924F88EF88A995063BBB236A8E6CC61F30E86AA35FC5D0B1EAC4FD8 364554C9A449FAAE56681D42EC4C1207B4AC56B2C56DAAB9926A49762E189F58 79192CD73C69DB8959692643BBA6BE6C6032820D1DF3357518C15F25D92A1A9B BE6EA98834774FD03067F98A43AC4440767EC905D6EF2AB7F06022755AD03E09 66F03C5262FCA0B42EC237A238D337A27ADAC00CC7CB3BB364C56162A1355D63 11B316633F1C77B4BBA07B05C3CB4ECE5F56B66F847AF2343F42E339488557EC A637DBBB753E1E7F8A1A26EDCA49A9801A560FB0CD23DE0C5EAAEE1DCA7CA1A6 CFD18FE33008E5EB9D8A1EAF605F5F0C988830FDB51618D9DC751D2D3F681F1A 4247942FE023B11B8295815926BCD8972D9A14AB832D01BCE0E9CD7B3F39EAF7 A5D8B818D4EDF1D00DD24EF93E41FC2C9935B0151073AFF30453C9453B488D2E 3164CEA20F8E53E7558FBAC9192F157BFF52055C1FD5572D0201B68290E05F1F 4C12E7EF571D8B6834A916B49191D05F679830BA557F0BE75B0B81F6017DDECB FB9FD3668124D666EACE0D92982BF3FE60767BF43DD1BBB9DA49BF3033F0E163 292ADF1A9C2E6984500AF8162001FA2A182818AFD57804CBF79B1354A6CD22B9 9402CF3B52D49D52061B342DE3E053F7E87E789AAE0C6A321510793CACB37FE6 F36D0AFB61BBD354F9FA51EB6E8A3EB87437474CB7C9A2D399A91D99C1D5C622 4D1C461E309A6DBB534B34C29BAE2166E746C0B267E6CEE71EC9569C64C0B26A 798C8B634DF3F7CFEB08050A0DD910F7DC3B978075EB23AFB72B46D4AAB8DC97 9F23898AFDFAEFC96AFA47BADE9AAAA580FB90625A7B0F7C7BC8472CE99767C3 F80FB3207453742B63B36D063A6CFEA520F744AAFA016FDACB11CE7269DA07DB 7EAFD778CE065717512035C3ACC049DDE075E8724343C7720C217ABFDE9FAE77 2395AFEC6A786BB0008015C77E2A124629103FEEF89B962D16F5A9EAA8A74D35 CEF76CFB6FDA7F8D5A22F2D81308E90E3A51A83D18145057F70CDB171BD5DB35 89E5AA27C97EB7C61F21753C1E21C9503660B3A1393EE734206E29F161694578 292939A9967C6C57F9D1B406E890AAA3A3FA0E51D62D4CFDC42C6EB30B979F9D 2700AA0AB9F5BD032439DA1D7E80283ABAF1621DA6744057E5B275424B1AEEEF 7CD90A688A9FBFDF25F675B8989735FBF5A71878EF508701BAF0BDCB475FE2F7 DC4E83B652C7472107AE84B826970DAD15889FB2FEC8C84FC4E382E5C6422EAF 5F9033A69B2D7CE47559FC0DF1C967C28A140F7C135F21E26966EE00FA23B3B4 BC5BBE5A48DE5BE5115B7B35D5347A46287C9CABB769F7232D42BC3991DE8159 886B89B6C193177D72850DEC1271CB4C6E4B66C8C7A238FEF6D519F2CB656B8D 3EFAD3ABC2712B4D791AA8EB182BE80D7C314EFEB596081FB473291A2836F192 69117152F0DF4D152B97105B538260A2E8F031D63032C79880072164646A00D4 3C4B11114B106D398F4E1118008688E28182796D63B190B9702503153B706463 9AEE5BE245B371F1A8AE5C089DB1B219185B62460B700EC1D9E8ECED525E256B 5C340E5DC616DA271E4558A411B669C05BE555BD209E89447382EC75EF809E71 2149DF776FCD686603D55208D81583CFE66FC21B212030029ADAD999F4A2AF5B A69A93A0D305362BBCFB3607E06643B810B5361F7257220EEC801EE13BF568E9 B1E43D1AF42B3AAFC1980329A1B76782D1FD1DA499510749C69E1DAE204C07FF B6033B4217C56C3DC59C56E3A986571200344FD8A7BF7AA5921D584E34A0134F BB3430FDE1647981B07EEBC6D6E3C0FE31BFCAE4F9D79922BD7FDAD1C947D360 54AB08E7A3DFFF8EE646EA0C650ED778C601A42C99B1CA4820DB8E8129C6A291 794FBC008E51A096033D21DA7E2C3BA027005CD698B910549982196E3927793F AC1B48087C7B71DFDE6B3BEE69F4BA8B85BBCF4040BC6D390BB0C67F753CAFB8 F9D5406FD5C6CC0B239FFAD514AE5348C3E91E864CF944A2152BC183016ABD86 899C2854E79E37423A2A6B82D3977CE545BE8138FC338843C8E3CE90D4488A30 61D64C3852E5B0E614C290940CB533EED07638D301D295A5A3D0A2ADC1766588 050722D7C56875941788C5FA73DF6C15AFC82EDDF1BD7D5F74D4C8B3B2A9C26D DFAF46E7D80AA4B75428923E8F8A0C7D76FDEBEB8B18B977169BE83F210177F1 C48FCB3C57B166AE4881FC60D8BBFADBDBA79179E0201DA04ACCCBCF835B90D0 49AF9BC25A34488811A0D8AC5C4CD30FC7405A7CB311980A8901DC335C100A20 6D2F85C3F4B850E82B595D67333A4E19EBA8F8E3F7FC5AF6ABA6BE2ACE252489 5A635F6A09080E68CEC7CE86290A1EE1917942F8215A6CFB9F325F44D8502B39 9FE6C58494ECD32E3E24107D58F1F192D1EF6388C385550034FBF5F71CEE3508 5E58E2FF3DF78F3D6C2DC680B4B635C0AF556CB21EE29FDB8837F4ED58F704FC 210EF15DD2C7FBFA57AF9CDD22CCF4DBB14AF0240F8B5BA407684556910D7A88 8DB22639BDF0AE9099FC1DDDD01E887F5DD40456412EEB4DC8B92EC01C0DF4C5 AFA824FB2B49E5D266776007C54630D725885DB2580A0E4A2EBAB48A83F50FAC 9AE8D4313D416192488B53DB7D1FC758418E6393B0A31B2EDA0B47FE639074AC 6B5A103DD65912A9F3661F7C4B1C961831D4CBE95E56281C8F6B4802E0CFA812 5E89E8A4E801C83B1E1E671C8C29148D9E66CC733C2FA909F01D14B22B9DE54D 8D946D30B5BDA3D9D54BAC8DC0407B22E04844A426C3C4F850C6AC08969EAF88 D57B7DFD591162A2CC3B39D3DE42F59FE1075B22C354A32CF5C18344CDB5DACC 8F34E10AED2166FFFA93413DA79837BBC312D523048AAB5AFF710EC013187F08 16BB6B81C989215AACEEE12E8B275ADDE698B525F558C7581E953834A190072D 7F5AE1FBE21BAB680B00435BD48E127E66F0B1293E6AB6A739D313A3AACEDBAC F9A948D8806581BE8D786EF8092FFCB0F045E6B389621A779649225A9883984D 6549CD8DF7CA2B9390BD02BA122BB88CC8E774D57003F5DB20C813B7C7682C21 0B3A9AF46AB39C065F55CF8F5E82125BDF90AC23C65940DEF36C59140468D341 86EC9135929C375B3A6669DBF35BBCA30FF06874C50F40F1BF6A9686AA3442D2 60DE0B7E757D25F0C81EDE5E4CF20ADC257029D2A2973769326EBF823B814691 4450BC52F93E8925F11580A6EBB7BB09C42DB8463D7A6B1AAC66A476F42615BA 1B6F0161CED79859435C7B685F9832E790BE2BE87C4107ABA3B09A31BA69C796 73E0E4850865AA0D6901E8F097C50CADDDFCFDA9B846D27E82489A8385517629 3AC365917DADC0FBEBF882651C037EE822689BC241C382DF7E899ECB140217D0 B17F794227DFFC0ADCCB5B21CCF23218462708F69649A48C08D3E0523F0D2695 67185082444282FD6251BFDA4D9766546CA3735AC552E7A201AE5DC2DECBECDA 039DDAEC1F6382A1C980FD579B89774357452859830FD9F1EADD31B8EA1972D9 1A8563D85606421AD645F6AD1DA776420868FF06007E131C9965EF4CB6301902 B3AA06AF96A0427B230C9A8239B48A3C9E67D5834B44B369BB7BA55F681D52B2 B77532C1CFD4B5FD02569A0815EAEB358129790687BBB7883A11D88C4FCDAF2D 8CE6F48D18E81E880FDF21F48874CBEFAD71B7F75F6E3608EE10B91FB2DA2885 C58712ED9A73B2316E0B031C69C3E13E6DF414C7923DDB181130E648A72BBBE0 AD2F8284C5F32A0DEFF238AE3F178717296120E0CBF85F17496ED4BEA82521C5 7201087E18DB95380D29B7D41C71AAFAED7DC7F386A059F37CFC1C5E036A6DAA EEBA2AC35D8CB5513341BBA2F66A3A8C2DB5254D5865D2A09C28EB8866BCF77A C6C642792C7D5B8B98494B1AB50DC7B7B73F84C0D9E689B320EB3F78802CDBF8 1932BFC97189065795665BA7D9C0B996205BBC33E7E953A942D436A848D60C31 AA3EC00C9259A35D46D3AD72B12BA09FA5147FAAB88BF98AC03BECC111C92338 E5C32B051A2338E3F7124B2C2331117F0E3BD538213ADA1E2BF9C67501846F4D CE12524A237A92475B151FDAF3FEF6EF44AF8D73DA89E4BF2F26D01497DCFD44 28452968DA88F5EF37FF82DDE9AA2D26572702C95E300D6BCF8EE4F6FEE550AD 2069E15A8B02336C72F3DB247E756700A873C15B22D0C678FC4ABB5FBC0E7BC7 6AEA3DEDFC6A4D67BE32F32579C000CFC858419E393A3617F495806381D9C473 459AB0512A4765B29D7339E1068554BE5514A31C65E9CBF6B137C7B6E6230ED4 2AD4292E54237020C0D59FEA10AE705CB0D66F8C7162C10D2BEDA905C239B633 48B63918C848BF07B5060B93CEF98638592CA1A1F378907CB3C119C8FA9F0AEF B232A578E97B1D219FC4A4E6B468EE9AC7302F315E8FDB75AA0DC7C5F4AF8D02 063CB56BAA9081D337161644EFA77AADEE5B5FD0A9E23D1E6B2C993CB5D9861F F933130EC98C4997EACB99BB0651C0A62D00E6FE21FEA867D7BDC218A83B7F0C 60707F0864651897C9A94777853989524E0F879DDBD37E0E16DA4193541C2A0E E848337BEE596177A695FCCDCCDA2815DC916C75ED593492D47941C0066F94CA D255773CE31976784AC8D96C42A8531B496BFFA7C004EEBEE2EEEDCE7C0D12E6 3460E1A6A3A29C3704FDD436E4BFE9B392F4D039C5E82876196BC1C6EAB58B94 6621BC406ACE07DC8EA0B966A7BB1152CC69C0B2C4201A3108D025229F444F04 64D60965AC96C7BA6CAD1E384D21181D9F7C6BFE82AB2178BAB8C57146696F4A A314E37BD9C2D30328068FDA5196284BAE10588E1762FF179714AEA6E23B983F 8D4AEC80B4244CAF00C08D799D71BB86971D21F0AE08C5D6B1547B49B07B97B3 6329398A20DBBCD1631DEA7F1655C8772AF48E255EF1307878D648EDFDA3BDED A449846BD016F844E54CC83A6AF4C0351CCCAE7866A5605A75F8BC4863EEAF85 8C4D4F2EBC3E68EECDF01D149F94EA59D6DE1E23457700099320B9CADAA2F25C 1EE36EF641839E1C66BDDFA078F6C0E57531DE99D5B8FF93EFCD27BAB14821EC 144398E095677BDCE884D08B77A43C3CB84898C2F47D2BAA047C39F747A9FB2F C2256A3D69A96E5556BB42CAB20A3479A4BDC264744C1D21D09388672F2124FC 5ED76FCD3DB8CE9E83128DDAF38EA09C5F5BE534B7E8C763818967D6774AEFFA 943F41D49E165FC6312D9A2919868F18FBDF421754807168F3D0B46D6FFD94B8 EA4AA76745BB42783BC3D6E180E249BA2F49FA9EA93C7C803E6B60957FCE0462 F37220D1F02C0609FC8F86B0BFCB36AB362D65FDC9E4006972F8827DDF0B74B0 6D75CFBAFEEE0666A3E635D6BF6B82ECD59A0EC11A598ABA9C719516D40931E3 B88807B0B97679EED2750DA89CE72490045ADAD93E2149B2F4DE824EDF4F589B BED47D1A68FA443B43B12627213ADB4A13955941A414298369E56C9296A08948 ED824B5AD50BFFD1278012CBD25C2900947DD36C7BA84862BFD0D6E5C8804DFE A009520243BEF0FDE4E28A09308967AE5C17557905522070944642A61E0C3ECE DE6F930581CEA7D90722353094AF344FFB6A9AFD77DB33F5BCC4C389EE337093 C729A8EBE416D38592E391419773533361AA40A4A069DD2E513E01529379A770 CF1E4B6AAA04E6859C7767A7A8DABA86A47F00504D97FE89B9EF06C2215F3CF3 EE4C1AF567E96FBE44DCCD55C5700D7B8978B02AD4AC66D75B444BD75DDE1694 A63B83762C0E16096803805F6D0DCA0D860854CDF5EDF0505A9188358952F936 76CD51B7C1B080DDBE0EE98844C63F603E8A20C30B82E9FD9666127DE42A3EB1 8B1351970E27C4ED14DFF0A3B233F5CD1B0C29F83EB364326306509EE34291C4 42F3131380CC0CC7044B27360733FDA81FCB46CE50C78671E7805DA1168E9E1D C0412304730716E52F48BD729E2715EC9DD491C30BFFDEBB47C8253430C3BDBD 3A943C3E39DBF1063B33BEF0C9E6B8241FCC3255F76A731CF80EB31B57439231 4A0C689379136CAAD5E640F7A40232B08538C6EAF28C00DE6D26100D792250AE 669E7DE50FA71A511F3B9AA23DE99764999D7E04EA0B6E133CEC569E50DA13E4 F8A6232646C3C501DCB6F11EEBF2C7027EC938ED135D3397C0EE21A2887F6D6C D5476A118374069148C7528B8F2F755CBB26FA6632CC5E1A63CFB6E54FFD685A 0312B80D606D31B04EF73A53BE6A5389EE90A6E39A8AC664638C63DFF4454205 2CA6F1D105D12E90D1D4022FFE7F80B7E14A300B94E31ECB6301CCB7F75AE168 B4A38B67F5568BCEA87C4A4E39F9865FBD2325F7F1ADA633796A9853BBDE6A52 A1427B9EB6E36F43085E5099F2955E3B26B4E3A19E888D7BF716225401C284DB 5452653EDF68D540DE39065356267288D831AFF2507DB7F0 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSY10 %!PS-AdobeFont-1.1: CMSY10 1.0 %%CreationDate: 1991 Aug 15 07:20:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /CMSY10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 13 /circlecopyrt put dup 15 /bullet put readonly def /FontBBox{-29 -960 1116 775}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A 27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF 5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A 71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C 515DB70A8D4F6146FE068DC1E5DE8BC57036431151EC603C8BCFE359BBD953AD 5F3D998D8365AF76D4CF6A06FB66E1CBCFDB3A67D8880377CD677B9705EE853A D849F88A828E244FA5816B7D081D4D1975A56D771790C21AE05809BEE6613452 953F26C39CE61F0E134BC35404FE2F0B7D244D9A6F66E4D817D1C65024013AD3 5F242EDE94633B8E20EA42B07F83BA649F12B784B2AAFA542BC597C6C2C9AE9C 39D60FBA6CD16AADB5DFDABF22F37E244DF3987FBFA55031CFCD46ADF03650CE D6CDFFD87BF7407FFB63F3FE4C29FE753896101B2CEAB9007B66E29D6A5B85D3 FF91F888E445677157A5996FC7A3BD19BAF3A3BCF33F0719B992A0F013B1F0A1 82E42DF6F651071FB407F448DFF37653E2A0569BDD8EABC3280B3582745DB98B 644E5B341F531B0D81ED85F815B993C2B8B34CDDC6AE97606F6B3B1C5427F174 362FAB82B935087B568E6F526347058C406E878F1CC2DD05C26D35565347C5A5 7575891BB4 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR10 %!PS-AdobeFont-1.1: CMR10 1.00B %%CreationDate: 1992 Feb 19 19:54:52 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] 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 /FontBBox{-251 -250 1009 969}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C 295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C 4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF 2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E 0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B 43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC 96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4 0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20 3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122 A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379 5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA77428025D4059BA 2988AC2E3D7246BAAAFB89745F0E38580546045527C8779A254DB08DCC6FB9B9 0E172209FBE3857AF495A7F2B34BC893D942C145C2204CFCD6A5C69FEFC25B60 E412CB2BEAE7F7FAD03AF46344F6A7D483BBB1E896BF16B0F4C363799DF23CE2 E8127996DE841B6F9D8A9E56BD799B6A938582988AF87151BB8D3AEA85C49857 DD862B5E10D9F33D57795D656FB616BC9B8397B3612131A2B0F472656700958F 739A548F7C3A348698AF9F6F9821D7A9FD4131781ACBF7EAB885A3AC254DBF94 02FA697941A0F97F048861788BEACC20DE829764413CA58F9D045A6B38BCD6E6 E4827247EDF1171F64E3B041A69B244308DC07F66643FCD7D5FD37F36EC4CB5F 957D4ADAF91850A3B1A765E0E580EDC77556593D1B2E1C22685268469298688A 45C474C9D0472D019CE1E83F25182D084AD85A49C502E8D679C227DA8E32045F 8055D1622C478F8FDA342685F858DE3F53F1CEA0D70BF3FE09037D981E9E7FFB BC3F896535D0DCF53F4C85A1DA5D0B632484D1F25460E3EB38E251D2AA17817E F3B25A2A49C0AEDE0B89E277F52CBF744EF0243C409FD71FB0C574640CF11599 117A4F42F27D8D282D34485AD116F7E753A8DEBFDF7C552A1179C02B7A37782B 743D0DF85C15A333BE9EE82C13DBC9CB007DEB5900954AD9309902E08B3D5BB4 E8414211B971CE8B9F05A61C15F400D9297745F606C6419E8A8A9ADCBDC39243 617EFABFDCF9F836D14411BD72EE19D0BDE89234BF7D52E7A68ECC952FB74FE3 33E1A87DA39AEEE9E90406E2B1CF3799C63E9BA858D54F38918B814C0DF0B696 839C820C26FB473ACC5C08E2056457A74123A398806EECDB427BB183F5458105 2B66D7E1FC3529025D3243A045625E9DD9417FA089B3C7C394D2B65C0367FF73 79F17ADEC6B5D27A5D3D3E244A0839E38267ACF07B2D994C2B4E7F30A416EEE2 D1688F167D1641A72A795B1F4DA3350F75AD6D546AA118B5F8A5085F5794E6E5 28256CD31D250D8328C9620B8ACAB03E4A33DB4595E959F4D0FB1C8CE85A710E 22F1940067C036A7DCED7EA48F1EB81AC4735FB26A249A32AC2E3E7636B32D31 7D76FBEBA106D6C67C94A3BD4256B786B71C6EF8D191CA90CAD8D2EEAD42C6DD 8BB4BEA7DAD4ECB6E002F3B71C2955A5A401E34D55F755BED68178C270109BAB FA0AD848347EB977325530B27180661A59447D7DB55A62D65309DE24B6638986 1D3A539BD37E74C2C00DFED3336B5C6B28D915AB7188FFBCE3ADB3CB903944DF 1BA5923A1C053D4682BB8616F44E81E18DB2B58298F4B1A6289CA993DF3E7C73 B00DEA3A9B747FEEBC4A11E5B9B8B05CA2709B8AA935A42159D3DE399544F5AF AC1CC00F6CB94AB69856078C9A2EB2046BB9055CDD6A0622112F7D3710143F1C 20CD8DAB4109CD47BC00EBCB88314081C1D6C43132412F261CE0262FA28DB7A3 C7D8534BCBE1A60488EA230DC558B73C72AE87539A9D7E28C2BE05FC05F58DDD 87117FB7D26E271EE319A45AF58B5060BC504767962151AA0BE18386D7A6B067 DB4EE68115AAD6C430A83684A650CAE13BDD3B2273062E649AF34CFB7A1E33CC 4459B32357BCF9E9D240B4B49480E19266F35591878434DAA5C22547994C95C4 24836FB59B23DB98769E02DA06763496C34278BB44E9ADB6B0A4F6F25513491A 5DEF85F52B2AEB160684F2FD877B1C0C20AB9CA213CEFA13DF43E8430DC07E84 AEA51089F7DB2D5A2DD2B41A09C6DC4C0E94DD1A1F9B5D4B948AEBB424958B80 F1CF7424B30C9459FCBF8ADFEE2DA11544583C2A6D44EE145C1848C52E01EE0C 7AFC55A87FB3A81657D41098685A17A181D0CBC519C1579B64E8AA9A56665016 221DD4F776B39E4B1C7A6E06E92EF8586B9BC24692F3F850EC07CAF38D46F388 07B36DDAEE4EDEBDA728B444B69CC8C86E8A316338EC254E0D39527A6BA0101B DC4A7C0C6B3A57325B671E16E7D565FE32AEC8F12DDAEABC4C0F5B81ADC4FBFB 3058680581EF6A59BBB791A36D25CFFC73832385B74AA2909E2532E12C17416B 9C753552C5CA9F257B49FA4DC9E18DBA9E74AACC73891AFA4EE5AE5270A49AA1 F21534BEB46230E1443B2CC1BBD7C8A53A4F81A94917F2C8033B81B3A5147009 6FDFBE24DDBA427A8710558A3FA56FC095CF43965471C12B7E0317A055181D51 613B637F6DC09665B21627566D893D99E8FE05DB46054A99E9BD96C905457807 040B91EA8AB82DC2B238DF8299DB9D96AC80C58EC470E44AB57563C69ED0766F 4D7897A49CFF983CF4210633F5556ED3EC9269C69036DECB0D3F95D70C4160E3 CC03EBB3EED2BC58FF82A1441ED504DD64141BFB1D9577D697123FFDDEAA86DD 122B65104DBA6FA94273E11F847C3F6AAFB171F13C6A9CC35490A7059FA99C53 EB841EECE3E2FC7293601E799851ABB94E61D5F9E19577B5C5D53FF307739FB5 8AD96F4C982FBB42AAFEB06FB5B985CF3B5A94D347795D9BE05F0A2DB35DA51B 6C6EE6F81B9A14A470FB8EE86DF5D17C4749F9C64F40AD82CE6F5DC2A0E61355 FC3845139194F4F5009E8299E9FFF9EC7D12FD49E423874D41FA8737009E610B 8ED0B8F4DA3D512635ACB23828E19A26307B7A2D3EF8345B5D8121DB386D8976 AE7D6792C02EBD15EFBB17B514D4258A2981D64A800AAD53BF194F5167DEB3DA 764499D825A23BDC6565EBD942063347874C34413B02569C71D90B785ED3F7A3 BA9987350892CCB89A75A77A4CFD7DD6383E14CAD21FC4F7A73FF4271E57EFB3 A0F543FD467E29B02115D124F47DCB3C02817123B4EE694B9AA846F7CA86F432 03B64474879A2D94708721A0CC8FA8693A72CE3EE4AC1F4D6A47C5EC92BBC1D9 A0015887829A47250A0B9B19ED203DA3231C66BE6056EC2495BE6DB3E8EFBC6D D47ADE79FC302ED199F8FA1385747D3652F5E3C3A311D4D6FF082953B3188EB7 C7D3FE68B51DF57AC4697449E539FB149BF6797E0B14DB1BE89D97B0B93BFDED 622694A35DEA11D8ADB4F117D9351F73BE0AADC51282F4DD00158D0DF10A307C 6D20394A15C86CBA42B818F6A68A89ABE13A14CA4DFA4BCA19DEAC249F83CBBF 7AB2074FE43424EA9E92BBDFDC3EE2CC7A8F3666D0D30452409D8DB80AD1EBDB A12846FCD4226A6B357AE6BEF384A58E2FAE1C79D43D5E474E0EA2FF1D833899 6C386610786C056C54C826F99585E7296C4CDBC846AC36D94EEBBC0DEE84FFAD 210AC51E2EF34126098AE612DEECF8EC4533EBFF700F9B75BACEA7B771CB397C 6413830C7DB0E333151B30D32627FCEF266E170A4D4E9D71883DF60C4FF03D08 8EE3EFC8FCF74EA015E7EDE94C5E9906A3AAED85DC255CDA01D9063B124EA9D9 54F2FDDB8E05829C8FEE07C6C027732D717A9515B3417BF705870EE6364DD785 A3203480FB548EE57AED6B3739B3F1C6C2CD68BD1A0A052E373C81D661753994 7C751E6F15E7EE2C075F1C43DBED60E8FF8D7581EB2D2112F62F15A3C6893026 6651E3AF5E655AB85C63F34360C4820D327F6CE24D5BF665355035972DA992E5 3BDE376CE6155BF5C3BC0C05ECE69D824061D2BB29CE02307B6100BB8EFF7ACB 87659656E6C175E8D064D4B9EFF87EA45E42CE881484809FF86A0DB01E783090 81B04CAEB3D27B34ABEE1FF55F6E3BAD0F9D47DC8E2DD2D75599C17C187D3E9E 3F0B2D57D03F42EBC7FEAC40D62DD2545A297F7CD1C2D3C28BEAB8F069937A60 76AEFA5B77BCEB2AC85F000E046F4D9B009688CA306970EF923E9BDC60E4E9A3 628AB4D1E0D643D1A0A18375000ED121B460ECDF65B191E43182FC69B62BB2AC 991320BC421EFC03419AD216AAF307ED3A2222A923E57A43A13F18199D5A2393 2C2779A6EFF51DB8A696EAB9E648CBDCF606654BBB7DC9CF5E05D64EC7433A2B 23C713A4AAEE6044DF5231C866CB126CC8D179EBE944872FE00E5647FAEBDD31 069C5BEB6DA336A45583C87856C0D8409D8A02A58F0C16D712665667CFAD187A DBD8CC8AD1962DD6494B792FCB6A410BDAAA2E1B9C8EA0B57316C15D17EEB68C 080A43C5B803A58565E93F3BB30832496055E861F6503AAFF4B48BEEA5657992 AA29F49F6E89AF9C7A16BA8F271E09CB0260922A3D706CA4E55946FF3DA900FF A8EABC97426188ABF8BFC2D85224F9D0BCA5038EDE33BC6EA20B1BC2C5B1A683 A5AF575CE5EA826EF7D777F1824AEF9A456D8A1857E79CB21E75C1877CF7A0CA 4E3E1943BE4F614CF9F8D422CE8BC3744A09A12BF2F0E0B9EA8412ABAB1050B5 E5F423F3974EB0F2C323A9D5942BF0B52217B616A178B51DE68ECCDDF3D852BC 3CED3FC00C8358BBD9621DF38709A7BC7CA7F507CAFAECD058416622C8A6778E 56DD0F56D087DA40E09429600FC97DD913C31491AFC81CFDD915D2D3BF3811A0 8FCAA9F7B9A1E800E4E3CAF640898FF358B3B3AFBF09594DE760D03B2B21EE6B 38EC7B48A4EC277FA6E52434D9FEFC5C90CF038E7F8297592057CB484B697E14 145D80B40B9FE18D453AE12272B4165DA8ACCF5D8161303CF8AC0C67EFEE09CF 61EC2BB71FB74AE4936C20AD50F006D7818A1B5F6546385280062D5FE1BD3B92 AA7B6D60AB4000F75D7ECA2BC27090B34D313AF755BD6E8D2670929ED5D9A7B3 ABBB2130AC0AAA0552FBFEE360F0491964A823B54AC07DB43D526B1646F70C08 C9B143A0092EFC0C680E42BE0C7104CC23ED2103678AB9805BE6AB0501010416 22CA00A41D88E36048B3C871A917D8311B88031931DCD15F687AF5380CB73CFA 933F9682D8D616DBCB68CA9E1FC7DB0CA94EB42E40673597589E4AFCF1313C67 D0B6B2A380D4CA41AA89417B19E5B4BC2060CEEF5676B49000D717250D796359 CECDF88AAF08B71AF8859BEE17A9BFD57998A6C66419232E7973F01E3E8A3B3B C4160A1F51D1AB8D21B32F8DAAC9653077F752CB0B141589F171B312ECCE4AA2 A1ACE97D0825DAB81A577613EE062BBB62B3D75E3D045E8B0155D2A9325F6AC5 29DEE4C20A015E03DE5B60DBE04E2BA16228F6EAE52913AEB4570044C0E817B6 ADDD0596149BC6C429F46FDFB0EAC6FB4A1CF298495B59C8A70C2B9D240C6F20 93B94A632BC46C7C2755CD234DCE75562990C0258C2D615DD8CD4092D10B0FA8 A7697647846DD95794C141A571BD27295A6498BC8BD6B2ACBBA73D6239B677DE 0701EC5B5994FD981017F5B314CED6070CABC53356880C6CEE6DA1C519198B7C D390CCCFD01B089375003D055B3D704D3F67CE6150BF41ED2CF7CD4701230728 7F89E00C87705C76B3CE3CD1C3929EAB6000E193D01E9C7264BF29030E9EB051 FBB094633BB51629DD1DB40CC5F3FFA9A70093E59704C129FE895152BD6C5BEB 66E46DE52CE673316344555B00BA09F7B60455C10548EBBBF13D1FD485585A36 00061D31B7DA74AEC16AB236780E004D8602B29120854C950F29FF6F15A4F853 83A553319C5D2DE26011722C90563043AF87E0B851FD47C01E30A6E73546E0B5 822A1C591AAAD550429CC1143584B3E827C0138A6AC5D24D3142459A996AF5CE 8177F93ECEDB4661107DCC38BA9815D7DB51E35E7D9BFA11AA6D4FFCBC95DE64 1A563634B42202994844A9D1D6CDCFC0439BCE6B058D8E902A279DCB44F36DCA 186C5C15434D987ADE64331BAE39CC537D826F9803B7E9461E7415B66327602A 83E73050816AD4B284B7F38D506A8C8F3931CF92B7774D3D4AAFCE1B5D2DED59 E15CBC2D7CFCFE79664AAD7B4A005A0313403EF78DB7543DFDB0077C146E056B FCF76BE09EAAE4CE8C4C5F6B9A400574C3E02BEED4C40BD49BFB2C640042E6DC 5B6CB5D793E27453B4ECC044D9232C3901DFE56A5BDC07FB95E6B19E431A8728 6E2FE837973B10CD1A207D5F52DF1CFFCFECE436B4753E4120B6075B43DA9F43 3D09EE27ADBB9E3461489F3F8AB70D85EA3D551521E208421390EE9B97F6C7D1 FDA6A6B9BDD9C7FA025FB6EC31CAB096D467BC25F07BC0B9F064E8A02DBE0411 233C350BEF9874B22C783B8290A6878D7475F6905AFCC9B20DF5D9453449B90D 106805613B924CCB40CC607140C1D8CB4C66143DA11EFF15ED437B23FEB505B9 62F3502C4CC0D8F2AA7E595C05BA4647CBFDE86238A9AE6F4AE3E616EE8EB11A 2E57F499C5BFE242D1F4EF7E6AF94EAFA6F029D78572FA857883410BD42FE17D 53FFF9CFA96544326F5CCE7A29379B231734F06CBE7921F42158FBE5D7D650D9 618D4701FEBA560CA102DF29E9595B0871585CC8D810341987537EBCD0C003E8 AAA0FFBBE730247E15DFE53E820EAB442E042A180E41B1AC45C3D35310049E96 6619E36CC21AF0F69D6C0A11466FF49DFC0C5F30C5118CD95A8A36888C822676 128015D05C755FA399CCBDD108FACF02CA2D66EAF830FC2D8A4413A18416C52D B87F9E91317BC5B1B50E8E67ABE67AE5F20B16364B0754B682BF918A9E8262A8 25D1DBFD6597DC5B635A73395A20F310AD55D47059931ADBA6BE34BFC0183F51 54B4A1E638D954589D823F65215D79264626E3A935DDD6F0F5070C2301F0CBA8 7B51DA5CC2CE2993F68AB04A7C83155A4FDA32EB7B02475C2E0DBFBF65086E12 26C5AB818E7108D6E275C226C5BA55D9BD89107BB73E4F3302AEA534C67274C4 5AD6DDE7D1348799803AC6428F514688408069A6EE0DB338C422EE68A21D7CBF A5AD9AA7934C7C06639064B0257A80447BF9433A7BC0122002E45CF9F2032415 58191AF9038449A4B780701834D1D93C4BF49AD18A2296BC2B4E43B425D34933 110C63C8442A989B08ED916A97EFCB6B4363DD66240359C4E961BDABB9EF406F 50B5E99461D5C8E133BF7AF81474AB31F8140B803B99370FF3081D80022837D4 D3A3706E9B0B3972A81E4D2E7139E255AF691F6A4678D01DF3BD2A32693A588B 44E3B60BB102DE737CC83D432FD76260355366E09A7850C4F269101EED46630C BD80499059F066A2BE0F3C83B0D8E0A7D6440A9F79291FBC4C218C57A3B6A487 EC56CAFC64A6E517E2C4D3267CAE196248E6051FFB2824552D0FCF656A2BBA49 8E8DFF9B3227D820CF942FDC5722A7BA220D0029C28465666B99132D551FE278 C93D4E92FD003903CBEDE56E64D7DA481297409E5B63423D0FDA65431E6A59B6 5ABC9EA077F0F08F26C3AECBF7D5F51317C4D8EFF5EE1CD6664DCE57022F2965 8D3520633288A0442533C847915E969FE7808B485003FF34B3F29850F037A930 583DE61E0C92E56EDF3F08227146C48545EAAA72975FE80C405D98E1634953C4 8469D25036B107F3E2FAB78EFAC01F1A7C266BCFF7D4AD006FC21ECCA80A1F44 8396C4DEEA7F14F7C051B24A76F0027B8AC80956CCDB9D86907BC6299484F168 C20BAAF6D131C506AD51FB477118BE491E72283697DC88DFB1E5225329F3E7CF F0C061C3C8433C8B39B81BEA0396DC7A0CC0A9DCBFDB7E634CAD538AE4CAA055 88E63B4D4CC99355DE2DAE6555BE3B4C633709751EE1053C35D59882B3F3E559 0FB569FD4DBCAE28B2B415B444BA6746C0968ACE6CDBAC2A81205B0D7329026B E8F1133A3C02CCBC4772A8700CEFE0F4FF6FE5D95B6CE6329819F4370F3461AE F6CD85F4F903FB220987A51696D3C141ACFB90BE00C2A9263F42DA4AC7128E8C B4960BD94617A0BE1E9EE443E625C3A19F6988A52889424F52F10259CD191ACA DC0863C3F38A85EF445482DBCFF9BAD900E86A37F82B64C48D5C8B7EA961C476 EF43151EC824376C450610CE2A3074FB84EA257E52E8CC690527833B70B08150 DA3907DBC1645613B9F02C9E97AA3E46552528AA8138A9DD54CCED001FF3A0B1 248C62BB75B842F56B7D402A00FBEC7B3660E1B85BD2B2149545FF83697EC13C 0FB36D733FADC3AACA584E110B4C97B34D29E9F62A69BDDF8663DCFDCD7DD89C 9FE559BA7EB195E27177B9E6FC4A5EE4E707749A0DCF391448D2B83EE91FD91D EDC44C2013C9444399BC2A49077AE821BC0A51494638B7307F4ED02A0B93F685 765A2CE63373C2ED943BA0B92AC29F589A34391879D513D318E659192EB96800 F70C097613825CC6F0A83BACB6128603D5D1DF74F83FBA4C55CBF4ED0251796B 8034371CE0DF07D49AD6435D048C2B11F29B8F7D3D259566103E645592CE6185 9532BF90BAC105F042466043D52D8E323E1C241BC7D2337F3E420153DAC45279 902F35C33773C30327F7B1D5EBD92F4C6DC2002905DC00B9A60BF55491829C6E 0A8D4B4BD39948DFE749E2CD13665E5DC253DA2DA9878B8C88AEF1CF492E6726 0D7DCD188C5E8190F41AF40C81057C88A55466667296314A5A5C42C012306071 15157E2EAA6A731AC77CFBC990F1193CDB767480CB4DC849B723E873AD0B888F 4AC0D820357E1C5DBB0477045D972FB10F0053B967D6A5BB70699D5199BB9240 4F69F592E637B26F23956C4FF9F0E18FD7D55BFE558F3E1D274845DA4F3F5F51 6943DB48B2B5CF2987B0C11A76E1976F36FC46C6F2E8BD831104722D5E5BE602 85979C654683172CF19B202C13F2D4DA2E0B6393CF9CCF0695A457E71EF6E697 2607BEF44DEF2F2EC35A060C70C2C1021AF5F989B8296AD4A173EC092C49BEC7 D60512EBAEBCD4D508B476694F13E338B574935626BE65D0B7388268DA6C569A 571BADFA2F3A36A0F885689C98A6972397978A146725C8B4936A4CC9A78FBE66 29208AF22F8A37942A24CD96C3D4C7E41882B73A874CFE293CC8189CDEE9086B 94938576622FF3C92E42578037FDF6219768F3D4B3656E15C9829883BCF7C174 D30D8D4C747FC1007B4280863DE13EFBC8F3381765AE9615551B9DF4F7506EE7 058B18333AE4E956802D68C3F9BC72849912D2E167EC3FFAA0E8B9B61D29099E C735FCB73FDD8C73FEE70D45C266EB87F8D6A2D37E79EE369D111F18852836DD 4287CD0DC39A1B8A4E4790D0C3E1CCB2148E52E53FAA3A59953544BCFB083959 42526D744C7C4B6677779AF5B5E23FED05C286F311225365A87875586E4E54C7 F8AD27A09D5BF5D7FD077B4034CA24C10E082F6A2E5FBCDAC348655DCE737592 80BDA2B6BC4C38F81F6C5DC8CD5F01AA169CA580C78B60B1B2B7AF314FF226B1 C9F8179B629259602454ADB36F176A188C667C5146795986CE173FFFB1081C57 75664ECFB354A62A590DA0FBF09EDA7FA3B6D1140A9A67EAD3D73DA028C19C7B 399AEED3CDDCD7C4419F4B64256190CF73B681C25B59323A1644E2FA58957599 56478F8824957BE1A74F6687EAEA3530D45F09C2B8E2DE6EE6379154D02FBECB 99EFCC22A17009272C905E0C3B8E9011A7398FEEDE844591189BCEC4C1142738 BB8AB10879E20AFF186844C9CAEADAE55D9493608AE7102143535521968B699A 14D9BCCED59CDD95CC786B3939CC6CCECDA720102533C05C18E159C18921C8C4 05FC5F150FEF9EDF4D15CBED48DAE8822CF9BE839AA4CF75C62D45BE75AF800B 83C277AF3CFC6A4B99C7978F942579F27258A42A503D970BD6BCB84FE984EA53 2DFF57F083D6B339AC6B87DD15D50CBD6120330BF5D6926BB15365F494CC8E2E 563B1FD178B9970DB6A2776E1993C787F8C10CFCF177566FDA26B32EF7D2A200 F010F38C6B91A23FA6B1F96237C23F8F3436460792768F9E1A4BC232907F8583 85A6A25FBC0768ACE15F2E116972224AF1836C3F543035786589A473C3D76E18 70D2B01CEA0B390F0FAFCC543340E57163B9A8AB387B258289F260997DC22AD9 9540088A6CEA5ED000950781F5F6389AB4BE7C6A8813BDAFE941056A7E083C47 8AC4C0E8EB9DD42AD319F846B633E176769878AED838F0E9856C954B341D8A69 63D6259E5C0B0E3B45066F57CE561CB24FCDB31ED2D84CE5EDA8FCABBDDF9DCE F4294C7D7FAC96519FD6BCFB938E327A231F8EB522052D0CC707067F7C71FD17 822C1EC08784C04649108D75EA9289E6A5D7083663F44DA57FA48F72208D58ED B7817DF355FC52D7AF73DD0E06A2EE22EEA87A54FB92B3CB944733CFF5BC3FAF 8E70909D392177C9BE87F4ABAF30F184E51F44442134599958FAB1E7C3C2A1EE A409BDEA1D48245C536639DA7F4D5D14F6485032070079F5A17C15C10599BAB4 351E6EB7AB2147410D850BCAE443F2D8CE8F1122BC7B85B5A8C4893350381609 9E2C0231E38FCAEBA2053756659D0AFEC1950DE731623281CF5D65ACF2BE8F68 825D65A5714F26F24B588C48CF7B671D1720BF291A2605E9F7C7BC0C99C42098 1813545D6AB190F3772CD1B7BF879F2D7FC1567EFE7D797CF7EAC1B82B693323 B4D4CF2FF6F0EFAAC99A0C994438806413FD29766AE223940DDB26B1544D7D05 A36E7202F2163F93E6F90E7BB0122A953A06480F44A5D281A703DA043AC524A9 22DD04205F96750A1B64CDD7E046461E42A392D651F7FD7846D359E91354508F 0779BF12AC1C41054E3896CB116E67F503061B38CDD987E8D29095A943506184 F4B30302905F10A7491F4A9F4A35E0B30FA89693114CCB61DDC7E71E6BABCCBE AAD2FF8AD99D9029C205606FA41324B98414B5C797B8F431F31F50C68E224ECA 5F2C70779CBCFFF6548928CB638697845A2EDE4B64BEC8063CB30E04AC983DDB 1186CD7B88B2E37AA33493C1745F2932C0FC3E52E2D8F8DFB8187B0AEA11DB05 74AF52E6ACCE06CC069ED62E4918623608AD5B68F0B82901CC6DEF80653535E8 B73B0ACF9355A710BC55D945A5161A68EE0FD265BD0DFFC6276932507902F923 6220C3A5C467EE1913B81204102515C90B375332C1583CB976FF9829004FA63A 65F97D2A873B5ED0CB78F3C43D3B9BFA7A309F26530F71237BA2850405A30CD8 224D4BA64880BB8676E41C6F9DC03BD7C5D1D12AD80F9C91F5ABC60D1BB1C24C EA4DCFA355BB75BFDC5079025F9AA783F346826594DC7502E816024730435C6C 8BFE5CA1B52F56A3309593879A1BBFE764044A0AE0043B65AA05BF42CC8693DB A9FC848E9BB33D1FCF56BB01C68B3643A761351D048990F18B26039A5CF7E170 BB5EB48AD76A9244F3D217039BCDBBC94A2C55B5170406D3ACB2072EC05199B0 9A83728ACA69390C7FBBB3D51F51ABA05E0A2C3DB089EC8B3158C9EA036E2202 B6A744EAD50EDFD5140BFCEC3A83F858E5167D99D692882175F396DDA828D198 0ECE9559D54F3EA1BB55632941A22D04AF8B48C1357EAF891526AB55CD428637 5FA1C3FE913AA9A3D638D44874CDD0BE614971D841F80F4E3D39C2003737B9A4 5433FE9116B892B90DE2ED7F20FC4E37167E535974DDA396779D0DC00B50465B FEA6569E6826B258904F7F197E7781BF1479E39D6821EDB69F23733058F29A8D C384ABC7B82975FF67F193800AFB7DFD8D87FC587CD924D976788A3A36A273D3 618029D11E9D78B299A8D8D125F0B3E47B53D8BF2E21A9C1A8AF80BBC0D2F1C0 70F9FDE4EF23481255015F393416BC4482DE3E42EB0B6AA6383FB3CF99E27DFA 3117798E6360680C83B4676C3811677E233EFEFF9E2969819C11F26CCDCA8786 AC0AD9FF7FE358443D90A3198688614D2588594E48D5CD09FCEE5C4F4457470B 7F92DBDB3F042313AA8E47AA6FB63F2363F88103D7FE34BD4A6BAA07B14E63C0 12471954CEACB0CF176275C6FBC6A4ADF857C2F51F6D0D2DE2C02E03EBCFAE3B D8005D76954B140D067909E5CC0B2E4FBB23B8BD9AEB44DB233A28B45B031346 E16F97552647FFAFEDB3A1A6EA3E64D27F8DFA9EB8B58D47D8B12AE4E5E29DA2 898CC843DB8E7A909810C33E2AD1697423DAB1994B22FAD8DEF79121CF130D28 E1700AA8357B1082E352A0A68244F663A0A9F37C47A90BA197CFE9FF7EF0CE60 4D68434FBD743D877FD1D65CB33604754BCB1CB9E8FD760B3A0A506DEB55C186 EE41E005F8BC980F83BEFDDA40CD0C88881D21A786434D1DBFBB407E1D081256 0F37489E075C495840746627A1F0F77E7696DC850B3E3F54B3D2ECD09A35761A ABD9C648EEA41F399B8CA49469759667F1E2BBDFD1DFEB252AE7BF0C088CAFA4 4FFAE41CC8916D70BF5DDD90A59D8B2AEA048832B0721BFDA97333D29C7B0276 D4366A7C06F05932963443A78187574325BE8F86748AE61923710860EC7DD014 22EFAA051AB129A6B8BBB38F528F3D21189A273022B43EC0086F09CC32C738B4 2A3E846ED36696737CAD442A3FA8B9A7441E3803DB48B24E72C8B6F5E7092771 739C234900D4C81C57F57C51DE7D38BE6CAE358F4A96CF2295C1A083D9B6C6BA B5CEB5DF8154C63E666EA04A336BCFA2B8B5194779BF09104B1992C7371C109E 8C89A82225E2E88D078731946B58CB9D8F5BE95E2BEADED02E7A68B88570A83B 98B6272AEF6FBA7BAFFD8BBF6503EDD077FA4244C2A1995576E796C7F324DF9C 184DA0FC40E487F22F23D929C3A3F40A7AF4F83B298A3A96E31F7143D4B46712 112F92D723AC14FA4E7856A1DD292E369B0C4EF9F87352C5B7DC9116D1E17D8F 76F6661DC710A1158E8DEF2D2BB03899DAA6C307082EBCDD583C1CC060CCDC16 3713F2DC8C1A5BAD6EE2D5DB652D466054539FBFA2468EC6B482D7712064A008 5C86DFF6ED79996A0F02FE7AE3173B53AF7685C3F5DCCD27AEFC3CCE239E4816 12B13D7A9D11F00699384D1CE947605EFF14997105270B833F828091B8F5D749 F5FF4A8B913E898782694D5B8DE8F97891BF6C956C2C2454D664B9947D799324 F488E9F4930D0CACF85AF21B44D2693BD6994C2FD9F0C0A23A1187566BFD309B 43F7625447132894A4B5CC3162752BC890C9AF9115A925F9FD12E069B1447A73 E01B55B9F2EB050ED0D6040F5023221F95D2DF816062C5AA1AAE0DF5A4E459D2 3FF887B6AB8163179FBC3F31B64A59D76534290D9FFCF1307373238CCC379F7E 4F847BEA63C1C66D4559E785BEE9DFAFCDE279CF37F306B6BEC2F1938F6187E7 DE8BB11CA4FC0371D15AC3D9E6E46A89DBBD9F690AEA8887976B107F90BF38FC 2C6C235569F568454C24EFACC58E7ACFE2ECA40FCA4734C3F4C4C614549F669F E8A489A0F80277C09061BEA823992C634AD1D7041A20BDA7DDC6FC2A44F4A27C 7E0BF56A658ED3513CF151E908B40B1F7AE014E26D7C820D9A0D2FA4A65E4BFA 0448FA66B4BC9775448EA7FC89CF3C59980D2E64BE4E8B76F26B987C113DCC86 F999CF295532FB6CAFC47CEBDA3202BE846D80AB73739BEEFCA7C3228FC27F2C B35F6D205225ECDC06E0932641E9984CE3D53AB056D51C4C41EEDD6CC2A177AD 8230F95DB829EEAFB51F1B888A67DFAB9D06B485C260ABC5B086BADB74DDCD83 BC4E93A3B45639814CC7B7FE027E63AEE77D89436DBCA67562CC60C03749E750 DC3A09FE290AA918F48805C57292EC7CDB0E44BCD7E736CAF27DC2691EBA3A7F 84C38CC9C8395D17F20C5B198CD168CDAE8EB233D46EF930874C25F3B1D7F6FA 69401DEDEE59D3087628C5AD0B6D1DD979A646B37693EC4F8CC44210F3EDCFB6 B22BEEF692B3C2E4E71D87EE75D71A3AF0178BB8BB90ED8BEB5CAB7C763D3DAC 67B426AAF471509682673FDCE4135181A09746377E398CC9BD28950E7400BFAF 89E32A8EEC6B879AC6D9EE1D48359A2478EF7A1D3CA9D98B8BEA11AC6452361A 4EE844B3152F6373E3843F58491D52615BF117081DD61154BD54CC524C98BFB7 693FA7D9B96CF43E95A02249CD9259DD7515C78258A2CC55284CD5ED6E3B49D9 2AFC2D5C0D984D02394157D5E6EA35086DF6AC26330FE2670F5695F0B1DDB335 4F162E15D35E1E44A9D837CBAE7D1650A2B1540D329CDD92FFD3E1382A17B6C5 023C14EE5B4CCE6A7128BACA9EFD6CF2E84C8F9B341620033F291C5A598F28CC A4D142EA99FE0572E657A3F6DA85A2551A968AB16A58A21465E24EC65457533D A3F08FB9C12AA161BB181D54AC7A2139615EDE6307EE24D10CE7BEC6D7752534 E6E4A487A768FF6EB2525D7C9C55D8D3FDE99F659D26AF0094122E42A6C9747E BE331E26A7B5087E1D56859E67C461A513452ACBCDE8ABA296E76DFB171EA477 4139E5920137834337DA64773E240DE83F8EB8391CDA3ED38478D9759BE53F05 095B75D4B16F4241372856E37D038E5E3B1E10583CFF6C2AB9FBC1BE200F040A F20A314527D30B1F488A8F90CD82088F0FCFE8341653887E367EDA6E243E6001 49FDD7D7F9DCA04536D02DA2EB209BE0517F7315764D7F9FA6CB90E51183C161 3E9AC2B6BF5B3F1E6DC53239999E0E30FEA8B60EA1F63718CF53D446261883D1 24D454DD505171EB522986C2A2BA9F765A109546EEAFCC2034710A899F200236 80BB8CA61CC64BA305495AF2F4146761642FC4A0FEAE74865E05235C81EB1E6F 00758DF5BB2256AEBD61899C476E2C613E44235FC01DBFEBD4C8BF1AC9EDEC93 FC8542FE7667BF5BFF4F98CD568AFDC1B0CF7E5B874A217BF8AC214DCD1C3454 E6D91DB4AAEA06A749CF084EC81674D420BC6D42BBF6FCACA805ED46978897F8 26F2A56CDACDBBC059C2E343E662CFB4E52CA740AB9F74917D644184D15FD02B 65AC2910CC284948F04EEAEE320536D7F682274FF77505F5BA1197E06D0A2274 309B3FED9CD2151B9F75C0E2C36B0DB65374B707DA050D6FB5D074A3A3673241 B48525013CBC16E647A50FAF625D05CC0D9725E6DCBB5F6A0A8F6589AD435399 0C10184EF4FDFD1F53EB305EB64F1EC3604B4AA0B3D9C2BBC7905FACD16CDDB6 1EA236E95C4E63E0A8410D077863F63B371AEE7F407AB462CB08E1F346A4FD71 F0DC11366AC190C7808D9465A4B3E1179972251BDB5180E282CEA3B277459C93 238D787EDD1CDD76FD70147762C42D339A5D8DB85ADF65B8766F342EFC00E57D 497DD1929FDDFECD8CB01240D03E318820D669B8205B345C73EE5109B9AA7EB1 71C8579B6F78A35AC7722AD682D35D8852F453A95E67B948CCD605AC3B6F47D7 E7CDB2A9464A0B07D396D36D25AC402CC8E9BDE1E38F60DFDC677A95D498432C EE8BC8E957595E99161B03702B885E6302E23EABB179899C85097667CD5518F6 40E7C12820B85A94D9FCF21B8DD01C65E16E9196650402B4E04AC72E99BFC394 5B207552F71251FBCC365A9E2355F35C8E059423A8A0BB8FBA0D8E2147F7B5DD CF73E36063A501398CF9EAF08B2D783F66A06C4B660B928FE138CD3CEA3698AE DA23E6F875105FFD363B968EC3BE27CACABEC135849DA164A9D320471A7F60C4 F5CC6FE898B1DA69525F6F3BA5CC70176B1F59BE78D655FEF04F1EDFF18761CA C25CE5A8F14CC617A837EFF994D269F30070DC58721DCAF8B84E12DC6DDDE605 347E41FAF0E108AE69E9E0B71802F8F98282E0D8FB3276B6D9A33EA7417EADE1 67500A498068810BA357213D6E90EA892F410155509B8CED08554C56525F9C4D 2DCD9178BE3BC8CC6320C646590FF4925AB9599ABA8D8168CC4F8DE1FB815AC1 D8031F9A3656D002E773459844DB987AA4ECF9F5FE8B2A0690ADF811836F2BAA F5DA7FB2A1D81E2C38D8E15BF3DF895BB2FE4AE915DE304C55567EA18D3CD1F2 829FAE6B28447F589D82BB70A52918A5DCDE9587C50969D4CCF574144C1F8D9B 4CADEBCB324686BB0937354013975F3C303F58080EE244A6DE2982E2970DAADA 288C54D4C16FB3F8F5AFD591327109C298FE05240D6C361BA72D9044EF5E9BA7 21146E4F107F7C4F408C04108CC330BE7EAEED969A66BCCDFE27F10F22C213CC 896EDE048DC4DDCC1984117866F0CDA39E44AF09FA7CA3F29EC68F8A35D7560D 3DFAD13A5D46682924A3C43B4FDE357D315343D2A192DC434053E6F22CD95151 EC038AFA00E6C0639C36BDBAE0127F27E2DC2BF7DB7A8D6CB0AA5B0B194320DB 2586D0059959EFECCA1677447CEC6C199C80A76788A61B3D1A4B69B051192E61 CA528B0AD3EB7F2D37E23A04F34D54A2CAD84AE483703FA0B323A198A2B06806 5C7630B9112BD7CA5C2032D1080E8F6EB7886CE7C9B864141D31154FD8D2B2FF 680E1D255A0CCF227C4BF80C5150F371E0DA2C422E6B9CB4449D06606477625A 56B0142F136DCEFE950D8ADCF88D34E305BD96D900D0784F44E40E736CB86C3B 6AF394FED5AFFC61321BA9D511D7520BBC33AFDF2C4F53BE2B7CB11D8E1B419D 9F698C305CFEFE7E391D190E608BD5E62FBC3E193DAC65F1B21EA0D535CDA3E1 70781C4819F1B98165287D0A7E9F2A0AA9BC27D02218047A5D3247D41B387677 FD5419E5BF713B9F9863C77EA0218E509B036B622F157F382093DA9F32DC1778 B47FECF95A630218FC13AB09829A5D7E5A874ECF40F240FCB4177C7FCA7A6365 76577CCD1E19CC6C9AB15542EAF6A4E8136222F29AFAAF520FA06C40E038B43C DB4C341F31AA25F3DD92EA498661FF852937D1146260D5BBBC7E627D84B31800 1B362FCD6C631FBED0BAE0BD019FE4767A468A94E8E14400A0F5C845DE5AFD74 280E72812F50457152EE943295A3983DF3AA8FDEB4A09B94B4A25BBF5839144B 5C6C6E04BE342B7A744B3740D6E8413034F72E32FCB965232041229E432AF5B2 F2F2D962EAF147ADC361D5F776783D59600EACDCEA4BF130D39B042C1F707407 323BF1A510CF4B11631786C12805EE232CCDDBBDACE94BC3D283F5D0D3FDA65F AA3800A395044516773D3F596595BEA5ADED5BCA272EB0C5FAA47E091BC0C77B C12D502AB17F760968573E08E193445EABB202E0DB01175297C984EFEEA6B956 B9C9A746DA9846B5A5862A82B1FF6D3D21DAE713939D089854106FF83C898E11 58B9EB9DDF744E1C4AA5AB1CBE4BA3DE83921121D0E835406E7AECDC1C49F384 A8711329BC7FF65A0D66E6852F681505DBE0CFBAFC357112665098CB7782DE3C 2A3751A44887BFDCB414788FB7C5E981C2029F8F661B494761EB8048692FDFA9 9C2AE1FB18F18035BC0B572BB5FF87C13779DF90465F66C9F22EE4F87177A8E3 56E32BE71E9C4A05050BBA76849536267E3F49634D833FFE863857789EAD7CE4 ABDCA696B0AB9064D4A9FBD592134972A9834C95D8C2D31858FAB6FE0D354779 B5E0D44A2996F3AE1F4A1444E9A3BD944CE4D015F5DDFD4A6FD285DC5BB5B3D0 02559620703CDC4502229532E16345D7CD7C20660347DA827CCD009D78819CB6 6ABA23033E23AF8496452D058F04AD64BDD9C19AE91AE9DF1B3C72BF5C1D5AB3 8AED52D9BC552E3F531CB676C6E3657A013D020ACDB57CC48297BA3CFF1096B6 679C7040831AF0734655905D088850CCD3878513D09EA3FDA53F8FFF344906EE 3661DA4B3F4A66500A5B9B7B2A18E48D7110A4375A9DCE3A7A7DA63FD80C2440 5EAFAAA1C2F773E1C58A54E0775264A8BAD6EE25DCD32DCAEF4070946DD65558 50CED1BE599AE6B444FF7CBCB68EB63D09E98286D14ABFA4DEA41D8AD92E9AA2 98CA01111924E80CCC0427253DB78D1EDF14758CA5F6AF562791F2716951F03C A5907B3D91BAAEB7E5A08B9F9EA3172F32B2D6E1C7586079AA2B1E2FF31281E6 499B21248EE2D344DFFFEDE1B7FBAD8BE06FA96A299DDF903BB844E961833FA2 11EAABC22885A67896558FB2A4E315E02BBC24DD4B700174FFD171D824E6F32D E34AD2A210D5D93193DAF1CB368D5E83A660323D8B784543C9C3A3F072C3DB22 5AEF8D3B2A4B05F54F28254845AE3C1F843C8C7BF098326939D8BDEE50D7A666 25279CD08CCB9CD140B8E0A91CE26F7FD4290F46DE997B4F98A4C3A72431230D F236F3333BAE93805B0C6A757F37317BA8FCA78AFD2F7A9F58853996B9AC8135 060E92184C4DBC346F285E1F2A094C41BD803E738A5E58840BEA4D6196C29446 7FAD1A09B0E0FD587E13239E9576C222914092DDC1405F52BAB6B37F122E7F40 9369049979105670716CF10CB3AE1E1A57A752D6E0EF8F4C08367461B7E3572E E5020E1C0A946777C0CF4700B448C38434C67C67DA7CDA01A3C01E145F107F92 A817FD3762A07A8D6D08A86B6EFB6ACFE56E7FA99A370350038FC1AB1C3358A1 FDE3EBA015EDE9CDA4A600401082DE3920D0EFC5521AB03140323E3A032DB577 DFC16F83E7159603117BFB685637674DCB4E897065FFC5A44A56CBAFB42F78C4 027C2820CC42FF5D8A6A8579E5B7E153955CA8443EE32F696F286B613CB11F99 6D564F921C6765DE8568187B138F3609863D2A6E5D573E4789AC2E248DA97A06 37A7F693180D51F9CC75E2B2D4A0ED4C1F1A599820C9FC3A12B7668198B5297C 7E76C8F8885B7556AD4F31D705BD4DD482C7C6D28DC61257F486D2AC8C34CF8A 6CEA8B398AD69AB6F55665CDCB9B2A743A09C9CDDD019F64D2829F76135745DB 24C6926FD744EA9DDB8710CB029B9DFA7EE03FCB6E3263964957C1C634468B5C 16A959326883F6D0D118346D12391C757889D54631F892EA7BDAB541B36E7953 B4D6FB36FC4F2EDA95D35A01571C8675DC792787D06BB6D4AF3BD9C914F0EC89 AACF7BEB5D40267CF8EB34C303C6851249A1DFE4BE30A79BAA95FF83EAF7377F 6C361D31B87D0379B67EEB6260E6021C38A86793A00BC86F97F1E6950EA877FA 514E53902891A9CE840B97EF393AA874E5C52AD0980640A8D7267E9DD1418C29 63144AC596F880896EBA77C1B6287CE441747745A5DE244506BB48B1D938B060 9F388E3F5041DDE6EA36A538BF58444C86DE6D1746ED6AF74119CCF81CBCCE00 7571F824498CFB82BC86551E26330EEB918469ABC25781641F261CC395C52CEF 9F65D9D7448FC2DFB35ABE03F203771E9830CE1D4220B6921549D2E089E8C4A2 7C82ED52AE847B53A6675C37C77C26C33547AEA0361D788397FEC78CA3EA12F4 74D04E6AD1DD70E06958D2FBBA37CC91C6243B58DB030B669A95CDACE3B1E5AE 775CCD9FDB741059D6B3B7450F5DA98A92AE99394396DB92D96C37051C2823B5 22DACD630ACFB1254B40001C3A699F75ACAC6BFCFA00A6C5CFA13D867E607C88 5470214ADFE4295B643E57B3AD1DF8AC90F90B8D935F0D9ABCBD7BF46E58A568 D829C02AEADE3435AAF6DD9CAFD7FD57854D9FB4869B681714238F9F2B1EEF21 D48AFFDF33FD9C8AB50EC0F719C18EDBC0F876AF50840CB89AC517B8DC65CA6A 03CC999ADB424FAC6AC907283B3BD3953002DF77C1E132E0BABFC0CF29E645C0 EFC844A0E15C7D9494527CEFBFBF7E87F50E1AFF8C52C9A3D2A3FECD061BD216 2A59DB2A6FD82B2557D384676A77AB1F9CE2674B2CAE1288566A4089689BE473 D17825C17B5B04FE0EDC6242B102660BF2FEF961D8EFD908A933E42A55954172 77D48159D281D0F5180164A974B8DBA5103D23966D971CC482608FDD49DF1471 921AE08EBF2B43B37D60F7FA3808118421BD114E30AE0AC4407D3EDDBA22CB8A 542D606DAF3BD3AE6FA4C9DAD9C0D44215D71D1E4C7EE32416991A52C001B9FD 2FF0A566172A069BD6ECC90E17FBF0DEF8518D2048A1547A48AF50E65B767CAF 0DF408E5123216A30D25103D7D9DA3A4E099C49EB05F23B351B23FDC78146A6C AC55A81FDDF51F477AFC7BC7FBD7E45793CD05B66A861113C03F7D3BAEF1C3AF 59C0E89D028E1409218E6D75D0C9DF4030C96F6E7B8CF6054009000FE8D9EDE7 7A6488621A69BCAB5ECB521CAE729F09E49BE076C95035BE44C16438943D3578 499ADE9431651D3D38F95C908E055F40379B2D14580D7E2BF5C7FDFFA5E2D0A6 59C6AB6EC5905D1053CD02566231941D92B38E585DCAF42DA4C86C5FAD2ACB44 A4131F3A74F6AC0D4B135A05088B858D5073AF7865899F059A9FAB43B7457C36 CDD0E5A411A083E4AAB62645FE71112C1D143C7CB838D092EDAC57393439A429 559129E946EE237C5B4CB2BFDFC3D32ECD99A0360BC89787A38B0C57BBB3CDAA 0960FE7FA232D95B888D195578601C30198BA517F526C8368D426D7B1049EDD6 FC36C9CAD2DCE7AE87F007233F4F1783DD06FC306A55CB0692D0A668D0A8FD4D 62D2BC739AFAC84541EEF28BCCCA352FF095BCFCD4EED4563350BF61A8F08517 E5257AAE5C9A6CE12E6714653EA552E03612CBE4E898FB1D4D745CAF81813E05 13D86F72F2175F9B72809CC01CC7EC3D57700F817028526AC4AD2B184F046631 4F5F8E2840304DD1B90DF28A4F596374FCE81192C4656A0018AC6387886D85EA 4F8206C8CE899D825669321CED0DDF9642522E3A3D4317223ED5CD24BF0D7D64 6375E46FF7C8A440B483CFD6C9196AFB2D35D8EF2491BBDC5A22A7078F08585E 5C05297B9A7C06BEE85810349F1675A24A3D1AB78672D4A633C8212BB62B84F3 CDC1D5E350F30B08154A39BBC8FC28160A499A2B12D66AA6B8E5183D8201D4BF FCD8EA1C9597C33AB92C4F42B1A52DAE32B9E859616D2E4FB8D0CC127B03C14F 3EC6A6923541FED895C775306DEF4BD8E1169016AC4846FAE80BF3F2CD21E65E 49E325D669E9134375C597B4959A612864E585AF8634E68563B25FB5482BC5AB 6AF17D9CD13FEC36C46AC83E0ECAABC6CEAB0599FD227A4BE2699E9B14773694 FC0FB23BE139E9536614C4D97077FA48CBBDE26A776A7AF1A392167A7C66216C 6FAFEFDADFC5621E81F6A4B70D291A3BCC7E336DB32FBE89020880FE1F242024 5E550B3C5C6520D7B962CE689805125AFF169EFB178A06ABBE374EDD4DFEB861 F3B4AE7313A01ACFA26315AF290365FBA57BF85D4DFD2334954BF8606FDC8D3D 3E6EE8CC35C88BB350C8CA0843697710AC03EFA6597B0D1C2F832982CD8A2AF4 9F5179D8370642E347B43C4E194A24B411D390A5EC83CB35269A2746ED576D2A ADF58236ABBB4DDAE6C0B8C8B0F5A556B8C41BF15461084D434C14C72BB8744B 90424BFA46FBD91A07A5697F3A4189E1967D45EC7E829209340E846AB4F313BB 5053C3B8372C1DFFF614BA4BC26AE1B607F97C2C0C9F25E812256B136609E913 9803082AEDBD7961220DDD1A23D69A48A7D81087FE47049DF6DB4ED9095186E9 4B5F70AE4687577E3DFC94D2EC884F0D61641E963A361266CD46CD42129EA6E0 896DDC893ABB5A67433D0C368A08A486693B54E5A154AFFDB87AAE3F406668F6 D0C454A7E3C2318549F06EE0ED9754D37A473BCB8AAF13510EC727FE0718A72D 8DE699F09687C6999345C3DAE7F0E90EB774950D1B67F30807FF9D44F203B751 DE2C383BC1BA4351C0277F5EC8DDF26FBAC7CC6CB735C501B959853A2B0BE03C 6B245AC6357A5F853D007F704915EA09760E8A979B4D4B93279727D90AF79FEF AA2966B003371EEEAA21AF2576D8FB025D1346CF993D388D7D6895042C873B05 26157A9D64E60788CBAE03B51A95B1B73C65BE645FA2F0C31C09F9EEEE9BF70E 3148979C2AAB48B64DB687139F704EEFB00035D785081FD8EB4F3B1B1B86A68F 012087AADEF617 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont TeXDict begin 39158280 55380996 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 1[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 39[{}47 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 136[52 1[52 52 52 52 2[52 52 4[52 52 52 1[52 52 2[52 1[52 95[{}14 99.6264 /CMTT10 rf /Fi 133[48 48 1[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[{}25 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 45 1[40 51 40 1[45 9[93 3[51 8[47 3[59 20[45 3[30 25 1[45 42[{}29 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 6[39 39[{}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 2[48 1[48 48 48 48 48 48 48 48 1[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 48 48 48 48 48 48 34[{}80 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 18[97 97 2[97 1[54 6[54 39[{}15 172.154 /CMBX12 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%BeginPaperSize: a4 /setpagedevice where { pop << /PageSize [595 842] >> setpagedevice } { /a4 where { pop a4 } 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.0.4)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)2537 1627 y(Edition)g(3.0.4,)h(1)f(F)-8 b(ebruary)30 b(2009)150 4958 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-2009)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 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2052 b(1)150 299 y Fs(GNU)54 b(GENERAL)g(PUBLIC)f(LICENSE)1477 521 y Fv(V)-8 b(ersion)31 b(3,)g(29)g(June)e(2007)390 663 y(Cop)m(yrigh)m(t)842 660 y(c)817 663 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 882 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 991 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 1234 y Fu(Pream)l(ble)275 1393 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 1503 y(of)h(w)m(orks.)275 1644 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 1753 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 1863 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 1973 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 2082 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 2192 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 2333 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 2443 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 2552 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 2662 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 2771 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 2912 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 3022 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 3132 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 3273 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 3382 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 3492 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 3601 y(they)i(kno)m(w)f(their)g(righ)m(ts.)275 3743 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 3852 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 3962 y(distribute)30 b(and/or)g(mo)s(dify)g(it.)275 4103 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 4322 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 881 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 1128 y Fu(TERMS)44 b(AND)h(CONDITIONS)199 1287 y Fv(0.)61 b(De\014nitions.)330 1427 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 1566 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 1676 y(semiconductor)j(masks.)330 1815 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 1924 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 2034 y(organizations.)330 2173 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 2283 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 2392 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 2502 y(w)m(ork.)330 2641 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 2751 y(gram.)330 2890 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 3000 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 3109 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 3219 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 3329 y(and)30 b(in)g(some)h(coun)m(tries)g(other)f(activities)j(as) e(w)m(ell.)330 3468 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 3577 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 3687 y(transfer)d(of)g(a)h(cop)m(y)-8 b(,)32 b(is)e(not)h(con)m(v)m(eying.)330 3826 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 3936 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 4045 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 4155 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 4265 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 4374 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 4484 y(criterion.)199 4623 y(1.)61 b(Source)30 b(Co)s(de.)330 4762 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 556 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 716 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 825 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 935 y(redistribute)30 b(and)g(c)m(hange)h(under)e (these)i(terms.)275 1069 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 1179 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 1289 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 1401 y Fq(one)40 b(line)g(to)g(give)g(the)g(program's)h(name)f(and)g(a)g (brief)g(idea)g(of)g(what)g(it)g(does.)390 1488 y Fp(Copyright)h(\(C\)) f Fq(year)49 b(name)40 b(of)g(author)390 1662 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 1749 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 1836 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 1924 y(your)g(option\))h(any)f(later)g(version.)390 2098 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 2185 y(WITHOUT)g(ANY)f(WARRANTY;)h (without)g(even)f(the)g(implied)h(warranty)g(of)390 2272 y(MERCHANTABILITY)i(or)c(FITNESS)i(FOR)f(A)g(PARTICULAR)h(PURPOSE.)80 b(See)40 b(the)g(GNU)390 2359 y(General)h(Public)f(License)h(for)f (more)g(details.)390 2534 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 2621 y(along)g(with)g(this)h(program.)80 b(If)40 b(not,)g(see)g (http://www.gnu.org/licenses/.)275 2756 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 2890 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 3000 y(starts)k(in)f(an)g(in)m(teractiv)m(e)j(mo)s(de:)390 3112 y Fq(program)49 b Fp(Copyright)42 b(\(C\))e Fq(year)48 b(name)41 b(of)e(author)390 3199 y Fp(This)h(program)h(comes)f(with)g (ABSOLUTELY)i(NO)e(WARRANTY;)h(for)f(details)h(type)f(`show)g(w'.)390 3286 y(This)g(is)g(free)g(software,)h(and)f(you)g(are)g(welcome)h(to)e (redistribute)j(it)390 3373 y(under)e(certain)h(conditions;)h(type)e (`show)g(c')g(for)g(details.)275 3508 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 3617 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 3727 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 3861 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 3971 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 4081 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 4215 y(The)44 b(GNU)h(General)g(Public)f(License)i(do)s(es)e(not)h(p)s(ermit)e (incorp)s(orating)i(y)m(our)g(program)f(in)m(to)150 4325 y(proprietary)35 b(programs.)57 b(If)35 b(y)m(our)h(program)f(is)h(a)g (subroutine)f(library)-8 b(,)37 b(y)m(ou)f(ma)m(y)h(consider)e(it)i (more)150 4434 y(useful)30 b(to)i(p)s(ermit)e(linking)i(proprietary)e (applications)i(with)f(the)g(library)-8 b(.)43 b(If)31 b(this)g(is)g(what)g(y)m(ou)g(w)m(an)m(t)150 4544 y(to)f(do,)g(use)f (the)g(GNU)h(Lesser)g(General)g(Public)f(License)h(instead)g(of)f(this) h(License.)40 b(But)30 b(\014rst,)f(please)150 4653 y(read)h Fr(http://www.gnu.org/philos)o(ophy)o(/why)o(-no)o(t-lg)o(pl.h)o(tml)o Fv(.)p eop end %%Page: 12 14 TeXDict begin 12 13 bop 150 -116 a Fv(Con)m(tributors)30 b(to)h(GNU)g Fr(gperf)e Fv(Utilit)m(y)2094 b(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 150 -116 a Fv(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2546 b(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) k(k)m(eyw)m(ord)i(set)g Fn(W)49 b Fv(in)m(to)39 b(a)e(p)s(erfect)h (hash)e(function)h Fn(F)p Fv(.)h Fn(F)44 b Fv(uniquely)37 b(maps)g(k)m(eyw)m(ords)150 752 y(in)e 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) h(whether)e(a)i(giv)m(en)g(c)m(haracter)h(string)f Fn(s)j Fv(o)s(ccurs)c(in)g Fn(W)p Fv(,)h(using)e(at)j(most)150 1081 y(one)31 b(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)42 b Fr(gperf)f Fv(is)h(a)m(v)-5 b(ailable)44 b(from)e Fr(http://ftp.gnu.org/pub/g)o(nu/g)o(perf)o(/)p Fv(.)70 b(A)42 b(pap)s(er)f(describing)150 1654 y Fr(gperf)p Fv('s)d(design)i(and)f(implemen)m(tation)j(in)d(greater)i(detail)g(is)f (a)m(v)-5 b(ailable)42 b(in)e(the)g(Second)f(USENIX)150 1763 y(C)p Fr(++)29 b Fv(Conference)g(pro)s(ceedings)h(or)g(from)f Fr(http://www.cs.wustl.edu)o(/~sc)o(hmid)o(t/r)o(esum)o(e.ht)o(ml)p Fv(.)p eop end %%Page: 14 16 TeXDict begin 14 15 bop 150 -116 a Fv(Chapter)30 b(2:)41 b(Static)32 b(searc)m(h)f(structures)e(and)h(GNU)h Fr(gperf)1425 b 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 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(15)150 299 y Fs(3)80 b(High-Lev)l(el)52 b(Description)f(of)j(GNU)g Fo(gperf)275 555 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 664 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 774 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 884 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 993 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 1103 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 1212 y(mo)s(dify)30 b(the)g(input)g(and)f(output)h(format)h(to)g Fr(gperf)p Fv(.)275 1354 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 1464 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 1573 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 1683 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 1793 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 1902 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 2012 y(results)30 b(dep)s(end)f(on)h(y)m(our)g(C)g(compiler,)i(of)e(course.)275 2154 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 2263 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 2373 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 2482 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 2726 y Fu(3.1)68 b(Input)44 b(F)-11 b(ormat)46 b(to)f Fl(gperf)275 2885 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 2995 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 3104 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 3246 y Fr(declarations)390 3356 y(\045\045)390 3465 y(keywords)390 3575 y(\045\045)390 3684 y(functions)275 3826 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 3936 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 4078 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 4187 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 4329 y Fr(january)390 4439 y(february)390 4548 y(march)390 4658 y(april)390 4767 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)11 b 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)11 b 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)11 b 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)10 b Fv(')630 1724 y(Instructs)33 b 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(C.)150 3258 y(`)p Fr(\045define)e(slot-name)e Fi(name)11 b 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)11 b 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)11 b 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)11 b 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)11 b 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('A')f(&&)h(c)g(<=)g('Z')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)11 b Fv(',)33 b(where)f Fn(o)37 b Fv(is)c(the)g (o\013set.)48 b(The)32 b(string)g(p)s(o)s(ol)g(name)h(can)g(b)s(e)f(c)m (hanged)h(through)f(the)630 5340 y(`)p Fr(\045define)d (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)11 b 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 1108 y(`)p Fr(\045null-strings)p Fv(')630 1218 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 1327 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 1437 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 1546 y(of)j(one)f(more)h(test-and-branc)m(h)g(instruction)f(at)h(run)e (time.)150 1807 y(`)p Fr(\045define)g(word-array-name)d Fi(name)11 b Fv(')630 1917 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 2027 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 2136 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 2246 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 2507 y(`)p Fr(\045define)f(length-table-name)c Fi(name)11 b Fv(')630 2616 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 2726 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 2836 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 2945 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 3206 y(`)p Fr(\045switch=)p Fi(count)11 b Fv(')630 3316 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 3425 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 3535 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 3645 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 3754 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 3864 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 3973 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 4083 y(Keith)k(Bostic's)h(original)f(C)f(program.)150 4344 y(`)p Fr(\045omit-struct-type)p Fv(')630 4454 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 4563 y(if)j(the)h(t)m(yp)s(e)f(is)h(already)g(de\014ned)e(elsewhere.)150 4864 y Fk(3.1.1.3)63 b(C)41 b(Co)s(de)g(Inclusion)275 5011 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 5121 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)150 5230 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 5340 y(fragmen)m(t)31 b(based)f(on)g(the)h (previous)f(example)h(that)g(illustrates)g(this)g(feature:)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)390 299 y Fr(\045{)390 408 y(#include)46 b()390 518 y(/*)h(This)g(section)f(of)h(code)f(is)i(inserted)d(directly)h (into)g(the)h(output.)f(*/)390 628 y(int)h(return_month_days)c (\(struct)j(month)g(*months,)g(int)h(is_leap_year\);)390 737 y(\045})390 847 y(struct)f(month)g({)i(char)f(*name;)f(int)h (number;)e(int)i(days;)g(int)g(leap_days;)e(};)390 956 y(\045\045)390 1066 y(january,)141 b(1,)47 b(31,)g(31)390 1176 y(february,)93 b(2,)47 b(28,)g(29)390 1285 y(march,)237 b(3,)47 b(31,)g(31)390 1395 y(...)150 1636 y Fk(3.1.2)63 b(F)-10 b(ormat)41 b(for)h(Keyw)m(ord)e(En)m(tries)275 1783 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 1893 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 2002 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 2112 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 2222 y(o)s(ccur)30 b(within)g(the)h(k)m(eyw)m(ords)f(section.)275 2399 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 2508 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 2618 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 2727 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 2837 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 2946 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 3056 y(reserv)m(ed)31 b(w)m(ords:)390 3233 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 3342 y(#)h(for)g(a)h(complete)d(list)i(of)g(ANSI)g (C)g(reserved)f(words.)390 3452 y(unsigned)390 3562 y(sizeof)390 3671 y(switch)390 3781 y(signed)390 3890 y(if)390 4000 y(default)390 4110 y(for)390 4219 y(while)390 4329 y(return)275 4506 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 4615 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 982 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 1129 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 1239 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 1348 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 1458 y(assuming)30 b(the)h(most)f(general)i(input)d(\014le)i(structure)390 1600 y Fr(declarations)44 b(part)j(1)390 1710 y(\045{)390 1820 y(verbatim)f(code)390 1929 y(\045})390 2039 y(declarations)e(part) j(2)390 2148 y(\045\045)390 2258 y(keywords)390 2368 y(\045\045)390 2477 y(functions)150 2620 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 2763 y Fr(/*)47 b(*INDENT-OFF*)e(*/)390 2872 y(declarations)f(part)j(1) 390 2982 y(\045{)390 3091 y(/*)g(*INDENT-ON*)e(*/)390 3201 y(verbatim)h(code)390 3310 y(/*)h(*INDENT-OFF*)e(*/)390 3420 y(\045})390 3530 y(declarations)f(part)j(2)390 3639 y(\045\045)390 3749 y(keywords)390 3858 y(\045\045)390 3968 y(/*)g(*INDENT-ON*)e(*/)390 4078 y(functions)150 4322 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 4482 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 4591 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 4701 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 4811 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 4920 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 Fn(const)31 b(c)m(har)g(*)f Ff(str)p Fn(,)i(unsigned)d(in)m (t)i Ff(len)12 b 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 830 y([F)-8 b(unction])-3599 b Fh(in_word_set)49 b Fg(\()p Fn(const)31 b(c)m(har)g(*)g Ff(str)p Fn(,)g(unsigned)e(in)m (t)i Ff(len)12 b Fg(\))390 939 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 1049 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 1159 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 1361 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 1470 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 1580 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 1689 y(not)31 b(need)f(to)h(b)s(e)f(NUL)g(terminated.)275 1833 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 2006 y(`)p Fr(-t)p Fv(')150 2115 y(`)p Fr(--struct-type)p Fv(')630 2225 y(Mak)m(e)g(use)e(of)h(the)f(user-de\014ned)f Fr(struct)p Fv(.)150 2393 y(`)p Fr(-S)h Fi(total-switch-statements)10 b Fv(')150 2503 y(`)p Fr(--switch=)p Fi(total-switch-sta)o(teme)o(nts)g Fv(')630 2612 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 2722 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 2831 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 2941 y(results)e(in)g(smaller)h(and)f(faster)h(co)s(de.)275 3114 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 3223 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 3333 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 3442 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 3552 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 3798 y Fu(3.3)68 b(Use)46 b(of)f(NUL)g(b)l(ytes)275 3957 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 4067 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 4176 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 4286 y(terminated)c(and)f(ha)m(v)m(e)h(exactly)h(length)f Fn(len)p Fv(.)275 4429 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 4539 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 4758 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(The)45 b(Cop)l(yrigh)l(t)h(of)f(the)g (Output)275 458 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 568 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 677 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 787 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 922 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 1031 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 1141 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 1250 y(licenses,)28 b(the)e(result)g(is)g(that)h(the)f(the)g(output)f(is)h(under)f(the)h (same)g(license,)i(with)e(the)g(same)h(cop)m(yrigh)m(t)150 1360 y(holder,)j(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 150 -116 a Fv(Chapter)30 b(4:)41 b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(24)150 299 y Fs(4)80 b(In)l(v)l(oking)52 b Fo(gperf)275 586 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 695 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 805 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 1257 y Fv(`)p Fr(--output-file=)p Fi(file)11 b Fv(')630 1367 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 1553 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 1811 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 1971 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 2080 y([Gp)s(erf)30 b(Declarations],)j(page)e (16\).)150 2266 y(`)p Fr(-e)f Fi(keyword-delimiter-list)11 b Fv(')150 2376 y(`)p Fr(--delimiters=)p Fi(keyword-deli)o(mite)o(r-li) o(st)f Fv(')630 2485 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 2595 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 2705 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 2814 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 2991 y(`)p Fr(-t)p Fv(')150 3101 y(`)p Fr(--struct-type)p Fv(')630 3210 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 3320 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 3430 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 3539 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 3649 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 3758 y(with)30 b(this)g(release.)150 3935 y(`)p Fr(--ignore-case)p Fv(')630 4045 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 4155 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 4264 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 4374 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 4483 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 4593 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 4702 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 4812 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)10 b Fv(')150 408 y(`)p Fr(--language=)p Fi(generated-lang)o(uage)o(-nam)o(e)g Fv(')630 518 y(Instructs)33 b 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 914 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 1200 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 1310 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 1419 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 1596 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 1705 y(C)p Fr(++)29 b Fv(compilers.)630 1882 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 2058 y(The)g(default)g (is)h(C.)150 2235 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 2345 y(do)s(es)30 b(not)h(do)f(an)m (ything.)150 2521 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 2631 y(do)s(es)30 b(not)h(do)f(an)m (ything.)150 2889 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 3048 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 3158 y([Gp)s(erf)30 b(Declarations],)j(page)e(16\).)150 3343 y(`)p Fr(-K)f Fi(slot-name)11 b Fv(')150 3453 y(`)p Fr(--slot-name=)p Fi(slot-name)g Fv(')630 3562 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 3672 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 3781 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 3891 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 4001 y(\014eld)e(in)g(y)m(our)g(supplied)f Fr(struct)p Fv(.)150 4177 y(`)p Fr(-F)h Fi(initializers)11 b Fv(')150 4287 y(`)p Fr(--initializer-suffix=)p Fi(init)o(iali)o(zers)f Fv(')630 4396 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 4506 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 4615 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 4725 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)11 b Fv(')150 5121 y(`)p Fr(--hash-function-name=)p Fi(hash)o(-fun)o(ctio) o(n-n)o(ame)f Fv(')630 5230 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 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)11 b Fv(')150 408 y(`)p Fr(--lookup-function-name=)p Fi(lo)o(okup)o(-fun)o(cti)o(on-n)o (ame)f 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)11 b Fv(')150 1048 y(`)p Fr(--class-name=)p Fi(class-name)f 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('A')f(&&)h(c)g(<=)g('Z')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 897 y(`)p Fr(-G)p Fv(')150 1007 y(`)p Fr(--global-table)p Fv(')630 1117 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 1226 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 1386 y(`)p Fr(-P)p Fv(')150 1496 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 1606 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 1715 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 1825 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 1934 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 2044 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 2153 y(+)e Fi(o)11 b Fv(',)33 b(where)f Fn(o)37 b Fv(is)c(the)g(o\013set.)48 b(The)32 b(string)g(p)s(o)s(ol)g(name)h(can)g(b)s(e)f(c)m(hanged)h (through)f(the)630 2263 y(option)f(`)p Fr(--string-pool-name)p Fv('.)150 2423 y(`)p Fr(-Q)f Fi(string-pool-name)11 b Fv(')150 2533 y(`)p Fr(--string-pool-name=)p Fi(string)o(-poo)o(l-na)o (me)f Fv(')630 2642 y(Allo)m(ws)32 b(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 2752 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 2862 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 2971 y(the)31 b(`)p Fr(\045global-table)p Fv(')c(declaration\))32 b(is)f(giv)m(en.)150 3131 y(`)p Fr(--null-strings)p Fv(')630 3241 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 3351 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 3460 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 3570 y(more)31 b(test-and-branc)m(h)f(instruction)h(at)g(run)e(time.) 150 3730 y(`)p Fr(-W)h Fi(hash-table-array-name)11 b Fv(')150 3839 y(`)p Fr(--word-array-name=)p Fi(hash-ta)o(ble-)o(arra)o (y-n)o(ame)f Fv(')630 3949 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 4059 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 4168 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 4278 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 4413 y(`)p Fr(--length-table-name=)p Fi(lengt)o(h-ta)o(ble-)o(arr)o(ay-n)o(ame)10 b Fv(')630 4522 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 4632 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 4741 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 4851 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 5011 y(`)p Fr(-S)g Fi(total-switch-statements)10 b Fv(')150 5121 y(`)p Fr(--switch=)p Fi(total-switch-sta)o(teme)o(nts)g Fv(')630 5230 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 5340 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)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(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 408 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 518 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 628 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 737 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 847 y(Keith)k(Bostic's)h(original)f(C)f(program.)150 1009 y(`)p Fr(-T)p Fv(')150 1118 y(`)p Fr(--omit-struct-type)p Fv(')630 1228 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 1338 y(if)j(the)h(t)m(yp)s(e)f(is)h(already)g (de\014ned)e(elsewhere.)150 1500 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 1609 y(do)s(es)30 b(not)h(do)f(an)m(ything.)150 1845 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 2031 y Fv(`)p Fr(-k)30 b Fi(selected-byte-positions)10 b Fv(')150 2141 y(`)p Fr(--key-positions=)p Fi(selected-)o(byte)o(-pos)o(iti)o(ons)g Fv(')630 2250 y(Allo)m(ws)28 b(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 2360 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 2469 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 2579 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 2689 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 2798 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 2908 y(use)e(a)h(b)m(yte)g(p)s(osition)f (greater)i(than)e(255,)i(inciden)m(tally\).)630 3043 y(F)-8 b(or)37 b(instance,)h(the)e(option)h(`)p Fr(-k)30 b(1,2,4,6-10,'$')p Fv(')i(generates)38 b(a)e(hash)g(function)f(that)630 3153 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 3263 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 3372 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 3482 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 3591 y(function.)630 3727 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 3837 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 3946 y(minimizes)31 b(the)f(n)m(um)m(b)s(er)f(of)i(b)m(yte)g(p)s (ositions.)150 4108 y(`)p Fr(-D)p Fv(')150 4218 y(`)p Fr(--duplicates)p Fv(')630 4327 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 4437 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 4547 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 4656 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)630 4766 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 4875 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 4985 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 5121 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 5230 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 5340 y(otherwise)e(could)f(not)h(handle.)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)150 299 y(`)p Fr(-m)30 b Fi(iterations)11 b Fv(')150 408 y(`)p Fr (--multiple-iterations=)p Fi(ite)o(rati)o(ons)f Fv(')630 518 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 628 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 737 y(minimizing)d(the)f(generated)i(table)f(size.)150 907 y(`)p Fr(-i)f Fi(initial-value)11 b Fv(')150 1016 y(`)p Fr(--initial-asso=)p Fi(initial-va)o(lue)f Fv(')630 1126 y(Pro)m(vides)29 b(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 1235 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 1345 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 1455 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 1564 y(option)i(is)f(used.)150 1733 y(`)p Fr(-j)g Fi(jump-value)11 b Fv(')150 1843 y(`)p Fr(--jump=)p Fi(jump-value)g Fv(')630 1953 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 2062 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 2172 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 2341 y(`)p Fr(-n)p Fv(')150 2451 y(`)p Fr(--no-strlen)p Fv(')630 2560 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 2670 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 2780 y(lo)s(okup)30 b(table.)150 2949 y(`)p Fr(-r)p Fv(')150 3059 y(`)p Fr(--random)p Fv(')630 3168 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 3278 y(generates)23 b(solutions)e(faster)h(than)f(using)g (deterministic)h(initialization)i(\(whic)m(h)d(starts)h(all)630 3387 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 3497 y(increases)j(the)g(size)g(of)f(the)h(table.)150 3666 y(`)p Fr(-s)f Fi(size-multiple)11 b Fv(')150 3776 y(`)p Fr(--size-multiple=)p Fi(size-mult)o(iple)f Fv(')630 3885 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 3995 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 4105 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 4214 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 4324 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 4433 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 4543 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 4653 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)630 4762 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 4872 y(purp)s(ose.)630 5011 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 5121 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 5230 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 5340 y(exp)s(ense)j(of)g(extra)i(table)f(space.)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(The)35 b(default)g(v)-5 b(alue)36 b(is)f(1,)i(th)m(us)e(the)h(default)f(maxim) m(um)g(asso)s(ciated)i(v)-5 b(alue)36 b(ab)s(out)f(the)630 408 y(same)h(size)g(as)f(the)h(n)m(um)m(b)s(er)e(of)h(k)m(eyw)m(ords)h (\(for)g(e\016ciency)-8 b(,)38 b(the)d(maxim)m(um)g(asso)s(ciated)630 518 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 628 y(somewhat,)31 b(since)g(this)f(tec)m(hnique)h(is)g (essen)m(tially)h(a)f(heuristic.)150 860 y Fu(4.6)68 b(Informativ)l(e)47 b(Output)150 1044 y Fv(`)p Fr(-h)p Fv(')150 1154 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 1264 y(program)30 b(execution.)150 1423 y(`)p Fr(-v)p Fv(')150 1533 y(`)p Fr(--version)p Fv(')630 1642 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 1802 y(`)p Fr(-d)p Fv(')150 1911 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 2021 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 2130 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 2240 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 2350 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 150 -116 a Fv(Chapter)30 b(5:)41 b(Kno)m(wn)30 b(Bugs)g(and)g(Limitations)h(with)f Fr(gperf)1397 b 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)k(functions)h(for)f(compiler)i(k)m(eyw)m(ord)f(sets.)72 b(Sev)m(eral)42 b(recen)m(t)g(enhancemen)m(ts)g(no)m(w)e(enable)330 996 y Fr(gperf)31 b Fv(to)j(w)m(ork)e(e\016cien)m(tly)j(on)d(m)m(uc)m (h)h(larger)g(k)m(eyw)m(ord)g(sets)g(\(o)m(v)m(er)i(15,000)g(k)m(eyw)m (ords\).)48 b(When)330 1106 y(pro)s(cessing)30 b(large)i(k)m(eyw)m(ord) e(sets)h(it)g(helps)f(greatly)i(to)f(ha)m(v)m(e)g(o)m(v)m(er)h(8)f (megs)g(of)f(RAM.)225 1240 y Ft(\017)60 b Fv(The)43 b(size)i(of)f(the)g (generate)h(static)h(k)m(eyw)m(ord)e(arra)m(y)g(can)g(get)h Fm(extr)-5 b(emely)53 b Fv(large)45 b(if)f(the)g(input)330 1350 y(k)m(eyw)m(ord)d(\014le)f(is)g(large)i(or)e(if)g(the)h(k)m(eyw)m (ords)f(are)h(quite)g(similar.)70 b(This)40 b(tends)g(to)h(slo)m(w)f (do)m(wn)330 1460 y(the)35 b(compilation)h(of)f(the)f(generated)i(C)e (co)s(de,)i(and)e Fm(gr)-5 b(e)g(atly)44 b Fv(in\015ates)35 b(the)g(ob)5 b(ject)35 b(co)s(de)g(size.)54 b(If)330 1569 y(this)40 b(situation)h(o)s(ccurs,)h(consider)e(using)f(the)h(`)p Fr(-S)p Fv(')g(option)g(to)h(reduce)e(data)i(size,)i(p)s(oten)m(tially) 330 1679 y(increasing)h(k)m(eyw)m(ord)g(recognition)h(time)f(a)g (negligible)i(amoun)m(t.)80 b(Since)44 b(man)m(y)f(C)h(compilers)330 1788 y(cannot)37 b(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 1898 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 2007 y(switc)m(h)31 b(statemen)m(ts)h(generated.)225 2142 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 2252 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 2361 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 150 -116 a Fv(Chapter)30 b(6:)41 b(Things)29 b(Still)i(Left)g(to)g(Do)2133 b(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 150 -116 a Fv(Chapter)30 b(7:)41 b(Bibliograph)m(y)2536 b(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 150 -116 a Fv(Concept)31 b(Index)2927 b(34)150 299 y Fs(Concept)52 b(Index)150 638 y Fu(\045)150 757 y Fd(`)p Fp(\045\045)p Fd(')24 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(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)49 b Fd(16)150 846 y(`)p Fp(\045{)p Fd(')24 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(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)49 b Fd(19)150 934 y(`)p Fp(\045})p Fd(')24 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(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)49 b Fd(19)150 1023 y(`)p Fp(\0457bit)p Fd(')15 b Fc(:)g(:)e(:)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(:)42 b Fd(18)150 1112 y(`)p Fp(\045compare-lengths)p Fd(')26 b Fc(:)13 b(:)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(:)48 b Fd(18)150 1201 y(`)p Fp(\045compare-strncmp)p Fd(')26 b Fc(:)13 b(:)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(:)48 b Fd(18)150 1289 y(`)p Fp(\045define)28 b(class-name)p Fd(')6 b Fc(:)15 b(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fd(18)150 1378 y(`)p Fp(\045define)c(hash-function-name)p Fd(')c Fc(:)13 b(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fd(17)150 1467 y(`)p Fp(\045define)28 b(initializer-suffix)p Fd(')c Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)46 b Fd(17)150 1555 y(`)p Fp(\045define)28 b(length-table-name)p Fd(')e Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)49 b Fd(19)150 1644 y(`)p Fp(\045define)28 b (lookup-function-name)p Fd(')15 b Fc(:)i(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)41 b Fd(17)150 1733 y(`)p Fp(\045define)28 b(slot-name)p Fd(')9 b Fc(:)15 b(:)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(:)35 b Fd(17)150 1821 y(`)p Fp(\045define)28 b(string-pool-name)p Fd(')8 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)34 b Fd(19)150 1910 y(`)p Fp(\045define)28 b(word-array-name)p Fd(')10 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fd(19)150 1999 y(`)p Fp(\045delimiters)p Fd(')17 b Fc(:)f(:)e(:)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(:)43 b Fd(17)150 2087 y(`)p Fp(\045enum)p Fd(')15 b Fc(:)g(:)e(:)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(:)42 b Fd(18)150 2176 y(`)p Fp(\045global-table)p Fd(')12 b Fc(:)17 b(:)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(:)h(:)f(:)38 b Fd(18)150 2265 y(`)p Fp(\045ignore-case)p Fd(')15 b Fc(:)h(:)d(:)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(:)41 b Fd(17)150 2353 y(`)p Fp(\045includes)p Fd(')25 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(:) g(:)g(:)g(:)49 b Fd(18)150 2442 y(`)p Fp(\045language)p Fd(')25 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(:) g(:)g(:)g(:)49 b Fd(17)150 2531 y(`)p Fp(\045null-strings)p Fd(')12 b Fc(:)17 b(:)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(:)h(:)f(:)38 b Fd(19)150 2619 y(`)p Fp(\045omit-struct-type)p Fd(')23 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(:)45 b Fd(19)150 2708 y(`)p Fp(\045pic)p Fd(')18 b Fc(:)d(:)e(:)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(:)g(:)h(:)f(:)g(:)44 b Fd(18)150 2797 y(`)p Fp(\045readonly-tables)p Fd(')26 b Fc(:)13 b(:)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(:)48 b Fd(18)150 2885 y(`)p Fp(\045struct-type)p Fd(')15 b Fc(:)h(:)d(:)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(:)41 b Fd(17)150 2974 y(`)p Fp(\045switch)p Fd(')10 b Fc(:)16 b(:)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(:)37 b Fd(19)150 3223 y Fu(A)150 3342 y Fd(Arra)n(y)25 b(name)c 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(:)47 b Fd(27)150 3599 y Fu(B)150 3718 y Fd(Bugs)18 b Fc(:)c(:)f(:)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(:)h(:)f(:)g (:)g(:)44 b Fd(12)150 3976 y Fu(C)150 4095 y Fd(Class)27 b(name)13 b Fc(:)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(:)g(:)39 b Fd(26)150 4183 y(Cop)n(yrigh)n(t)19 b Fc(:)13 b(:)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(:)g(:)g(:)45 b Fd(23)2025 638 y Fu(D)2025 755 y Fd(Declaration)27 b(section)18 b Fc(:)13 b(:)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(:)44 b Fd(15)2025 842 y(Delimiters)13 b Fc(:)h(:)g(:)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(:)40 b Fd(24)2025 930 y(Duplicates)9 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(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fd(28)2025 1181 y Fu(F)2025 1298 y Fd(F)-6 b(ormat)13 b Fc(:)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(:)g(:)g(:)h(:)f(:)g(:)39 b Fd(15)2025 1385 y(F)-6 b(unctions)25 b(section)14 b Fc(:)g(:)g(:)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(:)41 b Fd(15)2025 1620 y Fu(H)2025 1737 y Fp(hash)23 b Fc(:)13 b(:)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(:)g(:)g(:)g(:)49 b Fd(21)2025 1824 y(hash)25 b(table)13 b Fc(:)h(:)f(:)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(:)40 b Fd(21)2025 2059 y Fu(I)2025 2176 y Fp(in_word_set)24 b Fc(:)13 b(:)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(:)48 b Fd(22)2025 2263 y(Initializers)10 b Fc(:)k(:)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(:)h (:)f(:)g(:)36 b Fd(25)2025 2498 y Fu(J)2025 2615 y Fd(Jump)25 b(v)l(alue)9 b Fc(:)14 b(:)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(:)36 b Fd(29)2025 2866 y Fu(K)2025 2983 y Fd(Keyw)n(ords)25 b(section)13 b Fc(:)h(:)f(:)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(:)39 b Fd(15)2025 3234 y Fu(M)2025 3351 y Fd(Minimal)27 b(p)r(erfect)f(hash)g(functions)21 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) 48 b Fd(14)2025 3602 y Fu(N)2025 3719 y Fd(NUL)18 b Fc(:)13 b(:)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(:)g(:)g(:)g(:)g(:)46 b Fd(22)2025 3954 y Fu(S)2025 4070 y Fd(Slot)26 b(name)17 b Fc(:)c(:)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(:)g(:)44 b Fd(25)2025 4158 y(Static)26 b(searc)n(h)g(structure)11 b Fc(:)i(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)38 b Fd(14)2025 4245 y Fp(switch)6 b Fc(:)15 b(:)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(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fd(22,)27 b(27)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 641 y Fu(GNU)45 b(GENERAL)g(PUBLIC) g(LICENSE)28 b Fb(:)20 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)73 b Fu(1)150 911 y(Con)l(tributors)46 b(to)f(GNU)g Fl(gperf)e Fu(Utilit)l(y)21 b Fb(:)g(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)66 b Fu(12)150 1181 y(1)135 b(In)l(tro)t(duction)32 b Fb(:)19 b(:)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(:)h(:)f(:) h(:)76 b Fu(13)150 1450 y(2)135 b(Static)45 b(searc)l(h)h(structures)f (and)f(GNU)h Fl(gperf)33 b Fb(:)19 b(:)h(:)f(:)80 b Fu(14)150 1720 y(3)135 b(High-Lev)l(el)46 b(Description)g(of)f(GNU)g Fl(gperf)24 b Fb(:)18 b(:)h(:)g(:)h(:)f(:)h(:)69 b Fu(15)275 1857 y Fv(3.1)92 b(Input)29 b(F)-8 b(ormat)31 b(to)g Fr(gperf)14 b Fa(:)g(:)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(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)43 b Fv(15)399 1967 y(3.1.1)93 b(Declarations)30 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(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)57 b Fv(15)524 2076 y(3.1.1.1)93 b(User-supplied)30 b Fr(struct)12 b Fa(:)h(:)j(:)f(:)g(:)h(:)f(:)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(:)42 b Fv(16)524 2186 y(3.1.1.2)93 b(Gp)s(erf)30 b(Declarations)23 b Fa(:)17 b(:)f(:)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(:) 53 b Fv(16)524 2296 y(3.1.1.3)93 b(C)30 b(Co)s(de)g(Inclusion)15 b Fa(:)g(:)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(:)h(:)f(:)h (:)f(:)45 b Fv(19)399 2405 y(3.1.2)93 b(F)-8 b(ormat)32 b(for)e(Keyw)m(ord)g(En)m(tries)15 b Fa(:)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(:)45 b Fv(20)399 2515 y(3.1.3)93 b(Including)29 b(Additional)i(C)f(F)-8 b(unctions)11 b Fa(:)17 b(:)e(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)41 b Fv(21)399 2624 y(3.1.4)93 b(Where)31 b(to)g(place)g(directiv)m (es)h(for)e(GNU)h Fr(indent)p Fv(.)17 b Fa(:)d(:)h(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)47 b Fv(21)275 2734 y(3.2)92 b(Output)29 b(F)-8 b(ormat)32 b(for)e(Generated)h(C)f(Co)s(de)g(with)g Fr(gperf)20 b Fa(:)13 b(:)j(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) 49 b Fv(21)275 2844 y(3.3)92 b(Use)30 b(of)h(NUL)f(b)m(ytes)18 b Fa(:)e(:)g(:)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(:)f(:)g(:)h(:)f(:)h(:)47 b Fv(22)275 2953 y(3.4)92 b(The)29 b(Cop)m(yrigh)m(t)i(of)g(the)g(Output)11 b Fa(:)j(:)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(:)41 b Fv(23)150 3196 y Fu(4)135 b(In)l(v)l(oking)45 b Fl(gperf)25 b Fb(:)18 b(:)h(:)g(:)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(:)70 b Fu(24)275 3333 y Fv(4.1)92 b(Sp)s(ecifying)29 b(the)i(Lo)s(cation)h (of)e(the)h(Output)e(File)d Fa(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)55 b Fv(24)275 3442 y(4.2)92 b(Options)30 b(that)h(a\013ect)g(In)m(terpretation)h(of)e (the)h(Input)e(File)23 b Fa(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)52 b Fv(24)275 3552 y(4.3)92 b(Options)30 b(to)h(sp)s(ecify)f (the)g(Language)i(for)e(the)g(Output)g(Co)s(de)c Fa(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)56 b Fv(24)275 3661 y(4.4)92 b(Options)30 b(for)g(\014ne)f(tuning)h(Details)j(in)d(the)g(Output)f (Co)s(de)19 b Fa(:)c(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)49 b Fv(25)275 3771 y(4.5)92 b(Options)30 b(for)g(c)m(hanging)h(the)g (Algorithms)g(emplo)m(y)m(ed)g(b)m(y)f Fr(gperf)10 b Fa(:)k(:)i(:)f(:)h(:)f(:)g(:)40 b Fv(28)275 3880 y(4.6)92 b(Informativ)m(e)31 b(Output)21 b Fa(:)14 b(:)i(:)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(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)51 b Fv(30)150 4123 y Fu(5)135 b(Kno)l(wn)45 b(Bugs)f(and)h(Limitations)i (with)e Fl(gperf)23 b Fb(:)17 b(:)i(:)h(:)67 b Fu(31)150 4393 y(6)135 b(Things)44 b(Still)i(Left)g(to)f(Do)18 b Fb(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)63 b Fu(32)150 4663 y(7)135 b(Bibliograph)l(y)25 b Fb(:)20 b(:)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(:)70 b Fu(33)150 4932 y(Concept)45 b(Index)18 b Fb(:)i(:)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(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)63 b Fu(34)p eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF gperf-3.0.4/doc/help2man0000775000000000000000000002660710241404653013534 0ustar rootroot#!/usr/bin/perl -w # Generate a short man page from --help and --version output. # Copyright © 1997, 1998, 1999, 2000 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, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Written by Brendan O'Dea # Available from ftp://ftp.gnu.org/gnu/help2man/ use 5.004; use strict; 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} .= </dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 fi echo >conf$$.file 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, 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= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="hash.cc" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP CXX CXXFLAGS ac_ct_CXX CXXCPP RANLIB INSTALL INSTALL_PROGRAM INSTALL_DATA LIBOBJS LTLIBOBJS' ac_subst_files='' 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 # 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' 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=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. 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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$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 ;; -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=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 ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$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'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. 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 do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } 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 echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 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 .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # 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 -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | 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 .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } 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] --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 C/C++/Objective 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. _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" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 guested configure. 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 echo "$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.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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 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.61. Invocation command line was $ $0 $@ _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 test -z "$as_dir" && as_dir=. echo "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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$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 ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_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 cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$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'; { (exit 1); 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 # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" 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. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$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,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$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 { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$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. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } 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 { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" echo "$as_me:$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 fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out 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. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && 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 ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; 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 { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) 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; } /* 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 don't provoke an error unfortunately, instead are silently treated as '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's necessary to write '\x00'==0 to get something that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _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" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac 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 { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&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+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } 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 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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; 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_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 { echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } 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}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&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 # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD compatible install" >&5 echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${cl_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. for ac_prog in ginstall installbsd scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. # OSF/1 installbsd also uses dspmsg, but is usable. : else if test $ac_prog = installbsd && strings $ac_dir/$ac_prog | grep src/bos >/dev/null 2>&1; then # AIX installbsd doesn't work without option "-g". : else cl_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi fi done ;; esac done IFS="$ac_save_ifs" # As a last resort, use cp. test -z "$cl_cv_path_install" && cl_cv_path_install="cp" fi INSTALL="$cl_cv_path_install" fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$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)' if test -z "$INSTALL_DATA"; then case "$INSTALL" in cp | */cp ) INSTALL_DATA='$(INSTALL)' ;; * ) INSTALL_DATA='$(INSTALL) -m 644' ;; 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_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+set}" = set || &/ 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 test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$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=' 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 s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= 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=`echo "$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. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $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} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 fi echo >conf$$.file 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&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.61. 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 cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet 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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 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' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. 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=$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 ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) echo "$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. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$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 if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; 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+set}" = set || 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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim SET_MAKE!$SET_MAKE$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim CPP!$CPP$ac_delim CXX!$CXX$ac_delim CXXFLAGS!$CXXFLAGS$ac_delim ac_ct_CXX!$ac_ct_CXX$ac_delim CXXCPP!$CXXCPP$ac_delim RANLIB!$RANLIB$ac_delim INSTALL!$INSTALL$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 56; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ 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[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[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="$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 || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$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 "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; 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 || echo 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" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$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 || echo 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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 # 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= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF 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 sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;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 " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$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 "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # 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 || { (exit 1); exit 1; } fi gperf-3.0.4/lib/getline.cc0000664000000000000000000000660111054056200014021 0ustar rootroot/* getline.c -- Replacement for GNU C library function getline Copyright (C) 1993, 1996, 2001-2002 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 (;;) { register 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.0.4/lib/configure.ac0000664000000000000000000000266011133501077014357 0ustar rootrootdnl autoconf configuration for gperf/lib dnl Copyright (C) 1998, 2002, 2005, 2007, 2009 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.60]) AC_INIT([hash.cc]) 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_RANLIB dnl sets variable RANLIB CL_PROG_INSTALL dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM dnl dnl That's it. dnl AC_OUTPUT([Makefile]) gperf-3.0.4/lib/getline.h0000664000000000000000000000335411054056200013665 0ustar rootroot/* Copyright (C) 1995, 2000-2002 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.0.4/lib/getopt.c0000664000000000000000000007214711054056200013541 0ustar rootroot/* 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, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98 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 #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #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 /* 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 (); extern int strncmp (); static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ #if !defined __STDC__ || !__STDC__ /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); #endif /* not __STDC__ */ #endif /* __GNUC__ */ #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. */ #if defined __STDC__ && __STDC__ static void exchange (char **); #endif static void exchange (argv) 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. */ #if defined __STDC__ && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) 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 (argc, argv, optstring, longopts, longind, long_only) 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 (argc, argv, optstring) 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 (argc, argv) 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.0.4/lib/getopt.h0000664000000000000000000001134611054056200013540 0ustar rootroot/* Declarations for getopt. Copyright (C) 1989-1998, 2000 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 { #if (defined (__STDC__) && __STDC__) || defined (__cplusplus) const char *name; #else char *name; #endif /* 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 #if (defined (__STDC__) && __STDC__) || defined (__cplusplus) #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); #else /* not __STDC__ */ extern int getopt (); extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); #endif /* __STDC__ */ #ifdef __cplusplus } #endif #endif /* getopt.h */ gperf-3.0.4/lib/hash.h0000664000000000000000000000061607577362742013211 0ustar rootroot// 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.0.4/lib/Makefile.in0000664000000000000000000000502511054056200014127 0ustar rootroot# Makefile for gperf/lib # Copyright (C) 1989, 1992, 1993, 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 . #### 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 = -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.o : getopt.c getopt.h $(CC) $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/getopt.c getopt1.o : getopt1.c getopt.h $(CC) $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/getopt1.c getline.o : getline.cc getline.h $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/getline.cc hash.o : hash.cc hash.h $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/hash.cc install : all installdirs : uninstall : check : all mostlyclean : clean clean : force $(RM) *~ *.s *.o *.a $(TARGETLIB) core distclean : clean $(RM) config.status config.log config.cache Makefile maintainer-clean : distclean force : gperf-3.0.4/lib/getopt1.c0000664000000000000000000001047511054056200013616 0ustar rootroot/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 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" #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #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 /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (argc, argv, options, long_options, opt_index) 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 (argc, argv, options, long_options, opt_index) 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 (argc, argv) 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.0.4/lib/getopt.h.patch0000664000000000000000000000451007152442015014640 0ustar rootrootgetopt.h is a modified version of the getopt.h found in the glibc snapshot on 1998-04-14. Below the patch that has been applied to this file. The glibc maintainer has been informed of these patches. diff -c3 getopt.h.orig getopt.h *** getopt.h.orig Sat Jun 21 03:01:53 1997 --- getopt.h Mon Aug 28 12:36:27 2000 *************** *** 1,5 **** /* Declarations for getopt. ! Copyright (C) 1989,90,91,92,93,94,96,97 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 --- 1,5 ---- /* Declarations for getopt. ! Copyright (C) 1989-1998, 2000 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 *************** *** 78,84 **** struct option { ! #if defined (__STDC__) && __STDC__ const char *name; #else char *name; --- 78,84 ---- struct option { ! #if (defined (__STDC__) && __STDC__) || defined (__cplusplus) const char *name; #else char *name; *************** *** 96,102 **** #define required_argument 1 #define optional_argument 2 ! #if defined (__STDC__) && __STDC__ #ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation --- 96,108 ---- #define required_argument 1 #define optional_argument 2 ! #if (defined (__STDC__) && __STDC__) || defined (__cplusplus) ! #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 *************** *** 105,110 **** --- 111,117 ---- #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, gperf-3.0.4/lib/hash.cc0000664000000000000000000000111007577362744013337 0ustar rootroot/* 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.0.4/lib/getopt.c.patch0000664000000000000000000000127507147423434014650 0ustar rootrootgetopt.c is a modified version of the getopt.c found in the glibc snapshot on 1998-04-14. Below the patch that has been applied to this file. The glibc maintainer has been informed of these patches. diff -c3 getopt.c.orig getopt.c *** getopt.c.orig Sun Mar 8 16:06:55 1998 --- getopt.c Thu Apr 16 00:09:41 1998 *************** *** 201,207 **** /* Avoid depending on library functions or files whose names are inconsistent. */ ! char *getenv (); static char * my_index (str, chr) --- 201,208 ---- /* Avoid depending on library functions or files whose names are inconsistent. */ ! extern char *getenv (); ! extern int strncmp (); static char * my_index (str, chr) gperf-3.0.4/src/0000775000000000000000000000000011141541070012102 5ustar rootrootgperf-3.0.4/src/keyword-list.cc0000664000000000000000000001105311054056200015045 0ustar rootroot/* Keyword list. Copyright (C) 2002 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. */ Keyword_List::Keyword_List (Keyword *car) : _cdr (NULL), _car (car) { } /* ------------------------- KeywordExt_List class ------------------------- */ /* Constructor. */ KeywordExt_List::KeywordExt_List (KeywordExt *car) : Keyword_List (car) { } /* ------------------------ Keyword_List functions ------------------------- */ /* Copies a linear list, sharing the list elements. */ 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; } /* Copies a linear list, sharing the list elements. */ KeywordExt_List * copy_list (KeywordExt_List *list) { return static_cast (copy_list (static_cast (list))); } /* Deletes a linear list, keeping the list elements in memory. */ void delete_list (Keyword_List *list) { while (list != NULL) { Keyword_List *rest = list->rest(); delete list; list = rest; } } /* Type of a comparison function. */ typedef bool (*Keyword_Comparison) (Keyword *keyword1, Keyword *keyword2); /* Merges two sorted lists together to form one sorted list. */ static Keyword_List * merge (Keyword_List *list1, Keyword_List *list2, Keyword_Comparison less) { 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. */ Keyword_List * mergesort_list (Keyword_List *list, Keyword_Comparison less) { 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); } } KeywordExt_List * mergesort_list (KeywordExt_List *list, bool (*less) (KeywordExt *keyword1, KeywordExt *keyword2)) { return static_cast (mergesort_list (static_cast (list), reinterpret_cast (less))); } #ifndef __OPTIMIZE__ #define INLINE /* not inline */ #include "keyword-list.icc" #undef INLINE #endif /* not defined __OPTIMIZE__ */ gperf-3.0.4/src/options.icc0000664000000000000000000000664611054056200014270 0ustar rootroot/* Inline Functions for options.{h,cc}. Copyright (C) 1989-1998, 2000, 2002-2004 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 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.0.4/src/positions.cc0000664000000000000000000000754711054056200014454 0ustar rootroot/* A set of byte positions. Copyright (C) 1989-1998, 2000, 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 . */ /* 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.0.4/src/configure0000775000000000000000000040132111141540751014017 0ustar rootroot#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 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 -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 fi echo >conf$$.file 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, 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= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="main.cc" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP CXX CXXFLAGS ac_ct_CXX CXXCPP INSTALL INSTALL_PROGRAM INSTALL_DATA GPERF_LIBM LIBOBJS LTLIBOBJS' ac_subst_files='' 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 # 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' 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=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. 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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$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 ;; -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=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 ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$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'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. 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 do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } 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 echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 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 .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # 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 -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | 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 .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } 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] --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 C/C++/Objective 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. _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" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 guested configure. 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 echo "$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.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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 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.61. Invocation command line was $ $0 $@ _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 test -z "$as_dir" && as_dir=. echo "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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$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 ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_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 cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$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'; { (exit 1); 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 # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" 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. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$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,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$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 { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$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. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } 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_config_headers="$ac_config_headers config.h" { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" echo "$as_me:$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 fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out 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. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && 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 ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; 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 { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) 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; } /* 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 don't provoke an error unfortunately, instead are silently treated as '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's necessary to write '\x00'==0 to get something that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _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" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac 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 { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&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+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } 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 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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; 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_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 { echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } 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 # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD compatible install" >&5 echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${cl_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. for ac_prog in ginstall installbsd scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. # OSF/1 installbsd also uses dspmsg, but is usable. : else if test $ac_prog = installbsd && strings $ac_dir/$ac_prog | grep src/bos >/dev/null 2>&1; then # AIX installbsd doesn't work without option "-g". : else cl_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi fi done ;; esac done IFS="$ac_save_ifs" # As a last resort, use cp. test -z "$cl_cv_path_install" && cl_cv_path_install="cp" fi INSTALL="$cl_cv_path_install" fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$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)' if test -z "$INSTALL_DATA"; then case "$INSTALL" in cp | */cp ) INSTALL_DATA='$(INSTALL)' ;; * ) INSTALL_DATA='$(INSTALL) -m 644' ;; esac fi { echo "$as_me:$LINENO: checking for stack-allocated variable-size arrays" >&5 echo $ECHO_N "checking for stack-allocated variable-size arrays... $ECHO_C" >&6; } if test "${gp_cv_cxx_dynamic_array+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int func (int n) { int dynamic_array[n]; } int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then gp_cv_cxx_dynamic_array=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 gp_cv_cxx_dynamic_array=no fi rm -f core conftest.err conftest.$ac_objext 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 fi { echo "$as_me:$LINENO: result: $gp_cv_cxx_dynamic_array" >&5 echo "${ECHO_T}$gp_cv_cxx_dynamic_array" >&6; } if test $gp_cv_cxx_dynamic_array = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_DYNAMIC_ARRAY 1 _ACEOF fi { echo "$as_me:$LINENO: checking for rand in -lm" >&5 echo $ECHO_N "checking for rand in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_rand+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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. */ #ifdef __cplusplus extern "C" #endif char rand (); int main () { return rand (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_m_rand=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_m_rand=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_m_rand" >&5 echo "${ECHO_T}$ac_cv_lib_m_rand" >&6; } if test $ac_cv_lib_m_rand = yes; then GPERF_LIBM="-lm" else GPERF_LIBM="" 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_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+set}" = set || &/ 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 test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$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= 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=`echo "$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. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $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} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 fi echo >conf$$.file 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&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.61. 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 cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet 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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 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' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. 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=$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 ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$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. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$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 if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # 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" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; 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+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || 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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim SET_MAKE!$SET_MAKE$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim CPP!$CPP$ac_delim CXX!$CXX$ac_delim CXXFLAGS!$CXXFLAGS$ac_delim ac_ct_CXX!$ac_ct_CXX$ac_delim CXXCPP!$CXXCPP$ac_delim INSTALL!$INSTALL$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim GPERF_LIBM!$GPERF_LIBM$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 56; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ 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[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[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="$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 || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$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 "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; 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 || echo 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" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$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 || echo 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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 # 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= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF 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 sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;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 " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$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 "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; :H) # # CONFIG_HEADER # _ACEOF # Transform confdefs.h into a sed script `conftest.defines', that # substitutes the proper values into config.h.in to produce config.h. rm -f conftest.defines conftest.tail # First, append a space to every undef/define line, to ease matching. echo 's/$/ /' >conftest.defines # Then, protect against being on the right side of a sed subst, or in # an unquoted here document, in config.status. If some macros were # called several times there might be several #defines for the same # symbol, which is useless. But do not sort them, since the last # AC_DEFINE must be honored. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* # These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where # NAME is the cpp macro being defined, VALUE is the value it is being given. # PARAMS is the parameter list in the macro definition--in most cases, it's # just an empty string. ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' ac_dD=' ,' uniq confdefs.h | sed -n ' t rset :rset s/^[ ]*#[ ]*define[ ][ ]*// t ok d :ok s/[\\&,]/\\&/g s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ' >>conftest.defines # Remove the space that was appended to ease matching. # Then 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. # (The regexp can be short, since the line contains either #define or #undef.) echo 's/ $// s,^[ #]*u.*,/* & */,' >>conftest.defines # Break up conftest.defines: ac_max_sed_lines=50 # First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" # Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" # Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" # et cetera. ac_in='$ac_file_inputs' ac_out='"$tmp/out1"' ac_nxt='"$tmp/out2"' while : do # Write a here document: cat >>$CONFIG_STATUS <<_ACEOF # First, check the format of the line: cat >"\$tmp/defines.sed" <<\\CEOF /^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def /^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def b :def _ACEOF sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines conftest.tail echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then echo "/* $configure_input */" >"$tmp/config.h" cat "$ac_result" >>"$tmp/config.h" if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else rm -f $ac_file mv "$tmp/config.h" $ac_file fi else echo "/* $configure_input */" cat "$ac_result" fi rm -f "$tmp/out12" ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # 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 || { (exit 1); exit 1; } fi gperf-3.0.4/src/keyword-list.h0000664000000000000000000000507011054056200014711 0ustar rootroot/* This may look like C code, but it is really -*- C++ -*- */ /* Keyword list. Copyright (C) 2002 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 Keyword. */ class Keyword_List { public: /* Constructor. */ Keyword_List (Keyword *car); /* Access to first element of list. */ Keyword * first () const; /* Access to next element of list. */ Keyword_List *& rest (); protected: Keyword_List * _cdr; Keyword * const _car; }; /* List node of a linear list of KeywordExt. */ class KeywordExt_List : public Keyword_List { public: /* Constructor. */ KeywordExt_List (KeywordExt *car); /* Access to first element of list. */ KeywordExt * first () const; /* Access to next element of list. */ KeywordExt_List *& rest (); }; /* Copies a linear list, sharing the list elements. */ extern Keyword_List * copy_list (Keyword_List *list); extern KeywordExt_List * copy_list (KeywordExt_List *list); /* Deletes a linear list, keeping the list elements in memory. */ 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. */ extern Keyword_List * mergesort_list (Keyword_List *list, bool (*less) (Keyword *keyword1, Keyword *keyword2)); extern KeywordExt_List * mergesort_list (KeywordExt_List *list, bool (*less) (KeywordExt *keyword1, KeywordExt *keyword2)); #ifdef __OPTIMIZE__ #define INLINE inline #include "keyword-list.icc" #undef INLINE #endif #endif gperf-3.0.4/src/options.cc0000664000000000000000000012252111141324101014101 0ustar rootroot/* Handles parsing the Options provided to the user. Copyright (C) 1989-1998, 2000, 2002-2004, 2006-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 . */ /* Specification. */ #include "options.h" #include #include /* declares atoi(), abs(), exit() */ #include /* declares strcmp() */ #include /* declares isdigit() */ #include /* defines CHAR_MAX */ #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 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 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, " -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++) { const char *arg = _argument_vector[i]; /* 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 (C), _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), _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 C\n", language); _option_word |= C; } } } /* 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; } /* 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 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' }, { "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\ ", "1989-1998, 2000-2004, 2006-2009"); 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; } 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.0.4/src/main.cc0000664000000000000000000001244211135046317013347 0ustar rootroot/* Driver program for the hash function generator 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 . */ #include #include #include #include "options.h" #include "input.h" #include "search.h" #include "output.h" /* ------------------------------------------------------------------------- */ /* This Keyword factory produces KeywordExt instances. */ class KeywordExt_Factory : public Keyword_Factory { virtual Keyword * create_keyword (const char *allchars, int allchars_length, const char *rest); }; Keyword * KeywordExt_Factory::create_keyword (const char *allchars, int allchars_length, const char *rest) { return new KeywordExt (allchars, allchars_length, rest); } /* ------------------------------------------------------------------------- */ 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 = static_cast(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.0.4/src/configure.ac0000664000000000000000000000417311133501076014400 0ustar rootrootdnl autoconf configuration for gperf/src dnl Copyright (C) 1998, 2000, 2002-2003, 2007, 2009 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.60]) AC_INIT([main.cc]) AC_CONFIG_HEADER([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 CL_PROG_INSTALL dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM dnl dnl checks for compiler characteristics dnl AC_MSG_CHECKING([for stack-allocated variable-size arrays]) AC_CACHE_VAL([gp_cv_cxx_dynamic_array], [ AC_LANG_SAVE() AC_LANG_CPLUSPLUS() AC_TRY_COMPILE([int func (int n) { int dynamic_array[n]; }], [], [gp_cv_cxx_dynamic_array=yes], [gp_cv_cxx_dynamic_array=no]) AC_LANG_RESTORE() ]) AC_MSG_RESULT([$gp_cv_cxx_dynamic_array]) 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_OUTPUT([Makefile]) gperf-3.0.4/src/config.h_vms0000664000000000000000000000110510604702430014404 0ustar rootroot/* 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 version of this package. */ #undef PACKAGE_VERSION gperf-3.0.4/src/hash-table.h0000664000000000000000000000433411054056200014266 0ustar rootroot/* 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 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.0.4/src/keyword-list.icc0000664000000000000000000000272411054056200015223 0ustar rootroot/* Inline Functions for keyword-list.{h,cc}. Copyright (C) 2002-2003 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. */ INLINE Keyword * Keyword_List::first () const { return _car; } /* Access to next element of list. */ INLINE Keyword_List *& Keyword_List::rest () { return _cdr; } /* ------------------------- KeywordExt_List class ------------------------- */ /* Access to first element of list. */ INLINE KeywordExt * KeywordExt_List::first () const { return static_cast(_car); } /* Access to next element of list. */ INLINE KeywordExt_List *& KeywordExt_List::rest () { return *reinterpret_cast(&_cdr); } gperf-3.0.4/src/hash-table.cc0000664000000000000000000001150211054056200014417 0ustar rootroot/* Hash table for checking keyword links. Implemented using double hashing. Copyright (C) 1989-1998, 2000, 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 . */ /* 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.0.4/src/bool-array.icc0000664000000000000000000000456011054056200014635 0ustar rootroot/* 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.0.4/src/positions.h0000664000000000000000000001324211054056200014303 0ustar rootroot/* This may look like C code, but it is really -*- C++ -*- */ /* A set of byte positions. Copyright (C) 1989-1998, 2000, 2002, 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.0.4/src/positions.icc0000664000000000000000000001461311054056200014615 0ustar rootroot/* Inline Functions for positions.{h,cc}. Copyright (C) 1989-1998, 2000, 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 /* ---------------------------- 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.0.4/src/Makefile.in0000664000000000000000000001067611054056200014160 0ustar rootroot# Makefile for gperf/src # Copyright (C) 1989, 1992, 1993, 1998, 2000, 2002, 2006 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)/../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 = -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) core distclean : clean $(RM) config.status config.log config.cache Makefile config.h maintainer-clean : distclean force : gperf-3.0.4/src/search.h0000664000000000000000000001363411135046317013536 0ustar rootroot/* This may look like C code, but it is really -*- C++ -*- */ /* Search algorithm. Copyright (C) 1989-1998, 2000, 2002, 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.0.4/src/config.h.in0000664000000000000000000000110510604702401014122 0ustar rootroot/* 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 version of this package. */ #undef PACKAGE_VERSION gperf-3.0.4/src/output.h0000664000000000000000000001420511135046317013624 0ustar rootroot/* This may look like C code, but it is really -*- C++ -*- */ /* Output routines. 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 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[] 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.0.4/src/keyword.h0000664000000000000000000000770711054056200013751 0ustar rootroot/* This may look like C code, but it is really -*- C++ -*- */ /* Keyword data. Copyright (C) 1989-1998, 2000, 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 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); /* 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); /* 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); }; /* An abstract factory for creating Keyword instances. This factory is used to make the Input class independent of the concrete class KeywordExt. */ class Keyword_Factory { public: /* Constructor. */ Keyword_Factory (); /* Destructor. */ virtual ~Keyword_Factory (); /* Creates a new Keyword. */ virtual /*abstract*/ Keyword * create_keyword (const char *allchars, int allchars_length, const char *rest) = 0; }; /* A statically allocated empty string. */ extern char empty_string[1]; #ifdef __OPTIMIZE__ #define INLINE inline #include "keyword.icc" #undef INLINE #endif #endif gperf-3.0.4/src/options.h0000664000000000000000000002204411054056200013747 0ustar rootroot/* 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 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; /* 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 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; /* 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.0.4/src/keyword.icc0000664000000000000000000000261611054056200014252 0ustar rootroot/* Inline Functions for keyword.{h,cc}. Copyright (C) 1989-1998, 2000, 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 . */ /* ----------------------------- Keyword class ----------------------------- */ /* Constructor. */ INLINE Keyword::Keyword (const char *allchars, int allchars_length, const char *rest) : _allchars (allchars), _allchars_length (allchars_length), _rest (rest) { } /* --------------------------- KeywordExt class --------------------------- */ /* Constructor. */ INLINE KeywordExt::KeywordExt (const char *allchars, int allchars_length, const char *rest) : Keyword (allchars, allchars_length, rest), _final_index (-1) { } gperf-3.0.4/src/search.cc0000664000000000000000000016511411135046317013675 0ustar rootroot/* Search algorithm. Copyright (C) 1989-1998, 2000, 2002, 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 . */ /* 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; for (int i1 = imax; i1 >= -1; i1--) if (current.contains (i1) && !mandatory.contains (i1)) for (int i2 = imax; i2 >= -1; i2--) if (current.contains (i2) && !mandatory.contains (i2) && i2 != i1) for (int i3 = imax; i3 >= 0; 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.0.4/src/bool-array.h0000664000000000000000000000473311054056200014330 0ustar rootroot/* 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.0.4/src/output.cc0000664000000000000000000020711211135046317013763 0ustar rootroot/* Output routines. Copyright (C) 1989-1998, 2000, 2002-2004, 2006-2007, 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 . */ /* 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" /* 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 the maximum and minimum hash values etc. */ void Output::output_constants (struct Output_Constants& style) const { style.output_start (); style.output_item ("TOTAL_KEYWORDS", _total_keys); style.output_item ("MIN_WORD_LENGTH", _min_key_len); style.output_item ("MAX_WORD_LENGTH", _max_key_len); style.output_item ("MIN_HASH_VALUE", _min_hash_value); style.output_item ("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 unsigned char gperf_downcase[256] =\n" " {"); 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" " register char *s1;\n" " register char *s2;\n" : option[C] ? "(s1, s2)\n" " register const char *s1;\n" " register const char *s2;\n" : option[ANSIC] | option[CPLUSPLUS] ? "(register const char *s1, register const char *s2)\n" : ""); #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" " register char *s1;\n" " register char *s2;\n" " register unsigned int n;\n" : option[C] ? "(s1, s2, n)\n" " register const char *s1;\n" " register const char *s2;\n" " register unsigned int n;\n" : option[ANSIC] | option[CPLUSPLUS] ? "(register const char *s1, register const char *s2, register unsigned int n)\n" : ""); #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" " register char *s1;\n" " register char *s2;\n" " register unsigned int n;\n" : option[C] ? "(s1, s2, n)\n" " register const char *s1;\n" " register const char *s2;\n" " register unsigned int n;\n" : option[ANSIC] | option[CPLUSPLUS] ? "(register const char *s1, register const char *s2, register unsigned int n)\n" : ""); #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[] 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'". */ printf ("(unsigned char)"); if (pos == Positions::LASTCHAR) printf ("str[len - 1]"); else { printf ("str[%d]", pos); if (_alpha_inc[pos]) printf ("+%u", _alpha_inc[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, unsigned int 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"); if (/* The function does not use the 'str' argument? */ _key_positions.get_size() == 0 || /* The function uses 'str', but not the 'len' argument? */ (!_hash_includes_len && _key_positions[0] < _min_key_len && _key_positions[_key_positions.get_size() - 1] != Positions::LASTCHAR)) /* 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 ()); printf (option[KRC] ? "(str, len)\n" " register char *str;\n" " register unsigned int len;\n" : option[C] ? "(str, len)\n" " register const char *str;\n" " register unsigned int len;\n" : option[ANSIC] | option[CPLUSPLUS] ? "(register const char *str, register unsigned int len)\n" : ""); /* 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) { 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. */ int field_width = 2; for (int trunc = _max_hash_value; (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 (_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. */ printf (" register int hval = %s;\n\n" " switch (%s)\n" " {\n" " default:\n", _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 (" /*FALLTHROUGH*/\n"); /* Pacify lint. */ 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 (" /*FALLTHROUGH*/\n"); /* Pacify lint. */ 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) { if (option[TYPE]) output_line_directive (temp->_lineno); printf ("%s ", indent); if (option[TYPE]) printf ("{"); if (option[SHAREDLIB]) printf ("(int)(long)&((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 (" /* hash value = %d, index = %d */", temp->_hash_value, 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; 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); /* 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); } index++; } if (index > 0) printf ("\n"); printf ("%s };\n\n", indent); } /* ------------------------------------------------------------------------- */ /* 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[%d]: hash_value = %d, index = %d, count = %d\n", 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 { printf (" if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)\n" " {\n" " register int key = %s (str, len);\n\n", 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 <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)\n" " {\n"); if (option[DUP] && _total_duplicates > 0) { if (option[LENTABLE]) printf (" register %s%s *lengthptr;\n", const_always, smallest_integral_type (_max_key_len)); printf (" register "); output_const_type (const_readonly_array, _wordlist_eltype); printf ("*wordptr;\n"); printf (" register "); output_const_type (const_readonly_array, _wordlist_eltype); printf ("*wordendptr;\n"); } if (option[TYPE]) { printf (" register "); output_const_type (const_readonly_array, _struct_tag); printf ("*resword;\n\n"); } else printf (" register %sresword;\n\n", _struct_tag); output_switches (_head, num_switches, switch_size, _min_hash_value, _max_hash_value, 10); printf (" return 0;\n"); 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 register %schar *s = ", indent, "", 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 0;\n", indent, "", indent, "", indent, ""); } printf (" compare:\n"); if (option[TYPE]) { printf (" {\n" " register %schar *s = resword->%s", 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 <= MAX_HASH_VALUE && key >= 0)\n"); if (option[DUP]) { int indent = 8; printf ("%*s{\n" "%*s register int index = lookup[key];\n\n" "%*s if (index >= 0)\n", indent, "", indent, "", 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 register %schar *s = %s[index]", indent, "", indent, "", 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 < -TOTAL_KEYWORDS)\n" "%*s {\n" "%*s register int offset = - 1 - TOTAL_KEYWORDS - index;\n", indent, "", indent, "", indent, ""); if (option[LENTABLE]) printf ("%*s register %s%s *lengthptr = &%s[TOTAL_KEYWORDS + lookup[offset]];\n", indent, "", const_always, smallest_integral_type (_max_key_len), option.get_lengthtable_name ()); printf ("%*s register ", indent, ""); output_const_type (const_readonly_array, _wordlist_eltype); printf ("*wordptr = &%s[TOTAL_KEYWORDS + lookup[offset]];\n", option.get_wordlist_name ()); printf ("%*s register ", indent, ""); 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 register %schar *s = ", indent, "", 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 register int o = %s[key]", indent, "", indent, "", 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 register %schar *s = o", indent, "", 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 register %schar *s = %s[key]", indent, "", indent, "", 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 register %schar *s = %s[key]", indent, "", indent, "", 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 0;\n"); } /* Generates C code for the lookup function. */ void Output::output_lookup_function () const { /* Output the function's head. */ if (option[KRC] | option[C] | option[ANSIC]) /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 inline semantics, unless -fgnu89-inline is used. It defines a macro __GNUC_STDC_INLINE__ to indicate this situation or a macro __GNUC_GNU_INLINE__ to indicate the opposite situation. GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline semantics but warns, unless -fgnu89-inline is used: warning: C99 inline functions are not supported; using GNU89 warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. */ printf ("#ifdef __GNUC__\n" "__inline\n" "#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__\n" "__attribute__ ((__gnu_inline__))\n" "#endif\n" "#endif\n"); 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" " register char *str;\n" " register unsigned int len;\n" : option[C] ? "(str, len)\n" " register const char *str;\n" " register unsigned int len;\n" : option[ANSIC] | option[CPLUSPLUS] ? "(register const char *str, register unsigned int len)\n" : ""); /* 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[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, unsigned int len);\n" "public:\n" " static %s%s%s (const char *str, unsigned int 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.0.4/src/version.h0000664000000000000000000000166011054056200013742 0ustar rootroot/* Current program version number. 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 . */ /* Current release version. */ extern const char *version_string; gperf-3.0.4/src/input.h0000664000000000000000000000450211054056200013412 0ustar rootroot/* This may look like C code, but it is really -*- C++ -*- */ /* Input routines. 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 . */ #ifndef input_h #define input_h 1 #include #include "keyword-list.h" 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.0.4/src/config.h.msvc0000664000000000000000000000110510604702430014466 0ustar rootroot/* 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 version of this package. */ #undef PACKAGE_VERSION gperf-3.0.4/src/version.cc0000664000000000000000000000177311141310264014105 0ustar rootroot/* Current program version number. Copyright (C) 1989-1998, 2000, 2002-2003, 2005, 2007, 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 . */ /* Specification. */ #include "version.h" /* Current release version. */ const char *version_string = "3.0.4"; gperf-3.0.4/src/bool-array.cc0000664000000000000000000000273611054056200014467 0ustar rootroot/* Fast 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 . */ /* 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.0.4/src/input.cc0000664000000000000000000010305311054056200013551 0ustar rootroot/* Input routines. Copyright (C) 1989-1998, 2002-2004 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" 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. */ 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); } /* 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, "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. */ Keyword *new_kw = _factory->create_keyword (keyword, keyword_length, rest); new_kw->_lineno = 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; } Input::~Input () { /* Free allocated memory. */ delete[] const_cast(_return_type); delete[] const_cast(_struct_tag); delete[] const_cast(_struct_decl); delete[] _input; } gperf-3.0.4/src/keyword.cc0000664000000000000000000001125511054056200014100 0ustar rootroot/* Keyword data. Copyright (C) 1989-1998, 2000, 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 . */ /* 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 ------------------------- */ Keyword_Factory::Keyword_Factory () { } Keyword_Factory::~Keyword_Factory () { } /* ------------------------------------------------------------------------- */ char empty_string[1] = ""; #ifndef __OPTIMIZE__ #define INLINE /* not inline */ #include "keyword.icc" #undef INLINE #endif /* not defined __OPTIMIZE__ */ gperf-3.0.4/NEWS0000664000000000000000000000644411054056245012032 0ustar rootrootNew 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.0.4/Makefile.msvc0000664000000000000000000001357011054056405013736 0ustar rootroot# -*- Makefile -*- for gperf # Copyright (C) 2003 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 . #### Start of system configuration section. #### # Flags that can be set on the nmake command line: # MFLAGS={-ML|-MT|-MD} for defining the compilation model # MFLAGS=-ML (the default) Single-threaded, statically linked - libc.lib # MFLAGS=-MT Multi-threaded, statically linked - libcmt.lib # MFLAGS=-MD Multi-threaded, dynamically linked - msvcrt.lib # DEBUG=1 for compiling with debugging information !if !defined(DEBUG) DEBUG=0 !endif !if !defined(MFLAGS) MFLAGS= !endif # Directories used by "make": srcdir = . # Directories used by "make install": prefix = c:\usr exec_prefix = $(prefix) datadir = $(prefix)\share bindir = $(exec_prefix)\bin mandir = $(datadir)\man man1dir = $(mandir)\man1 docdir = $(datadir)\doc\gperf # Programs used by "make": CC = cl CXX = cl -TP # Set to -W3 if you want to see maximum amount of warnings, including stupid # ones. Set to -W1 to avoid warnings about signed/unsigned combinations. WARN_CFLAGS = -W1 !if $(DEBUG) OPTIMFLAGS = -Od -Z7 DEBUGFLAGS = -Z7 !else # Some people prefer -O2 -G6 instead of -O1, but -O2 is not reliable in MSVC5. OPTIMFLAGS = -D_NDEBUG -O1 DEBUGFLAGS = !endif CFLAGS = $(MFLAGS) $(WARN_CFLAGS) $(OPTIMFLAGS) CXXFLAGS = $(MFLAGS) $(WARN_CFLAGS) $(OPTIMFLAGS) INCLUDES = -Ilib -Isrc LN = copy RM = -del # Programs used by "make install": INSTALL = copy INSTALL_PROGRAM = copy INSTALL_DATA = copy #### End of system configuration section. #### SHELL = /bin/sh LIB_OBJECTS = lib\getopt.obj lib\getopt1.obj lib\getline.obj lib\hash.obj SRC_OBJECTS = src\version.obj src\positions.obj src\options.obj src\keyword.obj src\keyword-list.obj src\input.obj src\bool-array.obj src\hash-table.obj src\search.obj src\output.obj src\main.obj OBJECTS = $(LIB_OBJECTS) $(SRC_OBJECTS) all : gperf.exe src\config.h : src\config.h.msvc -$(RM) src\config.h $(LN) src\config.h.msvc src\config.h lib\getopt.obj : lib\getopt.c $(CC) $(INCLUDES) $(CFLAGS) -c lib\getopt.c -Folib\getopt.obj lib\getopt1.obj : lib\getopt1.c $(CC) $(INCLUDES) $(CFLAGS) -c lib\getopt1.c -Folib\getopt1.obj lib\getline.obj : lib\getline.cc $(CXX) $(INCLUDES) $(CXXFLAGS) -c lib\getline.cc -Folib\getline.obj lib\hash.obj : lib\hash.cc $(CXX) $(INCLUDES) $(CXXFLAGS) -c lib\hash.cc -Folib\hash.obj # Dependencies. CONFIG_H = src\config.h VERSION_H = src\version.h POSITIONS_H = src\positions.h src\positions.icc OPTIONS_H = src\options.h src\options.icc $(POSITIONS_H) KEYWORD_H = src\keyword.h src\keyword.icc KEYWORD_LIST_H = src\keyword-list.h src\keyword-list.icc $(KEYWORD_H) INPUT_H = src\input.h $(KEYWORD_LIST_H) BOOL_ARRAY_H = src\bool-array.h src\bool-array.icc $(OPTIONS_H) HASH_TABLE_H = src\hash-table.h $(KEYWORD_H) SEARCH_H = src\search.h $(KEYWORD_LIST_H) $(POSITIONS_H) $(BOOL_ARRAY_H) OUTPUT_H = src\output.h $(KEYWORD_LIST_H) $(POSITIONS_H) src\version.obj : src\version.cc $(VERSION_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\version.cc -Fosrc\version.obj src\positions.obj : src\positions.cc $(POSITIONS_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\positions.cc -Fosrc\positions.obj src\options.obj : src\options.cc $(OPTIONS_H) $(VERSION_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\options.cc -Fosrc\options.obj src\keyword.obj : src\keyword.cc $(KEYWORD_H) $(POSITIONS_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\keyword.cc -Fosrc\keyword.obj src\keyword-list.obj : src\keyword-list.cc $(KEYWORD_LIST_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\keyword-list.cc -Fosrc\keyword-list.obj src\input.obj : src\input.cc $(INPUT_H) $(OPTIONS_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\input.cc -Fosrc\input.obj src\bool-array.obj : src\bool-array.cc $(BOOL_ARRAY_H) $(OPTIONS_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\bool-array.cc -Fosrc\bool-array.obj src\hash-table.obj : src\hash-table.cc $(HASH_TABLE_H) $(OPTIONS_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\hash-table.cc -Fosrc\hash-table.obj src\search.obj : src\search.cc $(SEARCH_H) $(OPTIONS_H) $(HASH_TABLE_H) $(CONFIG_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\search.cc -Fosrc\search.obj src\output.obj : src\output.cc $(OUTPUT_H) $(OPTIONS_H) $(VERSION_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\output.cc -Fosrc\output.obj src\main.obj : src\main.cc $(OPTIONS_H) $(INPUT_H) $(SEARCH_H) $(OUTPUT_H) $(CXX) $(INCLUDES) $(CXXFLAGS) -c src\main.cc -Fosrc\main.obj gperf.exe : $(OBJECTS) $(CC) $(MFLAGS) $(DEBUGFLAGS) $(OBJECTS) -Fegperf.exe install : all force -mkdir $(prefix) -mkdir $(exec_prefix) -mkdir $(bindir) $(INSTALL_PROGRAM) gperf.exe $(bindir)\gperf.exe -mkdir $(datadir) -mkdir $(mandir) -mkdir $(man1dir) $(INSTALL_DATA) doc\gperf.1 $(man1dir)\gperf.1 -mkdir $(datadir)\doc -mkdir $(docdir) $(INSTALL_DATA) doc\gperf.html $(docdir)\gperf.html installdirs : force -mkdir $(prefix) -mkdir $(exec_prefix) -mkdir $(bindir) -mkdir $(datadir) -mkdir $(mandir) -mkdir $(man1dir) -mkdir $(datadir)\doc -mkdir $(docdir) uninstall : force $(RM) $(bindir)\gperf.exe $(RM) $(man1dir)\gperf.1 $(RM) $(docdir)\gperf.html check : all mostlyclean : clean clean : force $(RM) lib\*.obj $(RM) src\*.obj $(RM) gperf.exe $(RM) core distclean : clean $(RM) src\config.h maintainer-clean : distclean force : gperf-3.0.4/aclocal.m40000664000000000000000000000442411141333341013157 0ustar rootrootAC_PREREQ(2.12) AC_DEFUN(CL_PROG_INSTALL, [dnl This is mostly copied from AC_PROG_INSTALL. # 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 # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. AC_MSG_CHECKING(for a BSD compatible install) if test -z "$INSTALL"; then AC_CACHE_VAL(cl_cv_path_install, [ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. for ac_prog in ginstall installbsd scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. # OSF/1 installbsd also uses dspmsg, but is usable. : else if test $ac_prog = installbsd && strings $ac_dir/$ac_prog | grep src/bos >/dev/null 2>&1; then # AIX installbsd doesn't work without option "-g". : else cl_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi fi done ;; esac done IFS="$ac_save_ifs" # As a last resort, use cp. test -z "$cl_cv_path_install" && cl_cv_path_install="cp" ])dnl INSTALL="$cl_cv_path_install" fi dnl We do special magic for INSTALL instead of AC_SUBST, to get dnl relative paths right. AC_MSG_RESULT($INSTALL) AC_SUBST(INSTALL)dnl # 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)' AC_SUBST(INSTALL_PROGRAM)dnl if test -z "$INSTALL_DATA"; then case "$INSTALL" in cp | */cp ) INSTALL_DATA='$(INSTALL)' ;; * ) INSTALL_DATA='$(INSTALL) -m 644' ;; esac fi AC_SUBST(INSTALL_DATA)dnl ]) gperf-3.0.4/tests/0000775000000000000000000000000011141541070012455 5ustar rootrootgperf-3.0.4/tests/permut2.exp0000664000000000000000000000757311141310264014604 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 (str, len) register const char *str; register unsigned int 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 }; return asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]]; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const char * in_word_set (str, len) register const char *str; register unsigned int len; { static const char * wordlist[] = { "xy", "zx", "yx", "xz" }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key]; if (*str == *s && !strcmp (str + 1, s + 1)) return s; } } return 0; } gperf-3.0.4/tests/permut3.exp0000664000000000000000000000757711141310264014611 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 (str, len) register const char *str; register unsigned int 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 }; return asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]]; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const char * in_word_set (str, len) register const char *str; register unsigned int len; { static const char * wordlist[] = { "bca", "cab", "acb", "abc" }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key]; if (*str == *s && !strcmp (str + 1, s + 1)) return s; } } return 0; } gperf-3.0.4/tests/languages.gperf0000664000000000000000000007240407641012077015471 0ustar rootroot%{ /* 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 http://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, "ouïgour", 315 ton, "Tonga (Tonga Islands)", 418, "tongan (Îles Tonga)", 415 rm, "Raeto-Romance", 340, "rhéto-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, "néerlandais", 288 ces, "Czech", 95, "tchèque", 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, "sumérien", 388 mah, "Marshallese", 268, "marshall", 265 hau, "Hausa", 159, "haoussa", 159 ce, "Chechen", 74, "tchÉtchène", 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, "turkmène", 425 haw, "Hawaiian", 160, "hawaïen", 160 zen, "Zenaga", 458, "zenaga", 449 tl, "Tagalog", 398, "tagalog", 393 oss, "Ossetic; Ossetian", 318, "ossète", 312 mak, "Makasar", 254, "makassar", 248 kor, "Korean", 216, "coréen", 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-polynésiennes, 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 (après 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, "Volapük", 440, "volapük", 433 gd, "Scottish Gaelic; Gaelic", 360, "gaélique écossais; gaélique", 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 (après 1453)", 153 gon, "Gondi", 149, "gond", 147 az, "Azerbaijani", 33, "azéri", 37 cs, "Czech", 95, "tchèque", 398 alb, "Albanian", 11, "albanais", 11 ukr, "Ukrainian", 432, "ukrainien", 428 tuk, "Turkmen", 426, "turkmène", 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, norvégien; norvégien nynorsk", 304 may, "Malay", 256, "malais", 249 eo, "Esperanto", 117, "espéranto", 120 enm, "English, Middle (1100-1500)", 115, "anglais moyen (1100-1500)", 19 cv, "Chuvash", 86, "tchouvache", 400 ale, "Aleut", 12, "aléoute", 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, "indonésien", 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, "géorgien", 145 tut, "Altaic (Other)", 14, "altaïques, 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, "espéranto", 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, "slovène", 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, "macédonien", 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, "judéo-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, "môn-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, "araméen", 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, "coréen", 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, "Provençal; Occitan (post 1500)", 336, "provençal; occitan (après 1500)", 336 sah, "Yakut", 450, "iakoute", 171 bla, "Siksika", 369, "blackfoot", 63 nau, "Nauru", 285, "nauruan", 283 mk, "Macedonian", 250, "macédonien", 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, "judéo-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, "arménien", 27 kw, "Cornish", 88, "cornique", 94 srr, "Serer", 364, "sérère", 367 san, "Sanskrit", 355, "sanskrit", 359 fra, "French", 128, "français", 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, "népalais", 290 mt, "Maltese", 258, "maltais", 254 vol, "Volapük", 440, "volapük", 433 phn, "Phoenician", 331, "phénicien", 330 nic, "Niger-Kordofanian (Other)", 295, "nigéro-congolaises, autres langues", 293 fre, "French", 128, "français", 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, "gaélique écossais; gaélique", 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, "ossète", 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, "français moyen (1400-1600)", 133 che, "Chechen", 74, "tchÉtchène", 399 si, "Sinhalese", 371, "singhalais", 371 sem, "Semitic (Other)", 362, "sémitiques, autres langues", 365 pli, "Pali", 322, "pali", 321 mos, "Mossi", 281, "moré", 277 glg, "Gallegan", 136, "galicien", 139 be, "Belarusian", 47, "biélorusse", 58 fro, "French, Old (842-ca.1400)", 130, "français ancien (842-ca.1400)", 132 chg, "Chagatai", 71, "djaghataï", 107 sk, "Slovak", 377, "slovaque", 375 roh, "Raeto-Romance", 340, "rhéto-roman", 342 bra, "Braj", 58, "braj", 67 bg, "Bulgarian", 61, "bulgare", 70 cym, "Welsh", 447, "gallois", 141 sl, "Slovenian", 378, "slovène", 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, "Provençal; Occitan (post 1500)", 336, "provençal; occitan (après 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, "ouïgour", 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, "féroïen", 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, "azéri", 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, "arménien", 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, "tibétain", 407 tai, "Tai (Other)", 400, "thaïes, 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 Bokmål; Bokmål, Norwegian", 303, "norvégien bokmål; bokmål, norvégien", 298 su, "Sundanese", 392, "soundanais", 384 chr, "Cherokee", 75, "cherokee", 81 sv, "Swedish", 396, "suédois", 386 pra, "Prakrit languages", 335, "prâkrit", 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, "bamilékés, langues", 44 und, "Undetermined", 434, "indéterminée", 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, "néerlandais 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 (après 1453)", 153 gaa, "Ga", 134, "ga", 136 fj, "Fijian", 124, "fidjien", 127 btk, "Batak (Indonesia)", 45, "batak (Indonésie)", 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-tibétaines, autres langues", 372 kar, "Karen", 201, "karen", 202 he, "Hebrew", 161, "hébreu", 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, "géorgien", 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, "féroïen", 126 dut, "Dutch", 106, "néerlandais", 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, "télougou", 401 pro, "Provençal, Old (to 1500)", 337, "provençal ancien (jusqu'à 1500)", 337 nor, "Norwegian", 302, "norvégien", 297 mwr, "Marwari", 269, "marvari", 266 fr, "French", 128, "français", 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, "tibétain", 407 la, "Latin", 230, "latin", 230 ho, "Hiri Motu", 166, "hiri motu", 166 bel, "Belarusian", 47, "biélorusse", 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, "judéo-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, "berbères, 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, "ndébélé du Sud", 286 nde, "North Ndebele", 301, "ndébélé 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 Bokmål; Bokmål, Norwegian", 303, "norvégien bokmål; bokmål, norvégien", 298 nd, "North Ndebele", 301, "ndébélé du Nord", 285 mlg, "Malagasy", 255, "malgache", 253 bih, "Bihari", 52, "bihari", 59 hy, "Armenian", 22, "arménien", 27 sgn-jp, "Japanese Sign Language", 501, "Japanese Sign Language", 492 sot, "Sotho, Southern", 385, "sotho du Sud", 383 ne, "Nepali", 292, "népalais", 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, "créoles 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, "géorgien", 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, "néerlandais", 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, norvégien; norvégien 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, "norvégien", 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, "suédois", 386 nr, "South Ndebele", 388, "ndébélé 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, "zapotèque", 448 bod, "Tibetan", 409, "tibétain", 407 nyn, "Nyankole", 308, "nyankolé", 303 gil, "Gilbertese", 148, "kiribati", 213 gez, "Geez", 140, "guèze", 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, "indonésien", 180 ae, "Avestan", 30, "avestique", 34 ast, "Bable; Asturian", 34, "bable; asturien", 38 ine, "Indo-European (Other)", 179, "indo-européennes, autres langues", 179 af, "Afrikaans", 7, "afrikaans", 7 sus, "Susu", 393, "soussou", 385 mac, "Macedonian", 250, "macédonien", 244 heb, "Hebrew", 161, "hébreu", 161 ny, "Nyanja; Chichewa; Chewa", 307, "nyanja; chichewa; chewa", 302 cze, "Czech", 95, "tchèque", 398 te, "Telugu", 405, "télougou", 401 ps, "Pushto", 338, "pachto", 318 mad, "Madurese", 251, "madourais", 245 kok, "Konkani", 215, "konkani", 216 ca, "Catalan", 67, "catalan", 74 %% gperf-3.0.4/tests/jstest2.gperf0000664000000000000000000000365107147423434015123 0ustar rootrootstruct 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 #if defined(__STDC__) || defined(__cplusplus) #define CONST const #else #define CONST #endif 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.0.4/tests/c.exp0000664000000000000000000000110607147423434013431 0ustar rootrootin 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.0.4/tests/permut2.gperf0000664000000000000000000000001407641012100015070 0ustar rootrootxy yx xz zx gperf-3.0.4/tests/lang-ucs2.in0000664000000000000000000000042407150040454014605 0ustar rootroot -›  esky Dansk English Suomi Français Deutsch •»»·½¹º¬ âÑèÙê Italiano Norsk  CAA:89 Español Svenska  2)2D" Türkçe Ti¿ng ViÇt eåg,Šž N-e‡ Õ\® gperf-3.0.4/tests/modula.exp0000664000000000000000000000353007147423434014473 0ustar rootrootin 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.0.4/tests/c.gperf0000664000000000000000000000030607147423434013741 0ustar rootrootif 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.0.4/tests/irc.gperf0000664000000000000000000000350207147423434014275 0ustar rootroot%{ 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.0.4/tests/lang-utf8.gperf0000664000000000000000000000166707150040454015326 0ustar rootrootstruct 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.0.4/tests/configure0000775000000000000000000035752711141541057014414 0ustar rootroot#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 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 -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 fi echo >conf$$.file 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, 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= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="c-parse.gperf" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP CXX CXXFLAGS ac_ct_CXX CXXCPP CHECK_LANG_SYNTAX LIBOBJS LTLIBOBJS' ac_subst_files='' 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 # 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' 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=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. 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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$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 ;; -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=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 ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$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'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. 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 do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } 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 echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 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 .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # 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 -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | 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 .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } 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] --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 C/C++/Objective 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. _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" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 guested configure. 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 echo "$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.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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 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.61. Invocation command line was $ $0 $@ _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 test -z "$as_dir" && as_dir=. echo "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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$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 ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_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 cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$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'; { (exit 1); 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 # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" 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. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$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,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$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 { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$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. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } 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 { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" echo "$as_me:$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 fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out 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. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && 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 ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; 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 { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) 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; } /* 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 don't provoke an error unfortunately, instead are silently treated as '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's necessary to write '\x00'==0 to get something that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _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" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac 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 { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&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+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } 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 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 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; 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_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 { echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } 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 -a $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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_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+set}" = set || &/ 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 test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$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=' 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 s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= 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=`echo "$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. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $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} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 fi echo >conf$$.file 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&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.61. 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 cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet 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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 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' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. 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=$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 ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) echo "$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. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$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 if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; 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+set}" = set || 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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim SET_MAKE!$SET_MAKE$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim CPP!$CPP$ac_delim CXX!$CXX$ac_delim CXXFLAGS!$CXXFLAGS$ac_delim ac_ct_CXX!$ac_ct_CXX$ac_delim CXXCPP!$CXXCPP$ac_delim CHECK_LANG_SYNTAX!$CHECK_LANG_SYNTAX$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 53; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ 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[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[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="$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 || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$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 "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; 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 || echo 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" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$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 || echo 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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 # 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= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF 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 sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;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 " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$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 "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # 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 || { (exit 1); exit 1; } fi gperf-3.0.4/tests/incomplete.gperf0000664000000000000000000000041507666634105015664 0ustar rootrootstruct 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.0.4/tests/jstest3.gperf0000664000000000000000000000365707147423434015132 0ustar rootrootstruct 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 #if defined(__STDC__) || defined(__cplusplus) #define CONST const #else #define CONST #endif 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.0.4/tests/permut3.gperf0000664000000000000000000000002007641012100015066 0ustar rootrootabc acb bca cab gperf-3.0.4/tests/configure.ac0000664000000000000000000000266611133501077014761 0ustar rootrootdnl autoconf configuration for gperf/tests dnl Copyright (C) 1998, 2002, 2007, 2009 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.60]) AC_INIT([c-parse.gperf]) 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_prog_gcc = yes -a $ac_cv_prog_gxx = 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_OUTPUT([Makefile]) gperf-3.0.4/tests/test-4.exp0000664000000000000000000002215011141310264014312 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 (str, len) register const char *str; register unsigned int 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]]; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif struct resword * in_word_set (str, len) register const char *str; register unsigned int len; { 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} }; 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 int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { 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 0; } gperf-3.0.4/tests/test-6.exp0000664000000000000000000001733110112142001014306 0ustar rootrootGNU '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 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. -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.0.4/tests/test-7.exp0000664000000000000000000000124607147423434014337 0ustar rootrootin 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.0.4/tests/pascal.exp0000664000000000000000000000115407147423434014455 0ustar rootrootin 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.0.4/tests/chill.gperf0000664000000000000000000002723407147477603014632 0ustar rootrootstruct 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.0.4/tests/cplusplus.exp0000664000000000000000000002336011141310264015230 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 unsigned int 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 int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[6]]; /*FALLTHROUGH*/ case 6: case 5: case 4: hval += asso_values[(unsigned char)str[3]]; /*FALLTHROUGH*/ case 3: case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif struct resword * is_reserved_word (str, len) register const char *str; register unsigned int 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 int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return 0; } gperf-3.0.4/tests/chill.exp0000664000000000000000000014431311141310264014273 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 unsigned int 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 int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[29]]; /*FALLTHROUGH*/ case 29: hval += asso_values[(unsigned char)str[28]]; /*FALLTHROUGH*/ case 28: hval += asso_values[(unsigned char)str[27]]; /*FALLTHROUGH*/ case 27: hval += asso_values[(unsigned char)str[26]]; /*FALLTHROUGH*/ case 26: hval += asso_values[(unsigned char)str[25]]; /*FALLTHROUGH*/ case 25: hval += asso_values[(unsigned char)str[24]]; /*FALLTHROUGH*/ case 24: hval += asso_values[(unsigned char)str[23]]; /*FALLTHROUGH*/ case 23: hval += asso_values[(unsigned char)str[22]]; /*FALLTHROUGH*/ case 22: hval += asso_values[(unsigned char)str[21]]; /*FALLTHROUGH*/ case 21: hval += asso_values[(unsigned char)str[20]]; /*FALLTHROUGH*/ case 20: hval += asso_values[(unsigned char)str[19]]; /*FALLTHROUGH*/ case 19: hval += asso_values[(unsigned char)str[18]]; /*FALLTHROUGH*/ case 18: hval += asso_values[(unsigned char)str[17]]; /*FALLTHROUGH*/ case 17: hval += asso_values[(unsigned char)str[16]]; /*FALLTHROUGH*/ case 16: hval += asso_values[(unsigned char)str[15]]; /*FALLTHROUGH*/ case 15: hval += asso_values[(unsigned char)str[14]]; /*FALLTHROUGH*/ case 14: hval += asso_values[(unsigned char)str[13]]; /*FALLTHROUGH*/ case 13: hval += asso_values[(unsigned char)str[12]]; /*FALLTHROUGH*/ case 12: hval += asso_values[(unsigned char)str[11]]; /*FALLTHROUGH*/ case 11: hval += asso_values[(unsigned char)str[10]]; /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]]; /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]]; /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]+1]; /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif struct resword * in_word_set (str, len) register const char *str; register unsigned int 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 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 0; compare: { register const char *s = resword->name; if (*str == *s && !strcmp (str + 1, s + 1)) return resword; } } } return 0; } gperf-3.0.4/tests/test2.c0000664000000000000000000000276210603476376013713 0ustar rootroot/* 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 # define SET_BINARY(f) setmode (f, O_BINARY) #else # define SET_BINARY(f) (void)0 #endif #if defined __STDC__ || defined __cplusplus extern struct language * in_word_set (const char *, int); #else extern struct language * in_word_set (); #endif #define MAX_LEN 80 int main (argc, argv) 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 ((p[0] << 8) + 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.0.4/tests/jstest4.gperf0000664000000000000000000000366107647225543015134 0ustar rootrootstruct 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 #if defined(__STDC__) || defined(__cplusplus) #define CONST const #else #define CONST #endif 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.0.4/tests/objc.gperf0000664000000000000000000000315707646751610014447 0ustar rootroot%{ /* 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.0.4/tests/lang-ucs2.gperf0000664000000000000000000000333007150040454015301 0ustar rootrootstruct 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.0.4/tests/jscript.gperf0000664000000000000000000000244707147423434015205 0ustar rootroot%{ /* 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.0.4/tests/languages.exp0000664000000000000000000017304011141310264015145 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 http://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 (str, len) register const char *str; register unsigned int 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 int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[4]+1]; /*FALLTHROUGH*/ case 4: case 3: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]+9]; /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } 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, "sémitiques, 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, "ndébélé du Nord", 285}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sk", "Slovak", 377, "slovaque", 375}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"mk", "Macedonian", 250, "macédonien", 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, "ndébélé 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, "turkmène", 425}, {"sam", "Samaritan Aramaic", 350, "samaritain", 349}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"kir", "Kirghiz", 212, "kirghize", 212}, {""}, {"srr", "Serer", 364, "sérère", 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-tibétaines, 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, "macédonien", 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, "arménien", 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, "géorgien", 145}, {"sms", "Skolt Sami", 374, "sami skolt", 355}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ka", "Georgian", 141, "géorgien", 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, "môn-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, "rhéto-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, norvégien; norvégien nynorsk", 304}, {""}, {""}, {""}, {"swa", "Swahili", 394, "swahili", 389}, {""}, {"wen", "Sorbian languages", 383, "sorabes, langues", 381}, {""}, {""}, {""}, {""}, {"mah", "Marshallese", 268, "marshall", 265}, {""}, {""}, {"nbl", "South Ndebele", 388, "ndébélé 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, "judéo-espagnol", 194}, {"tel", "Telugu", 405, "télougou", 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 Bokmål; Bokmål, Norwegian", 303, "norvégien bokmål; bokmål, norvégien", 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, "berbères, 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, "gaélique écossais; gaélique", 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, "néerlandais moyen (ca. 1050-1350)", 289}, {""}, {""}, {"hz", "Herero", 162, "herero", 162}, {""}, {""}, {""}, {""}, {"tum", "Tumbuka", 422, "tumbuka", 421}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"tuk", "Turkmen", 426, "turkmène", 425}, {""}, {"sna", "Shona", 366, "shona", 368}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"kur", "Kurdish", 222, "kurde", 222}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"amh", "Amharic", 15, "amharique", 17}, {"az", "Azerbaijani", 33, "azéri", 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, "français 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, "français", 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, "néerlandais", 288}, {""}, {"za", "Zhuang; Chuang", 459, "zhuang; chuang", 450}, {""}, {"or", "Oriya", 314, "oriya", 309}, {"fan", "Fang", 121, "fang", 124}, {""}, {""}, {"tut", "Altaic (Other)", 14, "altaïques, 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, "biélorusse", 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, "népalais", 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, "tchèque", 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, "indonésien", 180}, {""}, {"tyv", "Tuvinian", 428, "touva", 416}, {""}, {"btk", "Batak (Indonesia)", 45, "batak (Indonésie)", 51}, {""}, {""}, {""}, {"nld", "Dutch", 106, "néerlandais", 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, "phénicien", 330}, {"de", "German", 142, "allemand", 14}, {""}, {""}, {"nor", "Norwegian", 302, "norvégien", 297}, {"fa", "Persian", 328, "persan", 327}, {""}, {""}, {"ti", "Tigrinya", 411, "tigrigna", 409}, {"te", "Telugu", 405, "télougou", 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, "coréen", 93}, {"gn", "Guarani", 155, "guarani", 155}, {""}, {""}, {"sl", "Slovenian", 378, "slovène", 376}, {"bal", "Baluchi", 37, "baloutchi", 41}, {""}, {""}, {""}, {"nl", "Dutch", 106, "néerlandais", 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, "judéo-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, "hébreu", 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, "tibétain", 407}, {"znd", "Zande", 456, "zandé", 447}, {""}, {""}, {""}, {"ae", "Avestan", 30, "avestique", 34}, {"heb", "Hebrew", 161, "hébreu", 161}, {"pra", "Prakrit languages", 335, "prâkrit", 335}, {""}, {"zh-min", "Min Fuzhou Hokkien Amoy or Taiwanese", 513, "Min Fuzhou Hokkien Amoy or Taiwanese", 504}, {"haw", "Hawaiian", 160, "hawaïen", 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, "français", 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, "arménien", 27}, {""}, {""}, {""}, {"zha", "Zhuang; Chuang", 459, "zhuang; chuang", 450}, {"moh", "Mohawk", 276, "mohawk", 272}, {""}, {""}, {""}, {""}, {"jrb", "Judeo-Arabic", 192, "judéo-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, "rhéto-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, "suédois", 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, "indéterminée", 177}, {"ch", "Chamorro", 73, "chamorro", 79}, {""}, {""}, {"nep", "Nepali", 292, "népalais", 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, "biélorusse", 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, "indonésien", 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, "slovène", 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, "tibétain", 407}, {"guj", "Gujarati", 156, "goudjrati", 150}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"nap", "Neapolitan", 291, "napolitain", 282}, {"os", "Ossetic; Ossetian", 318, "ossète", 312}, {"oss", "Ossetic; Ossetian", 318, "ossète", 312}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"kro", "Kru", 219, "krou", 220}, {""}, {""}, {"map", "Austronesian (Other)", 28, "malayo-polynésiennes, 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, "norvégien", 297}, {"gor", "Gorontalo", 150, "gorontalo", 148}, {""}, {""}, {"sgn-nl", "Dutch Sign Language", 504, "Dutch Sign Language", 495}, {""}, {""}, {""}, {""}, {""}, {"pi", "Pali", 322, "pali", 321}, {""}, {"vol", "Volapük", 440, "volapük", 433}, {"arp", "Arapaho", 19, "arapaho", 24}, {""}, {"mo", "Moldavian", 277, "moldave", 273}, {""}, {""}, {""}, {""}, {"ko", "Korean", 216, "coréen", 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, "guèze", 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, "tchèque", 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, "gaélique écossais; gaélique", 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, norvégien; norvégien nynorsk", 304}, {""}, {""}, {""}, {""}, {"mri", "Maori", 265, "maori", 262}, {""}, {""}, {"nob", "Norwegian Bokmål; Bokmål, Norwegian", 303, "norvégien bokmål; bokmål, norvégien", 298}, {""}, {"osa", "Osage", 316, "osage", 310}, {""}, {""}, {"oc", "Provençal; Occitan (post 1500)", 336, "provençal; occitan (après 1500)", 336}, {""}, {"mno", "Manobo languages", 263, "manobo, langues", 260}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"gv", "Manx", 264, "manx; mannois", 261}, {""}, {""}, {""}, {""}, {""}, {"ce", "Chechen", 74, "tchÉtchène", 399}, {""}, {""}, {""}, {""}, {""}, {"nde", "North Ndebele", 301, "ndébélé 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", "Volapük", 440, "volapük", 433}, {"hau", "Hausa", 159, "haoussa", 159}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cor", "Cornish", 88, "cornique", 94}, {"nic", "Niger-Kordofanian (Other)", 295, "nigéro-congolaises, autres langues", 293}, {""}, {""}, {""}, {""}, {"swe", "Swedish", 396, "suédois", 386}, {""}, {""}, {"alb", "Albanian", 11, "albanais", 11}, {""}, {""}, {""}, {""}, {"el", "Greek, Modern (1453-)", 154, "grec moderne (après 1453)", 153}, {""}, {"mic", "Micmac", 273, "micmac", 270}, {""}, {""}, {""}, {""}, {""}, {"dyu", "Dyula", 108, "dioula", 105}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"tai", "Tai (Other)", 400, "thaïes, 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, "géorgien", 145}, {""}, {"mac", "Macedonian", 250, "macédonien", 244}, {""}, {""}, {"pag", "Pangasinan", 324, "pangasinan", 323}, {""}, {"kac", "Kachin", 195, "kachin", 197}, {""}, {"gu", "Gujarati", 156, "goudjrati", 150}, {""}, {""}, {""}, {""}, {""}, {"zap", "Zapotec", 457, "zapotèque", 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, "azéri", 37}, {""}, {""}, {""}, {"khi", "Khoisan (Other)", 207, "khoisan, autres langues", 208}, {"glv", "Manx", 264, "manx; mannois", 261}, {""}, {"bo", "Tibetan", 409, "tibétain", 407}, {""}, {""}, {"scc", "Serbian", 363, "serbe", 366}, {""}, {""}, {""}, {""}, {"isl", "Icelandic", 172, "islandais", 189}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"uig", "Uighur", 431, "ouïgour", 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, "ouïgour", 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, "araméen", 23}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"i-tsu", "Tsou", 485, "Tsou", 476}, {""}, {""}, {"ell", "Greek, Modern (1453-)", 154, "grec moderne (après 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", "Provençal, Old (to 1500)", 337, "provençal 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, "français 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, "arménien", 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, "féroïen", 126}, {""}, {""}, {""}, {"zho", "Chinese", 80, "chinois", 86}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sgn-ni", "Nicaraguan Sign Language", 503, "Nicaraguan Sign Language", 494}, {""}, {""}, {""}, {""}, {""}, {""}, {"sqi", "Albanian", 11, "albanais", 11}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"fo", "Faroese", 123, "féroïen", 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, "bamilékés, 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, "créoles et pidgins divers", 98}, {""}, {"sux", "Sumerian", 391, "sumérien", 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, "espéranto", 120}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"gre", "Greek, Modern (1453-)", 154, "grec moderne (après 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, "français", 131}, {""}, {""}, {""}, {""}, {""}, {"tsi", "Tsimshian", 419, "tsimshian", 418}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"glg", "Gallegan", 136, "galicien", 139}, {""}, {""}, {""}, {""}, {"tli", "Tlingit", 414, "tlingit", 411}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"oci", "Provençal; Occitan (post 1500)", 336, "provençal; occitan (après 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, "aléoute", 12}, {""}, {""}, {""}, {""}, {""}, {"cze", "Czech", 95, "tchèque", 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, "tchÉtchène", 399}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ilo", "Iloko", 176, "ilocano", 176}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ine", "Indo-European (Other)", 179, "indo-européennes, autres langues", 179}, {""}, {""}, {""}, {""}, {"cmc", "Chamic languages", 72, "chames, langues", 78}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"epo", "Esperanto", 117, "espéranto", 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} }; #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const struct language * in_word_set (str, len) register const char *str; register unsigned int len; { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return 0; } gperf-3.0.4/tests/Makefile.in0000664000000000000000000004405511141373477014550 0ustar rootroot# Makefile for gperf/tests # Copyright (C) 1989, 1992-1993, 1995, 1998, 2000, 2002-2004, 2007-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 . #### 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 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-link-c check-link-c++ 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-link-c: force @echo "performing some tests of the perfect hash generator" $(CC) -c $(CFLAGS) $(srcdir)/test.c $(GPERF) -c -l -S1 -I -o $(srcdir)/c.gperf > cinset.c $(CC) $(CFLAGS) $(LDFLAGS) -o cout cinset.c test.$(OBJEXT) check-link-c++: force check-c: @echo "testing ANSI C reserved words, all items should be found in the set" ./cout -v < $(srcdir)/c.gperf | LC_ALL=C tr -d '\r' > c.out diff $(srcdir)/c.exp c.out check-ada: $(GPERF) -k1,4,'$$' -I $(srcdir)/ada.gperf > adainset.c # double '$$' is only there since make gets confused; program wants only 1 '$' $(CC) $(CFLAGS) $(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) $(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: $(GPERF) -k1,2,'$$' -I -o $(srcdir)/modula3.gperf > m3inset.c $(CC) $(CFLAGS) $(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: $(GPERF) -o -S2 -I < $(srcdir)/pascal.gperf > pinset.c $(CC) $(CFLAGS) $(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: $(GPERF) -k1 -t -I -K foreign_name < $(srcdir)/lang-utf8.gperf > lu8inset.c $(CC) $(CFLAGS) $(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 # check for binary keywords with NUL bytes check-lang-ucs2: $(CC) -c $(CFLAGS) $(srcdir)/test2.c $(GPERF) -k4 -t -l -I -K foreign_name < $(srcdir)/lang-ucs2.gperf > lu2inset.c $(CC) $(CFLAGS) $(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 # 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) $(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) $(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) $(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' | sed -e 's|[^ ]*[/\\][\\]*src[/\\][\\]*gperf[^ ]*|../src/gperf|' check-test: $(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)' 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) cout$(EXEEXT) lu2out$(EXEEXT) lu8out$(EXEEXT) m3out$(EXEEXT) pout$(EXEEXT) preout$(EXEEXT) smtp.c smtp$(EXEEXT) tmp-* valitest* $(RM) -r *.dSYM distclean : clean $(RM) config.status config.log config.cache Makefile maintainer-clean : distclean force : gperf-3.0.4/tests/pascal.gperf0000664000000000000000000000027407147423434014766 0ustar rootrootwith 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.0.4/tests/c-parse.gperf0000664000000000000000000000452607646751610015065 0ustar rootroot%{ /* 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.0.4/tests/adadefs.gperf0000664000000000000000000000073107147423434015110 0ustar rootrootboolean 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.0.4/tests/java.gperf0000664000000000000000000000407210241404654014434 0ustar rootroot%{ /* 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 part of GNU CC. GNU CC 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. GNU CC 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 GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 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.0.4/tests/charsets.exp0000664000000000000000000015474111141310264015022 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 http://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 (str, len) register const char *str; register unsigned int 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 int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[21]]; /*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]; /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]+1]; /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]+3]; /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]+1]; /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } 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} }; #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const struct charset * in_word_set (str, len) register const char *str; register unsigned int len; { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return 0; } gperf-3.0.4/tests/ada-pred.exp0000664000000000000000000000214107147423434014664 0ustar rootrootin 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.0.4/tests/gpc.exp0000664000000000000000000001317311141310264013750 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 (str, len) register const char *str; register unsigned int 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]]; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif struct resword * is_reserved_word (str, len) register const char *str; register unsigned int len; { 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 (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return 0; } gperf-3.0.4/tests/c-parse.exp0000664000000000000000000002030611141310264014525 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 unsigned int 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 int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[2]]; /*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} }; #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif struct resword * is_reserved_word (str, len) register const char *str; register unsigned int len; { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return 0; } gperf-3.0.4/tests/test.c0000664000000000000000000000157610603476376013633 0ustar rootroot/* 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 #if defined __STDC__ || defined __cplusplus extern char * in_word_set (const char *, int); #else extern char * in_word_set (); #endif #define MAX_LEN 80 int main (argc, argv) 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.0.4/tests/lang-ucs2.exp0000664000000000000000000000152207150043022014765 0ustar rootrootin 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.0.4/tests/modula2.exp0000664000000000000000000001567311141310264014551 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 (str, len) register const char *str; register unsigned int 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 int hval = 0; switch (len) { default: hval += asso_values[(unsigned char)str[7]]; /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]]; /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const char * in_word_set (str, len) register const char *str; register unsigned int 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 int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) if (len == lengthtable[key]) { register const char *s = wordlist[key]; if (*str == *s && !memcmp (str + 1, s + 1, len - 1)) return s; } } return 0; } gperf-3.0.4/tests/objc.exp0000664000000000000000000001551411141310264014115 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 (str, len) register const char *str; register unsigned int 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 int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif struct resword * is_reserved_word (str, len) register const char *str; register unsigned int len; { 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 (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return 0; } gperf-3.0.4/tests/smtp.gperf0000664000000000000000000000753707645660237014526 0ustar rootroot%{ /* 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 (s1, s2) register const char *s1; register 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 (argc, argv) int argc; char *argv[]; { int i, j, k, n, exitcode; unsigned int 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 (s[k])) s[k] = tolower (s[k]); else if (islower (s[k])) s[k] = toupper (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.0.4/tests/c++.gperf0000664000000000000000000000046007147423434014070 0ustar rootrootasm 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.0.4/tests/java.exp0000664000000000000000000001617611141310264014126 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 part of GNU CC. GNU CC 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. GNU CC 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 GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 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 unsigned int 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 int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif struct java_keyword * java_keyword (str, len) register const char *str; register unsigned int 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 int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return 0; } gperf-3.0.4/tests/makeinfo.gperf0000664000000000000000000000570107147423434015314 0ustar rootrootCOMMAND; %% !, 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.0.4/tests/incomplete.exp0000664000000000000000000001103711141310264015333 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 (str, len) register const char *str; register unsigned int 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]]; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif struct month * in_word_set (str, len) register const char *str; register unsigned int len; { 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 (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return 0; } gperf-3.0.4/tests/permutc2.exp0000664000000000000000000001374711141310264014747 0ustar rootroot/* C code produced by gperf version 3.0.4 */ /* Command-line: ../src/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 (s1, s2) 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 (str, len) register const char *str; register unsigned int 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 }; return asso_values[(unsigned char)str[1]+3] + asso_values[(unsigned char)str[0]]; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const char * in_word_set (str, len) register const char *str; register unsigned int len; { static const char * wordlist[] = { "{w", "az", "ay", "za", "ya", "x{", "x[", "[w" }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key]; if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strcmp (str, s)) return s; } } return 0; } gperf-3.0.4/tests/permutc2.gperf0000664000000000000000000000033407642526256015267 0ustar rootroot%{ /* 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.0.4/tests/gpc.gperf0000664000000000000000000000214207147423434014270 0ustar rootroot%{ /* 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.0.4/tests/modula2.gperf0000664000000000000000000000034107147423434015061 0ustar rootrootAND 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.0.4/tests/charsets.gperf0000664000000000000000000003253207641012077015335 0ustar rootroot%{ /* Generated from IANA charset data from http://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.0.4/tests/validate0000775000000000000000000000346007147455047014222 0ustar rootroot#! /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 grep -n ' const ' valitest.c /dev/null && exit 1 if test $use_traditional = true; then verbose ${CC} ${CFLAGS} -traditional valitest.c -o valitest ./valitest fi verbose ${CC} ${CFLAGS} -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} -traditional -Dconst= valitest.c -o valitest ./valitest fi verbose ${CC} ${CFLAGS} -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} -ansi -pedantic -pedantic-errors valitest.c -o valitest ./valitest verbose ${CXX} ${CXXFLAGS} -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} -ansi -pedantic -pedantic-errors -DCPLUSPLUS_TEST valitest.c -o valitest ./valitest ;; esac done exit 0 gperf-3.0.4/tests/ada.gperf0000664000000000000000000000055607147423434014253 0ustar rootrootelse 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.0.4/tests/ada-res.exp0000664000000000000000000000214207147423434014524 0ustar rootrootin 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.0.4/tests/cplusplus.gperf0000664000000000000000000000605107646751610015560 0ustar rootroot%{ /* 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.0.4/tests/jstest1.gperf0000664000000000000000000000321107147423434015112 0ustar rootrootabstract 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 #if defined(__STDC__) || defined(__cplusplus) #define CONST const #else #define CONST #endif 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.0.4/tests/lang-utf8.exp0000664000000000000000000000067307150040454015013 0ustar rootrootin 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.0.4/tests/modula3.gperf0000664000000000000000000000114007147423434015060 0ustar rootrootAND 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.0.4/README0000664000000000000000000000231307332320263012200 0ustar rootrootThis 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. 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 ftp://ftp.gnu.org/pub/gnu/standards.*, especially the 'Makefile Conventions', 'Configuration', and 'User Interfaces' sections. 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.0.4/configure0000775000000000000000000023207711141541057013242 0ustar rootroot#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 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 -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 fi echo >conf$$.file 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, 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= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="doc/gperf.1" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias SET_MAKE subdirs LIBOBJS LTLIBOBJS' ac_subst_files='' 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 # 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' 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=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. 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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$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 ;; -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=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 ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$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'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. 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 do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } 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 echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 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 .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # 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 -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | 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 .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } 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] --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 _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" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 guested configure. 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 echo "$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.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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 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.61. Invocation command line was $ $0 $@ _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 test -z "$as_dir" && as_dir=. echo "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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$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 ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_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 cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$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'; { (exit 1); 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 # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" 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. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$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,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$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 { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$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. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } 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 { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else 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 fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_aux_dir=$srcdir 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 } ' 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_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+set}" = set || &/ 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 test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$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=' 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 s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= 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=`echo "$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. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $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} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 fi echo >conf$$.file 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&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.61. 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 cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet 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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 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' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. 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=$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 ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) echo "$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. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$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 if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; 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+set}" = set || 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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim SET_MAKE!$SET_MAKE$ac_delim subdirs!$subdirs$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 41; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ 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[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[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="$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 || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$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 "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; 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 || echo 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" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$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 || echo 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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 # 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= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF 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 sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;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 " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$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 "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # 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 || { (exit 1); exit 1; } fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file and --srcdir 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=*) ;; *) case $ac_arg in *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="$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=`echo "$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 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)" echo "$as_me:$LINENO: $ac_msg" >&5 echo "$ac_msg" >&6 { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$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 || echo 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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$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 guested configure; otherwise get Cygnus style configure. 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 elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5 echo "$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 { echo "$as_me:$LINENO: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 echo "$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\"" || { { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5 echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;} { (exit 1); exit 1; }; } fi cd "$ac_popdir" done fi gperf-3.0.4/configure.ac0000664000000000000000000000266211133501077013613 0ustar rootrootdnl autoconf configuration for gperf dnl Copyright (C) 1998, 2002, 2003, 2005-2007, 2009 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.60]) AC_INIT([doc/gperf.1]) AC_PROG_MAKE_SET AC_OBJEXT AC_EXEEXT dnl An autoconf-2.52 bug: AC_CONFIG_SUBDIRS requires AC_CONFIG_AUX_DIR_DEFAULT. ac_aux_dir=$srcdir AC_PROVIDE([AC_CONFIG_AUX_DIR_DEFAULT]) 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([Makefile]) gperf-3.0.4/mkinstalldirs0000775000000000000000000000132207147751421014135 0ustar rootroot#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do 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 done exit $errstatus # mkinstalldirs ends here gperf-3.0.4/Makefile.in0000664000000000000000000000316611054056200013365 0ustar rootroot# Makefile for gperf # Copyright (C) 1989, 1992, 1993, 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 . #### Start of system configuration section. #### # Programs used by "make": RM = rm -f @SET_MAKE@ #### End of system configuration section. #### SHELL = /bin/sh 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 force : gperf-3.0.4/README.woe320000664000000000000000000000243110112140314013122 0ustar rootrootInstallation on Woe32 (WinNT/2000/XP, Win95/98/ME): - Requires MS Visual C/C++ 4.0 or 5.0 or 6.0 or 7.0. Note that binaries created with MSVC 7.0 should not be distributed: They depend on a closed-source library 'msvcr70.dll' which is not normally part of a Woe32 installation. You cannot distribute 'msvcr70.dll' with the binaries - this would be a violation of the GPL and of the Microsoft EULA. You can distribute the binaries without including 'msvcr70.dll', but this will cause problems for users that don't have this library on their system. Therefore it is not recommended. This problem does not occur with MSVC 6.0 and earlier. - Cannot build in a separate directory. - Build instructions: Make sure that the MSVC4.0 or MSVC5.0 or MSVC6.0 or MSVC7.0 utilities ("cl" etc.) are found in PATH. In a typical MSVC6.0 installation, this can be achieved by running C:\Program Files\Microsoft Visual Studio\VC98\bin\vcvars32.bat In a typical MSVC7.0 installation, it can be achieved by running C:\Program Files\Microsoft Visual Studio .NET\Common7\Tools\vsvars32.bat nmake -f Makefile.msvc - Installation: Either: Copy gperf.exe to your program repository. Or: nmake -f Makefile.msvc install prefix=InstallBaseDirectory gperf-3.0.4/README.vms0000664000000000000000000000021307655424354013017 0ustar rootrootInstallation on VMS: - Build instructions: $ mms /description=Makefile.vms - Installation: $ mms /description=Makefile.vms install gperf-3.0.4/Makefile.vms0000664000000000000000000001422311054056405013567 0ustar rootroot# -*- Makefile -*- for gperf on VMS using the MMS utility # Copyright (C) 2003 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 . #### Start of system configuration section. #### # Directories used by "make install": prefix = SYS$DATA:[ exec_prefix = $(prefix) datadir = $(prefix).share bindir = $(exec_prefix).bin mandir = $(datadir).man man1dir = $(mandir).man1 docdir = $(datadir).doc.gperf # Programs used by "make": CC = cc CXX = cxx # These flags affect binary compatibility. GNU gperf does not need them, # but other packages do. ABIFLAGS = /name=(as_is,short) /float=ieee WARN_CFLAGS = /warning OPTIMFLAGS = /optimize CFLAGS = $(ABIFLAGS) $(WARN_CFLAGS) $(OPTIMFLAGS) CXXFLAGS = $(ABIFLAGS) $(WARN_CFLAGS) $(OPTIMFLAGS) DEFS = "VMS=1","HAVE_CONFIG_H=1" INCLUDES = /include=([],[.lib],[.src]) LN = copy RM = delete # Programs used by "make install": INSTALL = copy INSTALL_PROGRAM = copy INSTALL_DATA = copy #### End of system configuration section. #### LIB_OBJECTS = [.lib]getopt.obj,[.lib]getopt1.obj,[.lib]getline.obj,[.lib]hash.obj SRC_OBJECTS = [.src]version.obj,[.src]positions.obj,[.src]options.obj,[.src]keyword.obj,[.src]keyword-list.obj,[.src]input.obj,[.src]bool-array.obj,[.src]hash-table.obj,[.src]search.obj,[.src]output.obj,[.src]main.obj OBJECTS = $(LIB_OBJECTS),$(SRC_OBJECTS) all : gperf.exe write sys$output "Nothing else to be done for 'all'." [.src]config.h : [.src]config.h_vms $(LN) [.src]config.h_vms [.src]config.h [.lib]getopt.obj : [.lib]getopt.c $(CC) $(INCLUDES) $(CFLAGS) /define=("VMS=1") [.lib]getopt.c /obj=[.lib]getopt.obj [.lib]getopt1.obj : [.lib]getopt1.c $(CC) $(INCLUDES) $(CFLAGS) /define=("VMS=1") [.lib]getopt1.c /obj=[.lib]getopt1.obj [.lib]getline.obj : [.lib]getline.cc $(CXX) $(INCLUDES) $(CXXFLAGS) /define=("VMS=1") [.lib]getline.cc /obj=[.lib]getline.obj [.lib]hash.obj : [.lib]hash.cc $(CXX) $(INCLUDES) $(CXXFLAGS) /define=("VMS=1") [.lib]hash.cc /obj=[.lib]hash.obj # Dependencies. CONFIG_H = [.src]config.h VERSION_H = [.src]version.h POSITIONS_H = [.src]positions.h,[.src]positions.icc OPTIONS_H = [.src]options.h,[.src]options.icc,$(POSITIONS_H) KEYWORD_H = [.src]keyword.h,[.src]keyword.icc KEYWORD_LIST_H = [.src]keyword-list.h,[.src]keyword-list.icc,$(KEYWORD_H) INPUT_H = [.src]input.h,$(KEYWORD_LIST_H) BOOL_ARRAY_H = [.src]bool-array.h,[.src]bool-array.icc,$(OPTIONS_H) HASH_TABLE_H = [.src]hash-table.h,$(KEYWORD_H) SEARCH_H = [.src]search.h,$(KEYWORD_LIST_H),$(POSITIONS_H),$(BOOL_ARRAY_H) OUTPUT_H = [.src]output.h,$(KEYWORD_LIST_H),$(POSITIONS_H) [.src]version.obj : [.src]version.cc,$(VERSION_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]version.cc /obj=[.src]version.obj [.src]positions.obj : [.src]positions.cc,$(POSITIONS_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]positions.cc /obj=[.src]positions.obj [.src]options.obj : [.src]options.cc,$(OPTIONS_H),$(VERSION_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]options.cc /obj=[.src]options.obj [.src]keyword.obj : [.src]keyword.cc,$(KEYWORD_H),$(POSITIONS_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]keyword.cc /obj=[.src]keyword.obj [.src]keyword-list.obj : [.src]keyword-list.cc,$(KEYWORD_LIST_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]keyword-list.cc /obj=[.src]keyword-list.obj [.src]input.obj : [.src]input.cc,$(INPUT_H),$(OPTIONS_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]input.cc /obj=[.src]input.obj [.src]bool-array.obj : [.src]bool-array.cc,$(BOOL_ARRAY_H),$(OPTIONS_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]bool-array.cc /obj=[.src]bool-array.obj [.src]hash-table.obj : [.src]hash-table.cc,$(HASH_TABLE_H),$(OPTIONS_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]hash-table.cc /obj=[.src]hash-table.obj [.src]search.obj : [.src]search.cc,$(SEARCH_H),$(OPTIONS_H),$(HASH_TABLE_H),$(CONFIG_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]search.cc /obj=[.src]search.obj [.src]output.obj : [.src]output.cc,$(OUTPUT_H),$(OPTIONS_H),$(VERSION_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]output.cc /obj=[.src]output.obj [.src]main.obj : [.src]main.cc,$(OPTIONS_H),$(INPUT_H),$(SEARCH_H),$(OUTPUT_H) $(CXX) $(INCLUDES) $(CXXFLAGS) /define=($(DEFS)) [.src]main.cc /obj=[.src]main.obj gperf.exe : $(OBJECTS) link /executable=gperf.exe $(OBJECTS) install : all force create /directory $(prefix)] create /directory $(exec_prefix)] create /directory $(bindir)] $(INSTALL_PROGRAM) gperf.exe $(bindir)]gperf.exe create /directory $(datadir)] create /directory $(mandir)] create /directory $(man1dir)] $(INSTALL_DATA) [.doc]gperf.1 $(man1dir)]gperf.1 create /directory $(datadir).doc] create /directory $(docdir)] $(INSTALL_DATA) [.doc]gperf.html $(docdir)]gperf.html installdirs : force create /directory $(prefix)] create /directory $(exec_prefix)] create /directory $(bindir)] create /directory $(datadir)] create /directory $(mandir)] create /directory $(man1dir)] create /directory $(datadir).doc] create /directory $(docdir)] uninstall : force $(RM) $(bindir)]gperf.exe; $(RM) $(man1dir)]gperf.1; $(RM) $(docdir)]gperf.html; check : all write sys$output "Nothing else to be done for 'check'." mostlyclean : clean write sys$output "Nothing else to be done for 'mostlyclean'." clean : $(RM) [.lib]*.obj;* $(RM) [.src]*.obj;* $(RM) gperf.exe;* $(RM) [.src]config.h;* distclean : clean write sys$output "Nothing else to be done for 'distclean'." maintainer-clean : distclean write sys$output "Nothing else to be done for 'maintainer-clean'." gperf-3.0.4/AUTHORS0000664000000000000000000000012007570420016012363 0ustar rootrootDouglas C. Schmidt Bruno Haible gperf-3.0.4/INSTALL0000664000000000000000000002244511053753224012363 0ustar rootrootBasic 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.0.4/ChangeLog0000664000000000000000000045571311141373477013122 0ustar rootroot2009-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.0.4/COPYING0000664000000000000000000010451311054056306012360 0ustar rootroot 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 . gperf-3.0.4/Makefile.devel0000664000000000000000000000226010604677616014074 0ustar rootroot# 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 src/config.h.msvc src/config.h_vms doc/gperf.1 CONFIGURES = configure lib/configure src/configure tests/configure doc/configure configures : $(CONFIGURES) configure : configure.ac aclocal.m4 autoconf -I . lib/configure : lib/configure.ac aclocal.m4 cd lib && autoconf -I .. src/configure : src/configure.ac aclocal.m4 cd src && autoconf -I .. tests/configure : tests/configure.ac aclocal.m4 cd tests && autoconf -I .. doc/configure : doc/configure.ac aclocal.m4 cd doc && autoconf -I .. 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 .. src/config.h.msvc : src/config.h.in cp src/config.h.in src/config.h.msvc src/config.h_vms : src/config.h.in cp src/config.h.in src/config.h_vms doc/gperf.1 : force prog=`PATH=build/src:src:$$PATH which gperf`; if test -n "$$prog"; then doc/help2man --name='generate a perfect hash function from a key set' --section=1 $$prog > doc/gperf.1; fi force :