÷ƒ’À;è TeX output 1993.08.14:1707‹ÿÿÿÿ K ûþ´ è üÞC†‘1‚ŠóBKñ`yáG cmr10ëBF–ýí9unnelW“eb›KHac–ÿOk“er's˜Man“ualŽŸNçÏ’‘B?ó9DÓítG®G®cmr17äRoss–7tN.“WilliamsŽ¤.sç‘|÷mó4Kñ`yff cmr10ßV1.0–ÌÍfor“F–þÌÌunnelW“eb‘ÌÍV3.0Ž¡’®¯ÄMa™˜y‘ÌÍ1992ŽŽŽŒ‹* Ä)< ý;ÖÄ ªÝ»‘*­ÛŸÆ¶ ‰ffªÊ•ŸñÇóKñ`y cmr10ÄCop•¸ãyrigh“t‘rž²×cŽŽŽ‘UUó!",š cmsy10Æ ŽŽŽŽ‘ª«Ä1992–UURoss“N.“Williams.ŽŸPš¸ãermission–+êis“gran˜ted“to“mak˜e“and“distribute“v˜erbatim“copies“of“this“man˜ual“pro˜vided“that“theŽŸ cop•¸ãyrigh“t–UUnotice“and“this“pGermission“notice“are“preserv¸ãed“on“all“copies.ŽŸX-‰ffªÊ•ŽŸK’ý“%1ŽŽŒ‹@ Ä)< ý;ÖÄ ªÝ»ŸK’ý“%Ä2ŽŽŒ‹í Ä)< ý;ÖÄ ªÝ» ý´ãK‘*­ÛóHò"VáG cmbx10ëHCon–ÿ4‰ten“tsŽŸCÁ‘*­Ûóò"V cmbx10ÉPreface’¯ù5ŽŽ¤Á‘*­ÛAc•®9kno“wledgemen“ts’Eë7ŽŽ¡‘*­ÛPresen®9tation‘ÕTNotes’D‘!9ŽŽ¡‘*­Û1Ž‘9­ÜF–ÿ «unnelW“eb‘ÕTDesign’1ÿ³11ŽŽ¤Á‘9­ÜÄ1.1Ž‘P­àMotiv‘ÿqÇation–UUfor“F–ÿ*ªunnelW“eb‘Æ‘üó  b> cmmi10Å:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ11ŽŽ¡‘9­Ü1.2Ž‘P­àInden¸ãtation‘ƶ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ12ŽŽ¡‘9­Ü1.3Ž‘P­àReview–UUof“F–ÿ*ªunnelW“eb‘UUSyn¸ãtax‘8*‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ14ŽŽ¡‘P­à1.3.1Ž‘p­áReview–UUof“Macro“De nition“Syn¸ãtax‘¢œ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ14ŽŽ¡‘P­à1.3.2Ž‘p­áReview–UUof“Macro“Call“Syn¸ãtax‘¸ ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ16ŽŽ¡‘P­à1.3.3Ž‘p­áReview–UUof“Pš¸ãarameterized“Macro“Call“Syn˜tax‘°¦‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ16ŽŽ¡‘9­Ü1.4Ž‘P­àDoGcumen¸ãt‘UUStructuring‘¿g‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!eÄ16ŽŽ¡‘9­Ü1.5Ž‘P­àDiscussion–UUof“Some“Miscellaneous“Issues‘0á‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ18ŽŽ¡‘9­Ü1.6Ž‘P­àAutomated–UURegression“T‘ÿ*ªesting‘©ì‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ18ŽŽ¡‘9­Ü1.7Ž‘P­àCommand–UULine“In¸ãterface‘ÿ`‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!eÄ18ŽŽ¡‘9­Ü1.8Ž‘P­àFile–UUName“Managemen¸ãt‘1'‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ19ŽŽ¡‘P­à1.8.1Ž‘p­áFilename‘UUExtensions‘ñ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ20ŽŽ¡‘P­à1.8.2Ž‘p­áFilename‘UUInheritance‘ñ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ20ŽŽ¡‘P­à1.8.3Ž‘p­áP¸ãortable–UUStructure“of“File“Names‘[Š‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ21ŽŽ¡‘9­Ü1.9Ž‘P­àSpGecifying–UUConstrainš¸ãts“on“the“Num˜bGer“of“Instan˜tiations‘·ª‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ22ŽŽ¡‘9­Ü1.10Ž‘P­àThe–UURelationship“Bet•¸ãw“een›UUDoGcumen“t˜Structure˜and˜Macro˜Structure‘©=‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ23ŽŽ¡‘9­Ü1.11Ž‘P­àDiagnostic‘UUMessages‘øW‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ25ŽŽ¡‘9­Ü1.12Ž‘P­àSummary‘”ö‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!cÄ25ŽŽŸÁ‘*­ÛÉ2Ž‘9­ÜF–ÿ «unnelW“eb‘ÕTImplemen®9tation’^W27ŽŽ¡‘9­ÜÄ2.1Ž‘P­àIn¸ãtroGduction‘”î‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ27ŽŽ¡‘9­Ü2.2Ž‘P­àHistory–UUof“F–ÿ*ªunnelW“eb‘UUImplemen¸ãtations‘L‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ27ŽŽ¡‘9­Ü2.3Ž‘P­àWh¸ãy›UUF–ÿ*ªunnelW“eb˜W“asn't˜Used˜to˜W“rite˜Itself‘q‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ28ŽŽ¡‘9­Ü2.4Ž‘P­àCoGding‘UUSt¸ãyle‘¸u‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ28ŽŽ¡‘9­Ü2.5Ž‘P­àUse–UUof“Memory‘#‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!cÄ29ŽŽŽŸK’ý“%3ŽŽŒ‹9 Ä)< ý;ÖÄ ªÝ» ý_"E‘9­ÜÄ2.6Ž‘P­àThe‘UUHeap‘¥‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ29ŽŽ¤‘9­Ü2.7Ž‘P­àThe‘UUStac¸ãk‘‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!cÄ30ŽŽ¡‘9­Ü2.8Ž‘P­àStatic‘UUV‘ÿ*ªariables‘ê5‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!cÄ30ŽŽ¡‘9­Ü2.9Ž‘P­àImplemenš¸ãting–UUT‘ÿ*ªext“Inden˜tation‘©è‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ30ŽŽŸ‘*­ÛÉ3Ž‘9­ÜF–ÿ «unnelW“eb‘ÕTMoQÇdi cation’~S35ŽŽ¡‘9­ÜÄ3.1Ž‘P­àIn¸ãtroGduction‘”î‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ35ŽŽ¡‘9­Ü3.2Ž‘P­àThe–UUDanger“of“MoGdifying“Languages‘Û”‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ35ŽŽ¡‘9­Ü3.3Ž‘P­àAuthoritš¸ãy–UUvs“User“Securit˜y‘¢ß‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ36ŽŽ¡‘9­Ü3.4Ž‘P­àWhat–UUI“W‘ÿ*ªan¸ãt“to“Protect‘8E‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ37ŽŽ¡‘9­Ü3.5Ž‘P­àMoGdifying–UUthe“Man¸ãualsF‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!cÄ38ŽŽ¡‘9­Ü3.6Ž‘P­àHo•¸ãw›UUCop“yrigh“t˜La“w˜W‘ÿ*ªorks‘x5‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ38ŽŽ¡‘9­Ü3.7Ž‘P­àManagemen¸ãt–UUof“the“Ocial“F–ÿ*ªunnelW“ebwÿ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ39ŽŽ¡‘9­Ü3.8Ž‘P­àA–UUGNU“V‘ÿ*ªersion?‘Ÿ…‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ41ŽŽ¡‘9­Ü3.9Ž‘P­àSummary‘”ö‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!cÄ41ŽŽŸ‘*­ÛÉ4Ž‘9­ÜF–ÿ «unnelW“eb‘ÕTF“uture’2l43ŽŽ¡‘9­ÜÄ4.1Ž‘P­àDoGcumen¸ãtation‘ÍÁ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!cÄ43ŽŽ¡‘9­Ü4.2Ž‘P­àCommand–UULine“In¸ãterface‘ÿ`‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!eÄ43ŽŽ¡‘9­Ü4.3Ž‘P­àShell‘UUIn¸ãterpreter‘ê/‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ43ŽŽ¡‘9­Ü4.4Ž‘P­àLanguage‘UUDesign‘*,‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!eÄ44ŽŽ¡‘9­Ü4.5Ž‘P­àScanner/MappGer‘F‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ44ŽŽ¡‘9­Ü4.6Ž‘P­àP¸ãarser‘?¶‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!eÄ45ŽŽ¡‘9­Ü4.7Ž‘P­àAnalyser‘\‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!cÄ45ŽŽ¡‘9­Ü4.8Ž‘P­àT‘ÿ*ªangle‘Õ ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!eÄ45ŽŽ¡‘9­Ü4.9Ž‘P­àW‘ÿ*ªea•¸ãv“e‘ñ}‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ45ŽŽ¡‘9­Ü4.10Ž‘P­àLister‘ÆÒ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!eÄ46ŽŽ¡‘9­Ü4.11Ž‘P­àDiagnostics‘\ ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!eÄ47ŽŽ¡‘9­Ü4.12Ž‘P­àSpGeed‘*_‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ47ŽŽ¡‘9­Ü4.13Ž‘P­àCorrectness‘œ‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ47ŽŽ¡‘9­Ü4.14Ž‘P­àT‘ÿ*ªest‘UUSuite‘Tû‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!dÄ47ŽŽ¡‘9­Ü4.15Ž‘P­àMac¸ãhine-SpGeci c‘UUChanges‘q!‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!eÄ48ŽŽ¡‘9­Ü4.16Ž‘P­àSummary‘”ö‘üÅ:Ž–Ç‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž“‘ü:Ž‘!cÄ48ŽŽ¤‘*­ÛÉAŽ‘9­ÜGNU–ÕTGeneral“Public“License“V‘ÿ «ersion“2’ʶ49ŽŽ¡‘*­ÛBŽ‘9­ÜReferences’ZL57ŽŽ¡‘*­ÛIndex’‚Ï÷57ŽŽŽŸK’ý“%Ä4ŽŽŒ‹œ Ä)< ý;ÖÄ ªÝ» ýµ"E‘*­ÛëHPrefaceŽŸ:‘*­ÛÄThis–+manš¸ãual“is“for“hac˜k˜ers!‘HAn˜y˜one“who“w˜an˜ts“to“bash,– diddle,“frob,“grind,“mangle,“patc˜h,“pGok˜e,Ž¤ ‘*­Ûtoggle,–UUtš¸ãwiddle,“zap,“or“generally“hac˜k“F–ÿ*ªunnelW“eb–UUshould“at“least“tak˜e“a“loGok“at“this“man˜ual.ŽŸ‘*­ÛThis–UUdošGcumen¸ãt“has“b˜een“created“to“servš¸ãe“t˜w˜o“purpGoses:Ž©‘6æ½1.ŽŽŽ‘C­ÛT‘ÿ*ªo– act“as“a“repšGository“for“sp˜eci c“design“and“implemen¸ãtation“information“not“appropriate“toŽ¡‘C­ÛbGe–UUincluded“in“program“commen¸ãts.ŽŸ‘6æ½2.ŽŽŽ‘C­ÛT‘ÿ*ªo–UUguide“those“in¸ãterested“in“moGdifying“the“program.Ž¦‘*­ÛAs–úa“result,‘ @this“doGcumenš¸ãt“has“gro˜wn“in“ ts“and“starts.‘[©This“man˜ual“is“not“a“particularly“pGolishedŽ¡‘*­Ûor–½wš¸ãell-balanced“doGcumen˜t“but“it“should“bGe“of“assistance“to“those“(including“m˜yself‘Ç)“in˜v˜olv˜ed“withŽ¡‘*­ÛmoGdifying‘UUF–ÿ*ªunnelW“eb.ŽŸ‘*­ÛÉRoss–ÕTN.“WilliamsŽ¡‘*­ÛAdelaide,‘ÕTAustraliaŽ¡‘*­ÛMa®9y‘ÕT1992ŽŽŸK’ý“%Ä5ŽŽŒ‹H Ä)< ý;ÖÄ ªÝ»ŸK’ý“%Ä6ŽŽŒ‹L´ Ä)< ý;ÖÄ ªÝ» ýµ"E‘*­ÛëHAc–ÿ4‰kno“wledgemen“tsŽŸ;Vx‘*­ÛÄManš¸ãy–/thanks“to“ÉDa®9vid‘œHulse“Ä(óßê<Çye‘ÿ}'arÅ>É]Ä.‘eYAll–0 references“cited“in“the“text“appGear“in“the“reference“list“and“the“index.Ž¤‘*­ÛÉSpQÇecial‘&€terms:‘%ÄÄNew–½Oor“impšGortan¸ãt“terminology“has“b˜een“set“in“b˜old“face“and“app˜ears“in“the“index.Ž¡‘*­ÛÉT®9ypQÇesetting:‘>LÄThis– »˜doGcumenš¸ãt“w˜as“prepared“b˜y“the“author“using“Andrew“T‘ÿ*ªrev˜or-Ž¦‘*­Ûroš¸ãw's–ú(Êakt150@cscgpo.anu.edu.auÄ)“implemen˜tation“(OzT‘ÿ*ªeX)‘of“the“T‘þU>Ÿ'EŽ–ãxX/L‘üffŸþµUóIŒ-ø cmcsc10ëIaŽ‘‹ÄT‘þU>ŸŒEŽ“XÉ[Kn®9uth84]Ž¦‘*­Û[LampQÇort86]–UUÄtš¸ãypGesetting“system“running“on“a“Macin˜tosh-SE.Ž¡‘*­ÛÉGraphics:‘!7ÄAll–´5diagrams“ha•¸ãv“e–´5bGeen“constructed“out“of“text“using“the“L‘üffŸþµUëIaŽ‘‹ÄT‘þU>ŸŒEŽ‘ãxX‘´ Êverbatim“Äen•¸ãvironmen“tŽ¦‘*­Ûso–÷as“to“alloš¸ãw“this“doGcumen˜t“to“bGe“disseminated“electronically“and“prin˜ted“using“L‘üffŸþµUëIaŽ‘‹ÄT‘þU>ŸŒEŽ‘ãxX‘öØwithoutŽ¦‘*­Ûaccess–UUto“the“author's“dra¸ãwing“toGols.Ž¡‘*­ÛÉKno•®9wn›)ât“ypQÇesetting˜problems:‘'<ÄWhile–À?evš¸ãery“attempt“has“bGeen“made“to“giv˜e“a“go•Go“d‘À?presen˜tationŽ¦‘*­Ûwithin–üthe“time“aš¸ãv‘ÿqÇailable,‘ ãsome“shortcuts“ha˜v˜e“had“to“bGe“tak˜en.‘TIn“particular,‘ ãthe“author“has“bGeenŽ¦‘*­Ûunable–UUto“wš¸ãork“out“ho˜w“to“get“L‘üffŸþµUëIaŽ‘‹ÄT‘þU>ŸŒEŽ‘ãxX“to“suppress“blank“pages“at“the“start“of“c˜hapters.ŽŽŸK’ý“%9ŽŽŒ‹ T: Ä)< ý;ÖÄ ªÝ»ŸK’û%Ä10ŽŽŒ‹ Z Ä)< ý;ÖÄ ªÝ» ý°õm‘*­ÛóJò"V½p cmbx10ëJChapter‘óF1ŽŸ8Ó(‘*­ÛëHF–ýunnelW“eb‘ ‰‹DesignŽŸ:Ó(‘*­ÛÄThis–eücš¸ãhapter“con˜tains“notes“on“the“design“of“F–ÿ*ªunnelW“eb.‘£»These–eünotes“w˜ere“not“created“\fromŽ¤ ‘*­Ûscratcš¸ãh",‘åÃas–Èáthe“original“v˜ersion“of“F–ÿ*ªunnelW“eb›Èá(ÉF–ÿ «unnelW“eb‘Z4V1Ä)˜w¸ãas˜designed˜and˜constructedŽ¡‘*­Ûin–@Wa“hš¸ãurry“late“in“1986,‘DŠand“no“design“notes“w˜ere“ev˜er“recorded.‘jÈThese“notes“are“in“fact“the“resultŽ¡‘*­Ûof–„"a“complete“review“of“the“F–ÿ*ªunnelW“eb–„"design“that“tošGok“place“in“late“1991“as“part“of“the“pro˜cessŽ¡‘*­Ûof–UUupgrading“it“for“public“release.Ž©Ó(‘*­ÛThroughout–ûÚthe“design“proGcess“I‘ûÃtried“to“sticš¸ãk“to“the“principles“of“simplicit˜y“and“clarit˜y‘ÿ*ª.‘SôAs“a“rule,Ž¡‘*­Ûit–@4wš¸ãas“considered“more“impGortan˜t“that“a“feature“bGe“simple“and“not“allo˜w“the“user“to“outsmartŽ¡‘*­Ûhimself–æ8than“it“w¸ãas“for“the“feature“to“bGe“particularly“crisp.‘$oF›ÿ*ªor“example,‘ pthe“F˜unnelW˜eb“macroŽ¡‘*­Ûcalling–UUsynš¸ãtax“is“not“as“crisp“as“the“C“syn˜tax,“but“is“more“visible.Ž¦‘*­ÛT‘ÿ*ªo–¨»some“extenš¸ãt“the“design“review“w˜as“in uenced“b˜y“the“requiremen˜ts“of“bac˜kw˜ard“compatibilit˜y‘ÿ*ª.Ž¡‘*­ÛDuring–¼the“review“it“w¸ãas“hard“not“to“think“abGout“all“the“source“ les“in“F–ÿ*ªunnelW“eb–¼V1“format“thatŽ¡‘*­ÛI‘NÔha•¸ãv“e–NÖwritten“o•¸ãv“er–NÖthe“yš¸ãears“that“w˜ould“ha˜v˜e“to“bGe“con˜v˜erted“w˜ere“I‘NÔto“signi can˜tly“deviate“fromŽ¡‘*­Ûthe–´old“input“language.‘÷Lucš¸ãkily“it“turned“out“that“there“w˜as“little“clash“bGet˜w˜een“these“in˜terests,Ž¡‘*­Ûand–ßthe“resulting“design“is“bšGoth“clean“and“do˜es“not“require“m•¸ãuc“h›ßcon“v“ersion˜of˜old˜source˜ les.Ž¡‘*­ÛThe–î main“revision“is“in“the“doGcumenš¸ãt“structuring“facilit˜y–ÿ*ª.‘=§F“unnelW“eb–î V1“had“just“t˜w˜o“lev˜els“ofŽ¡‘*­Ûheading–//indicated“bš¸ãy“Ê@*@*“Ä(for“ma‘Ž8jor“headings)“and“Ê@*“Ä(for“minor“headings).‘eThis“sc˜heme“(whic˜hŽ¡‘*­Ûwš¸ãas–ÇUcopied“from“Kn˜uth's“W‘ÿ*ªeb)“has“bGeen“replaced“b˜y“a“hierarc˜hical“sc˜heme“of“ v˜e“heading“lev˜elsŽ¡‘*­Ûlev¸ãels‘UU(Ê@AÅ:–ª¨:“:Ž‘ ª§Ê@EÄ).Ž¦‘*­ÛThis–Jˆc¸ãhapter“is“rather“unstructured,›‡Õacting“as“it“has,˜mainly“as“a“dumping“ground“for“randomŽ¡‘*­Ûideas–UUabGout“F–ÿ*ªunnelW“eb.ŽŸ)«‘*­Ûó7ò"Vff cmbx10â1.1Ž‘PfMotiv‘ÿ{ation–…for“F–þž¸unnelW“ebŽŸ-‘*­ÛÄDuring–ç1986,‘ |I‘æèwš¸ãas“expGosed“to“Donald“Kn˜uth's“ÊWEB‘æèÄliterate“programming“system“in“the“form“ofŽ¡‘*­ÛJon– @Ben¸ãtley's“ÇPr–ÿ}'o“gr“amming›<0Pe“arls– @Äcolumn“in“ÇCommunic‘ÿ}'ations˜of˜the˜A¾“CM‘£ŽÉ[Ben®9tley86]Ä.Ÿü^ÿóÙ“ Rcmr7³1ŽŽ‘ ûÄThisŽ¡‘*­Ûprompted–*me“to“obtain“a“cop¸ãy“of“the“repGort“on“the“W‘ÿ*ªeb“systemÉ[Kn®9uth83]“Äand“to“try“out“theŽ¡‘*­Ûprogram–UUwhic¸ãh“had“bšGeen“installed“on“the“lo˜cal“V‘ÿ*ªaxen.Ž¦‘*­ÛW‘ÿ*ªeb–Lmw¸ãas“the“bšGest“system“that“I‘Ljhad“seen“for“pro˜ducing“prin¸ãted“and“online,‘N5inline“do˜cumen¸ãtation.Ž¡‘*­ÛT‘ÿ*ªo–]me“the“most“extraordinary“aspGect“of“the“system“w¸ãas“its“success“despite“the“fact“that“it“hadŽ¡‘*­ÛbGeen–built“inš¸ãto“the“horribly“an˜tiquated“ le/batc˜h“proGcessing“systems“that“w˜e“all“kno˜w“and“lo˜v˜eŽ¡‘*­Û(and–ytuse).‘Þ$I‘ykhad“imagined“sophisticated“došGcumen¸ãtation“systems“b˜efore“this“time,‘‚|but“had“alw•¸ãa“ysŽ¡‘*­Ûassumed–Cthat“they“wš¸ãould“bGe“parts“of“complex“programming“en˜vironmen˜ts.‘x’Kn˜uth“sho˜w˜ed“that,Ž¡‘*­Ûto–¾Ûsome“extenš¸ãt,‘Ù=it“can“bGe“done“using“1960s“soft˜w˜are“tec˜hnology“(excluding“the“1980s“t˜ypGesettingŽ¡‘*­Ûtec•¸ãhnology).‘qÇThis›UUw“as˜exciting.Ž‘*­ÛŸ Œ·‰ffª¶ÄŸ J=‘ "5Ÿý-:ó¹Aa¨cmr6¯1ŽŽ‘LÜó |{Ycmr8¸As–gCit“happŸ'EŽ‘ãxX‘kwdoGcumen˜t“ leŽ¡‘*­Ûgenerator.‘mdThis–H,compromise“has“found“its“w•¸ãa“y›H,in“to˜F–ÿ*ªunnelW“eb˜V3.0˜whic•¸ãh˜is˜still˜relian“t˜on˜T‘þU>Ÿ'EŽ‘ãxX,Ž¡‘*­Ûalthough–V3.0“at“least“encourages“input“ les“to“bšGe“t¸ãyp˜esetter“indep˜enden¸ãt.‘\…It“is“hop˜ed“that“futureŽ¡‘*­Ûvš¸ãersions–UUof“F–ÿ*ªunnelW“eb–UUwill“include“more“sophisticated“t˜ypGesetting“facilities.ŽŸ& ‘*­Ûâ1.2Ž‘PfIndenŠ=tationŽŸ0ב*­ÛÄA‘ìmacro–ìœcall“that“došGes“not“app˜ear“at“the“left“margin“is“called“an“Éinden®9ted–\æmacro“call–ìœÄand“seemsŽ¡‘*­Ûto–ºZlead“to“three“di erenš¸ãt“alternativ˜es“for“its“expansion:‘$IÉno–#indenš®9tationÄ,‘ÙYÉblank“inden˜tationÄ,‘ÙYandŽ¡‘*­ÛÉtext‘ÕTinden®9tationÄ.‘qÇHere–UUare“examples“of“eacš¸ãh“kind“of“inden˜tation.‘qÇFirst“the“example“problem.Ž¦‘*­ÛÊ@$@==@{@-Ž¡‘*­ÛAardvarkŽ¡‘*­ÛWalrus@}ŽŸ‘*­Û@O@==@{@-Ž¡‘*­ÛZebra@Ž¡‘*­ÛGiraffeŽ¡‘*­Û@}Ž¦‘*­ÛÄThere–UUare“three“w•¸ãa“ys–UUthat“the“second“line“of“the“ÊSloth“Ämacro“can“bGe“inden¸ãted.ŽŸI¼‘*­ÛÉNo‘ÕTinden®9tation:ŽŽŸK’û%Ä12ŽŽŒ‹ j> Ä)< ý;ÖÄ ªÝ» ý_"E‘DíÌÊZebraAardvarkŽ¤ ‘DíÌWalrusŽ¡‘DíÌGiraffeŽ¤¡B‘*­ÛÉBlank‘ÕTinden®9tation:Ž¡‘DíÌÊZebraAardvarkŽ¤ ‘_-½WalrusŽ¡‘DíÌGiraffeŽ¤¡B‘*­ÛÉT‘ÿ «ext‘ÕTinden®9tation:Ž¡‘DíÌÊZebraAardvarkŽ¤ ‘DíÌZebraWalrusŽ¡‘DíÌGiraffeŽŸ¡B‘*­ÛÄNo–Ù¶inden¸ãtation“is“useful“where“the“user“wishes“to“deal“with“the“output“stream“as“a“pure“outputŽ¡‘*­Ûstream.‘=ÉBlank–¹Xindenš¸ãtation“is“useful“when“the“user“wishes“to“generate“inden˜ted“computer“programs.Ž¡‘*­ÛT‘ÿ*ªext–…üindenš¸ãtation“is“useful“where“the“user“wishes“to“pre x“eac˜h“line“of“an“en˜tire“macro“in˜v˜oGcationŽ¡‘*­Ûwith–Iga“string.‘xThis“can“bšGe“useful“for“commen¸ãting“out“co˜de“(e.g.“in“Ada“using“Ê--Ä),‘~þand“for“prep˜endingŽ¡‘*­Ûthings–UUlikš¸ãe“a“dollar“sign“at“the“start“of“eac˜h“line“an“a“V‘þãAX“VMS“DCL“script“command“ le.Ž©P¡‘*­ÛF–ÿ*ªunnelW“eb–SV1“proš¸ãvided“a“c˜hoice“of“no“inden˜tation“or“blank“inden˜tation.‘qThe“c˜hoice“w˜as“made“inŽ¡‘*­Ûthe–UUcommand“line“and“could“not“bGe“o•¸ãv“erridden.Ž¦‘*­ÛThe–UUdesign“questions“are“as“follo¸ãws:Ž©É“‘6æ½1.ŽŽŽ‘C­ÛWhicš¸ãh–UUof“the“three“kinds“of“inden˜tation“should“F–ÿ*ªunnelW“eb‘UUsuppGort?Ž¤¡B‘6æ½2.ŽŽŽ‘C­ÛWhat–UUshould“bšGe“the“gran•¸ãularit“y–UUof“sw¸ãapping“b˜et•¸ãw“een›UUinden“tation˜moGdes?Ž¡‘6æ½3.ŽŽŽ‘C­ÛAre–UUparticular“inden¸ãtation“moGdes“dangerous?Ž¡‘6æ½4.ŽŽŽ‘C­ÛIs–UUthe“presence“of“particular“comš¸ãbinations“of“inden˜tation“moGdes“confusing“to“the“user?Ž¡‘6æ½5.ŽŽŽ‘C­ÛHoš¸ãw–UUand“when“should“the“c˜hoice“of“inden˜tation“bšGe“sp˜eci ed?Ž¦‘*­ÛAll–(Ésorts“of“scš¸ãhemes“w˜ere“considered,‘]¦including“a“ nely“grained“system“in“whic˜h“the“user“couldŽ¤ ‘*­ÛspšGecify–Þat“the“p˜oinš¸ãt“of“call“whic˜h“inden˜tation“mošGde“should“b˜e“used“for“the“called“macro“expansion.ŽŸP¡‘*­ÛAfter–@üa“lot“of“thoughš¸ãt,‘xAthe“dominan˜t“factor“that“should“a ect“the“design“w˜as“decided“to“bGe“the“ÇclarityŽ¡‘*­ÛÄin–SØthe“user's“mind“of“the“indenš¸ãtation“facilit˜y“and“the“Çdanger“ÄassoGciated“with“misunderstanding“it.Ž¡‘*­ÛHere–„are“t•¸ãw“o–„examples“that“shoš¸ãw“ho˜w“easily“a“confusion“or“misunderstanding“of“the“inden˜ting“bGeingŽ¡‘*­Ûused–UUcan“cause“danger.‘qÇThe“ rst“example“shoš¸ãws“ho˜w“blank“or“no“inden˜tation“migh˜t“bGe“misused.Ž¦‘*­ÛÊ--Misuse–?ýof“blank“(and“no)“indentation.Ž¡‘*­Û--@Ž¦‘*­ÛÄHere–WQthe“user“has“assumed“that“text“indenš¸ãtation“is“in“action“and“has“placed“an“Ada“commen˜tŽ¡‘*­Ûsym¸ãbšGol–4\Ê--Ä"“b˜efore“the“in•¸ãv“o˜cation–4of“the“macro“Ê@“Äin“the“hop˜e“that“the“en¸ãtire“text“of“theŽ¡‘*­Ûmacro–±`wš¸ãould“bGe“pre xed“b˜y“\Ê--Ä".‘; The“result“could“bGe“passed“b˜y“the“compiler“whic˜h“w˜ould“activ‘ÿqÇateŽ¡‘*­Ûall–UUbut“the“ rst“statemen¸ãt“in“the“expansion“of“macro“Ê@Ä.ŽŸP¡‘*­ÛThe–UUnext“example“demonstrates“hoš¸ãw“text“inden˜tation“could“bGe“misused.Ž¦‘*­ÛÊ--Misuse–?ýof“text“indentation:Ž¡‘*­Ûa++;‘?ý@ŽŽŸK’û%Ä13ŽŽŒ‹y Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÄHere–YBthe“user“has“placed“the“call“to“Ê@“Äafter“the“incremen¸ãting“of“v‘ÿqÇariable“ÊaÄ.‘}The“result“isŽ¤ ‘*­Ûthat– +there“is“a“go•Go“d– +cš¸ãhance“that“the“\Êa++;Ä"‘"ŽprepGended“to“eac˜h“line“of“the“expansion“of“Ê@Ž¡‘*­ÛÄwill–UUbšGe“passed“b¸ãy“the“compiler“and“will“cause“Êa“Äto“b˜e“o•¸ãv“erincremen“ted.Ž©#»‘*­ÛThese–‡¾examples“are“not“to“bšGe“laughed“at.‘ It“is“p˜ossible“that“F–ÿ*ªunnelW“eb–‡¾will“b˜e“used“widely‘ÿ*ª,‘”XandŽ¡‘*­Ûthe–o'problems“abGo•¸ãv“e›o'ma“y˜cause˜problems˜in˜critical˜systems.‘¿==@{@-Ž¡‘*­ÛOpen–?ýthe“doorŽ¡‘*­ÛSay‘?ýoutŽ¡‘*­ÛClose–?ýthe“door@}ŽŽŸK’û%Ä14ŽŽŒ‹…C Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÄThis–ÇFis“messy‘ÿ*ª,‘ãÂbut“I‘Ç(couldn't“think“of“an¸ãything“bGetter“at“the“time.‘Ç™The“Ê@$“Äis“necessary“to“cue“aŽ¤ ‘*­Ûde nition.‘:5Without–˜$it,‘¨Øthe“de nition“mighš¸ãt“someho˜w“bGe“mistak˜en“for“an“in˜v˜oGcation.‘:5The“Ê@<“ÄandŽ¡‘*­ÛÊ@>–¨Ädelimit“the“name.›_The“Ê@Æf“Äand“Ê@Æg“Ädelimit“the“text.˜The“Ê@-“Äis“a“proGduct“of“the“rule“\exactly“theŽ¡‘*­Ûtext›UUbGet•¸ãw“een˜the˜Ê@Æf˜Äand˜Ê@ÆgÄ".ŽŸ¶è‘*­ÛThe–Lnonly“real“target“is“the“\Ê+=Ä"“and“\Ê==Ä"“whicš¸ãh“really“break“all“the“rules“and“should“bGe“c˜hanged.Ž¡‘*­ÛUnfortunately–låI‘lÞcouldn't“think“of“anš¸ãything“to“c˜hange“them“to.‘¸vIf“there“w˜as“no“Ê+=“Ämec˜hanism,‘rÈw˜eŽ¡‘*­Ûcould‘UUuse:Ž©€-‘*­ÛÊ@$@@{Ž¡‘*­ÛOpen–?ýthe“doorŽ¡‘*­ÛSay‘?ýoutŽ¡‘*­ÛClose–?ýthe“door@}Ž¦‘*­ÛÄIn–?ðfact,‘D7eliminating“Ê+=“Äis“think‘ÿqÇable“bšGecause“it“do˜es“not“app˜ear“in“manš¸ãy“of“m˜y“existing“F–ÿ*ªunnelW“ebŽ¡‘*­Ûsource–UU les.‘qÇThis“indicates“at“least“that“it“wš¸ãas“not“needed“m˜uc˜h“b˜y“m˜yself.ŽŸ¶è‘*­ÛA–UUminimalist“construct“could“bGeŽ¦‘*­ÛÊ@Ž¡‘*­ÛOpen–?ýthe“doorŽ¡‘*­ÛSay‘?ýoutŽ¡‘*­ÛClose–?ýthe“door@}Ž¦‘*­ÛÄbut–UUthis“is“toGo“dangerous“for“m¸ãy“tastes.ŽŸ¶è‘*­ÛÉDecision:‘ŒÄF‘ÿ*ªor–¤ßcompatibilit¸ãy“reasons,›È*retain“the“old“Ê+=“Äand“Ê==“Äconstructs,˜but“mak¸ãe“them“optional.Ž¡‘*­ÛThe–UUnew“syn¸ãtax“for“de ning“macros“is:Ž¦‘*­ÛÊ@$@@{Ž¡‘*­ÛOpen–?ýthe“doorŽ¡‘*­ÛSay‘?ýoutŽ¡‘*­ÛClose–?ýthe“door@}Ž¦‘*­ÛÄNext–©Ÿwš¸ãe“turn“to“parameterized“macro“de nitions.‘8‹A‘©tcon˜v˜en˜tional“F–ÿ*ªunnelW“eb–©Ÿparameterized“macroŽ¡‘*­Ûde nition–UUloGoks“lik¸ãe“this:Ž¦‘*­ÛÊ@$@@(@3@)==@{@-Ž¡‘*­ÛOpen–?ýthe“doorŽ¡‘*­ÛSay‘?ýoutŽ¡‘*­ÛClose–?ýthe“door@}Ž¦‘*­ÛÄwhicš¸ãh–UUis“a“bit“messy‘ÿ*ª.‘qÇThe“natural“alternativ˜e“is“ev˜en“w˜orse:Ž¦‘*­ÛÊ@$@@(@1@,@2@,@3@)==@{@-Ž¡‘*­ÛOpen–?ýthe“doorŽ¡‘*­ÛSay‘?ýoutŽ¡‘*­ÛClose–?ýthe“door@}Ž¦‘*­ÛÄThš¸ãus,‘âªjust–ÅÿspGecifying“the“n˜um˜bGer“of“parameters“seems“sensible.‘BHo˜w˜ev˜er,‘âªpGerhaps“the“syn˜tax“couldŽ¡‘*­ÛbGe–UUtrimmed“toŽ¦‘*­ÛÊ@$@@3==@{@-Ž¡‘*­ÛOpen–?ýthe“doorŽ¡‘*­ÛSay‘?ýoutŽ¡‘*­ÛClose–?ýthe“door@}Ž¦‘*­ÛÄI–UUdecided“to“reject“this“in“fa•¸ãv“our–UUof“the“old“syn¸ãtax.ŽŸ¶è‘*­ÛÉDecision:‘qÇÄRetain–UUthe“old“syn¸ãtax“of“Å:–ª¨:“:Ž‘ÿüÊ@(@3@)Å:–ª¨:“:ŽŽŽŸK’û%Ä15ŽŽŒ‹–B Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÛ1.3.2Ž‘SíÛReview–€of“Macro“Call“Syn taxŽŸqA‘*­ÛÄHere–UUare“some“ideas“for“alternativš¸ães“to“the“F–ÿ*ªunnelW“eb–UUV1“macro“call“syn˜tax.ŽŸ¸C‘*­ÛÊOpen–?ýthe“doorŽ¤ ‘*­Û@‘/?å@!“FunnelWeb~V1“style.Ž¡‘*­ÛClose–?ýthe“doorŽ©‘*­ÛOpen–?ýthe“doorŽ¡‘*­Û@@Ž¡‘*­ÛClose–?ýthe“doorŽ¦‘*­ÛOpen–?ýthe“doorŽ¡‘*­Û@"Say‘?ýout@"Ž¡‘*­ÛClose–?ýthe“doorŽ¦‘*­ÛOpen–?ýthe“doorŽ¡‘*­Û@(Say‘?ýout@)Ž¡‘*­ÛClose–?ýthe“doorŽ¦‘*­ÛOpen–?ýthe“doorŽ¡‘*­Û@Ž¡‘*­ÛClose–?ýthe“doorŽ©¸C‘*­ÛÉDecision:‘xfÄCon•¸ãtin“ue–ؤwith“the“old“notation.‘ûµIt“ma¸ãy“not“bGe“neat,‘9xbut“at“least“it“is“clear“andŽ¡‘*­Ûconsistenš¸ãt.‘ŽlThe–´7main“temptation“is“the“format“Ê@@“Äwhic˜h“lošGoks“rather“go˜o˜d.‘ŽlHo•¸ãw“ev“er,Ž¡‘*­Ûit–UUbreaks“the“spšGecial“sequence“rational“and“hence“is“to˜o“confusing.ŽŸ$)n‘*­ÛÛ1.3.3Ž‘SíÛReview–€of“Pš arameterized“Macro“Call“Syn˜taxŽŸqA‘*­ÛÄF–ÿ*ªunnelW“eb–UUV1“proš¸ãvided“a“messy“parameterized“macro“call“syn˜tax:Ž¦‘*­ÛÊ@@(@"firstparam@"“@,“@"Secondparam@"“@,“@"thirdparam@"“@)Ž¦‘*­ÛÄThis–Ò.synš¸ãtax“can“bGe“cleaned“up“considerably“b˜y“making“the“Ê@"“Äsym˜bGols“optional.‘èRThis“results“inŽ¡‘*­Ûcalls–UUsucš¸ãh“as“the“follo˜wing:Ž¦‘*­ÛÊ@@(firstparam@,Secondparam@,thirdparam@)Ž¦‘*­ÛÄAs–íAthe“ rst“form“alloš¸ãws“the“alignmen˜t“of“complicated“parameters“b˜y“allo˜wing“white“space“to“bGeŽ¡‘*­Ûinserted–Áµoutside“the“Ê@"Ä,›ÜÍand“the“second“form“is“cleaner,˜bGoth“are“retained“simply“b¸ãy“making“theŽ¡‘*­Ûquotes‘UUoptional.Ž©°‘*­ÛÉDecision:‘qÇÄMak¸ãe–UUthe“double“quotes“optional.ŽŸ)<ü‘*­Ûâ1.4Ž‘PfDouÂcumenŠ=t‘…StructuringŽŸã‘*­ÛÄExpGerience–¤with“F–ÿ*ªunnelW“eb–¤V1,‘Dwwhicš¸ãh“pro˜vided“only“t˜w˜o“lev˜els“of“headings“(ma‘Ž8jor“and“minor)Ž¡‘*­Ûpro•¸ãv“ed–jéthat“there“wš¸ãas“a“strong“need“for“fully“hierarc˜hical“m˜ultiple-lev˜el“headings.‘#¤The“only“questionŽ¡‘*­Ûw•¸ãas›UUho“w˜it˜should˜bGe˜done.Ž¦‘*­ÛHere–UUare“some“ideas“that“w¸ãere“considered.ŽŽŸK’û%16ŽŽŒ‹Ÿÿ Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÊ@*@Ž¤ ‘*­Û@**@Ž¡‘*­Û@***@Ž©‘*­Û@*@Ž¡‘*­Û@*@*@Ž¡‘*­Û@*@*@*@Ž¦‘*­Û@s@Ž¡‘*­Û@ss@Ž¡‘*­Û@sss@Ž¦‘*­Û@s@Ž¡‘*­Û@s@s@Ž¡‘*­Û@s@s@s@Ž¦‘*­Û@S@Ž¡‘*­Û@SS@Ž¡‘*­Û@SSS@Ž¦‘*­Û@S@Ž¡‘*­Û@S@S@Ž¡‘*­Û@S@S@S@Ž¦‘*­Û@A@‘9¿ß--“The“syntax“finally“chosen.Ž¡‘*­Û@B@Ž¡‘*­Û@C@Ž¦‘*­Û@A–?ýMain“ProgramŽ¡‘*­Û@B–?ýRead“the“MessageŽ¡‘*­Û@C–?ýEncrypt“the“BufferŽ¦‘*­Û@*A–?ýMain“ProgramŽ¡‘*­Û@*B–?ýRead“the“MessageŽ¡‘*­Û@*C–?ýEncrypt“the“BufferŽ¦‘*­Û@1@Ž¡‘*­Û@2@Ž¡‘*­Û@3@Ž¡‘*­Û(using–?ý@A..@I@“as“macro“parameters“or“overload“@1..@9)Ž¦‘*­Û@*@1@Ž¡‘*­Û@*@2@Ž¡‘*­Û@*@3@Ž¡‘*­Û(using–?ý@A..@I@“as“macro“parameters“or“overload“@1..@9)Ž©=˜‘*­ÛÄCho•Gosing›®÷b“et•¸ãw“een˜these˜alternativ“es˜w“as˜not˜easy‘ÿ*ª.‘~­The˜follo“wing˜though“ts˜con“tributed˜to˜theŽ¡‘*­Ûdecision.Ž¦‘9­ÚÆŽŽŽ‘C­ÛÄSynš¸ãtaxes–UUthat“require“visual“coun˜ting“are“probably“not“a“go•Go“d‘UUidea.Ž©1F‘9­ÚÆŽŽŽ‘C­ÛÄSynš¸ãtaxes–8that“do“not“delimit“the“heading“name“someho˜w“are“lik˜ely“to“cause“problems“whereŽ¡‘C­Ûheading–YŠnames“are“omitted.‘~eUsers“will“bGe“tempted“to“start“paragraphs“after“the“start“ofŽ¡‘C­Ûheading–výsym¸ãbšGol“and“the“result“is“that“the“ rst“line“of“the“paragraph“will“b˜e“suc•¸ãk“ed›výin“to˜theŽ¡‘C­Ûheading.Ž¦‘9­ÚÆŽŽŽ‘C­ÛÄOv¸ãerloading–UUthe“Ê@1Ä,“Å:–ª¨:“:Ž‘ÿüÄ,“Ê@9“Äsequences“is“undesirable.ŽŽŸK’û%17ŽŽŒ‹¨A Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÉDecision:‘‘¼ÄUse–åPÊ@AÅ:–ª¨:“:Ž‘ ª§Ê@E‘å+Äwith“optional“folloš¸ãwing“macro“name“syn˜tax“for“the“section“name.‘!·Note:Ž¤ ‘*­ÛW‘ÿ*ªe–˜1stop“at“Ê@E‘˜ ÄbGecause“ vš¸ãe“lev˜els“is“probably“sucien˜t,‘¨èand“w˜e“ma˜y“wish“later“to“use“Ê@F‘˜ Äfor“ÉFÄileŽ¡‘*­Û(to–UUaugmen¸ãt“or“replace“Ê@OÄ).ŽŸ+Nt‘*­Ûâ1.5Ž‘PfDiscussion–…of“Some“Miscellaneous“IssuesŽŸÓF‘*­ÛÉCommen®9t‘½¨duplication:‘ÓÄIf–[the“F–ÿ*ªunnelW“eb–[user“inserts“commenš¸ãts“in˜to“the“target“coGde“(in“theŽ¡‘*­ÛÊ.fw–åÄ le)“as“wš¸ãell“as“in˜to“the“doGcumen˜tation“(free“text)“part“of“the“Ê.fw“Ä le,‘ûŠthen“it“is“pGossible“for“theŽ¡‘*­Ûsituation–UUto“get“a“bit“silly›ÿ*ª.–qÇÉDecision:“ÄThis–UUis“a“problem“for“the“programmer,“not“for“F˜unnelW˜eb.Ž©X ‘*­ÛÉOut-of-date‘£¦doQÇcumen®9tation:‘Ø™ÄSometimes–¾it“is“all“tošGo“easy“for“the“programmer“to“mo˜dify“theŽ¡‘*­ÛcošGde–ø`without“up˜dating“the“surrounding“do˜cumen¸ãtation.‘ZéÉDecision:‘·ÝÄThis“is“a“serious“and“ma‘Ž8jorŽ¡‘*­Ûproblem.‘ϘIn–Ean“automated“en•¸ãvironmen“t,‘QÁit›Ema“y˜b•Ge˜p“ossible˜to˜create˜a˜system˜of˜dep“endenciesŽ¡‘*­ÛbšGet•¸ãw“een–°ascraps“of“co˜de“and“scraps“of“do˜cumen•¸ãtation.‘‚ëHo“w“ev“er,‘Ç$it–°ais“hard“to“see“ho¸ãw“a“to˜ol“suc¸ãhŽ¡‘*­Ûas›UUF–ÿ*ªunnelW“eb˜could˜pro•¸ãvide˜suppGort˜for˜prev“en“tion˜of˜this˜sort˜of˜error.Ž¦‘*­ÛÉMeta-macro-lev®9el‘xäparameterization:‘Ž<ÄSometimes,›when–ãusing“F–ÿ*ªunnelW“eb,˜the–ãfacilit¸ãy“to“useŽ¡‘*­Ûone–¥|macro“to“construct“the“name“of“another“has“bGeen“needed.‘7*ÉDecision:‘ÛÄAllo¸ãwing“macro“names“toŽ¡‘*­ÛbšGe–)ðconstructed“w¸ãould“lose“the“simple“nature“of“the“prepro˜cessor“and“so“this“suggestion“is“rejected.Ž¦‘*­ÛÉClumsy‘ú;notation:›±ôÄThe–ulÊ@“Änotation“can“bGe“clumsy‘ÿ*ª.‘Ò ÉDecision:˜ÄThis“is“necessary“to“main¸ãtain“theŽ¡‘*­Ûsimplicit¸ãy–UUof“the“translation.ŽŸ+Nt‘*­Ûâ1.6Ž‘PfAutomated–…Regression“T‘þž¸estingŽŸÓF‘*­ÛÄAutomated–UUregression“testing“is“extremely“impGortanš¸ãt“for“t˜w˜o“reasons:Ž¤\‘6æ½1.ŽŽŽ‘C­ÛIt–UUproš¸ãvides“con dence“that“c˜hanges“made“to“the“program“ha˜v˜e“not“in˜troGduced“bugs.ŽŸ°‘6æ½2.ŽŽŽ‘C­ÛIt–‹˜alloš¸ãws“pGortabilit˜y“problems“to“bšGe“pinp˜oinš¸ãted“when“the“program“is“mo˜v˜ed“to“a“new“mac˜hine.Ž¡‘*­ÛThe–esimplest“w•¸ãa“y–eto“set“up“automated“regression“testing“is“to“construct“a“suite“of“test“cases“(andŽ¤ ‘*­Ûtheir–©solutions)“and“then“write“a“script“in“the“target“mac¸ãhine's“command“language“to“run“throughŽ¡‘*­Ûthe–(suite.‘éÙUnfortunately‘ÿ*ª,‘\²there“is“no“command“language“that“is“shared“among“the“mac¸ãhines“toŽ¡‘*­Ûwhic¸ãh›“F–ÿ*ªunnelW“eb˜m¸ãust˜b•Ge˜p“orted.‘#‚These˜mac•¸ãhines˜are˜at˜least:‘èDMacin“tosh,–ŸcIBM-PC,˜Sun,“VMSŽ¡‘*­ÛV‘ÿ*ªax.Ž¦‘*­ÛOne–œ4option“is“simply“to“rewrite“the“script“in“eacš¸ãh“mac˜hine's“particular“command“language.‘FdThisŽ¡‘*­Ûwš¸ãould–ÍÿbGe“a“feasible“option“w˜ere“it“not“for“the“fact“that“the“Macin˜tosh“(the“mac˜hine“upGon“whic˜hŽ¡‘*­ÛF–ÿ*ªunnelW“eb–UUwš¸ãas“dev˜elopšGed)“do˜es“not“ha•¸ãv“e–UUa“command“language!Ž¦‘*­ÛAfter–ýêsome“thoughš¸ãt,‘fI‘ýÔdecided“that“the“bGest“solution“to“the“problem“w˜as“to“create“a“command“lan-Ž¡‘*­Ûguage›éLÇwithin‘0„F‘ÿ;¼unnelWebÄ.‘MÄF–ÿ*ªunnelW“eb˜could˜then˜bGe˜in•¸ãv“ok“ed˜in˜t“w“o˜moGdes,‘þèone-shot˜command˜lineŽ¡‘*­Ûor›x(in•¸ãteractiv“e/script.‘ÚAThis˜approac“h˜had˜the˜bGene t˜of˜pro“viding˜total˜con“trol˜o“v“er˜the˜commandŽ¡‘*­Ûlanguage–UUand“its“complete“pGortabilit¸ãy‘ÿ*ª.Ž¦‘*­ÛThe–UUresult“is“describGed“in“the“ÇF‘ÿ;¼unnelWeb–“çUser's“ManualÄ.ŽŸ+Nt‘*­Ûâ1.7Ž‘PfCommand–…Line“InŠ=terfaceŽŸÓF‘*­ÛÄF–ÿ*ªunnelW“eb–ï·V1“wš¸ãas“implemen˜ted“in“Ada“and“runs“on“a“VMS‘ïV‘þãAX.“As“suc˜h“it“has“a“full“VMS‘ïDCLŽ¡‘*­Ûcommand–UUline“inš¸ãterface.‘qÇHere“is“the“\Ê.CLDÄ"“ le“for“the“DCL“command“line“in˜terface.ŽŽŸK’û%18ŽŽŒ‹°  Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÊ!–?ýFUNNELWEB“Command“DefinitionŽ¤ ‘*­Û!‘?ý============================Ž¡‘*­Û!–?ýRoss“Williams.“28“April“1987.ŽŸ‘*­Ûmodule‘?ýcommand_tableŽ¡‘:mÒdefine–?ýverb“dummy_commandŽ¡‘:mÒparameter–?ýp1‘9¿ß,“label=input_file‘¿÷,value(required,type=$file)Ž¡‘:mÒqualifier–?ýinclude_files,“label=include_files,value(type=$file)“,defaultŽ¡‘:mÒqualifier–?ýoutput_files“,“label=output_files“,value(type=$file)“,defaultŽ¡‘:mÒqualifier–?ýdelete‘$¿ë,“label=delete’ˆ²,defaultŽ¡‘:mÒqualifier–?ýtex_file›?ñ,“label=tex_file˜,value(type=$file)“,defaultŽ¡‘:mÒqualifier–?ýlisting_file“,“label=listing_file“,value(type=$file)“,defaultŽ¡‘:mÒqualifier–?ýbrief‘)ÿè,“label=brief,value(type=$number,default=5),defaultŽ¡‘:mÒqualifier–?ýscreen›$¿ë,“label=screen˜,value(type=$number,default=0)Ž¡‘:mÒqualifier–?ýtrace‘)ÿè,“label=traceŽ¡‘:mÒqualifier–?ýfile_spec‘ÿô,“label=file_specŽ¡‘:mÒqualifier‘?ýcompareŽ©"fk‘*­ÛÄAs–ÆàpGortabilitš¸ãy“w˜as“a“k˜ey“goal“of“F–ÿ*ªunnelW“eb–ÆàV3,‘ãBit“w˜as“ob˜vious“that“the“command“line“in˜terfaceŽ¡‘*­Ûw•¸ãould›UUha“v“e˜to˜bGe˜redesigned.‘qÇThe˜design˜goals˜for˜the˜new˜command˜line˜in“terface˜w“ere:Ž¦‘6æ½1.ŽŽŽ‘C­ÛThe–v’inš¸ãterface“should“not“Çdep‘ÿ}'end“Äon“case.‘Õ}Ho˜w˜ev˜er,‘~áit“m˜ust“allo˜w“case-sensitiv˜e“ lenames“toŽ¡‘C­ÛbGe–UUtransmitted“on“systems“that“ha•¸ãv“e›UUcase-sensitiv“e˜ lenames.Ž©¼‘6æ½2.ŽŽŽ‘C­ÛEacš¸ãh–&option“m˜ust“ha˜v˜e“a“symmetric“pGositiv˜e“and“negativ˜e“form.‘\bF‘ÿ*ªor“example,‘!üit“is“confusingŽ¡‘C­Ûfor–UUÊ-X“Äto“turn“on“a“feature“and“Ê-Q“Äto“turn“it“o .Ž¦‘6æ½3.ŽŽŽ‘C­ÛThe–UUinš¸ãterface“m˜ust“bGe“extensible“to“allo˜w“inclusion“of“more“features“at“a“later“date.Ž¦‘6æ½4.ŽŽŽ‘C­ÛOptions–UUshould“bGe“consisten¸ãt“and“memorable.Ž©"fk‘*­ÛThe–UUresult“is“describGed“in“the“ÇF‘ÿ;¼unnelWeb–“çUser's“ManualÄ.ŽŸ/#ý‘*­Ûâ1.8Ž‘PfFile–…Name“ManagemenŠ=tŽŸ£‘*­ÛÄFile–ÕÁnames“presenš¸ãt“a“host“of“problems“for“a“program“lik˜e“F–ÿ*ªunnelW“eb.‘ó First,‘5ÛF“unnelW“eb‘ÕÁcanŽ¡‘*­Ûgenerate–“.so“manš¸ãy“di eren˜t“kinds“of“ les“that“con˜v˜en˜tions“m˜ust“bGe“adopted“to“prev˜en˜t“them“fromŽ¡‘*­ÛbGecoming–Y7unmanageable.‘½Second,›‹£the“constrain¸ãts“on“ le“names,˜and“ev¸ãen“the“structure“of“ le“namesŽ¡‘*­Ûthemselvš¸ães–º#v‘ÿqÇaries“considerably“from“mac˜hine“to“mac˜hine.‘ 2These“t˜w˜o“problems“ha˜v˜e“com˜bined“toŽ¡‘*­Ûresult–²in“the“sophisticated“and“rather“complicated“w•¸ãa“y–²in“whic¸ãh“F–ÿ*ªunnelW“eb–²V3“handles“ lenames.ŽŸ^‘*­ÛT‘ÿ*ªo–UUsummarize,“the“three“problems“are:Ž¦‘6æ½1.ŽŽŽ‘C­ÛWhat–UU lename“extensions“should“bGe“c¸ãhosen“for“v‘ÿqÇarious“kinds“of“ le?Ž¤¼‘6æ½2.ŽŽŽ‘C­ÛWhat–UU lename“inheritance“should“tak¸ãe“place?Ž¡‘6æ½3.ŽŽŽ‘C­ÛHo¸ãw–UUshould“F–ÿ*ªunnelW“eb–UUcopšGe“with“the“v‘ÿqÇariations“in“ lename“structure“b˜et•¸ãw“een‘UUmac“hines?Ž¦‘*­ÛThe–UUfollo¸ãwing“three“sections“address“these“questions.ŽŽŸK’û%19ŽŽŒ‹¿U Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÛ1.8.1Ž‘SíÛFilename‘€ExtensionsŽŸ‡7‘*­ÛÄF–ÿ*ªunnelW“eb–É…is“capable“of“reading“and“writing“a“v‘ÿqÇarietš¸ãy“of“di eren˜t“kinds“of“ les.‘C-In“particular,‘å{F‘ÿ*ªun-Ž¤ ‘*­ÛnelW‘ÿ*ªeb–¤?mš¸ãust“often“opGerates“in“an“en˜vironmen˜t“where“the“same“information“is“stored“in“man˜y“formsŽ¡‘*­Û(e.g.›îQprog.fw,–prog.c,“pro•Gc.exe).‘<»File˜extensions˜are˜an˜essen¸ãtial˜to“ol˜in˜managing˜this˜situation.Ž¡‘*­ÛThe–UU lename“extensions“c¸ãhosen“for“F–ÿ*ªunnelW“eb‘UUare:Ž©Þ¤‘*­ÛÊFunnelWeb‘?ñ:‘?ý.fwŽ¡‘*­ÛProduct‘$¿ë:‘?ýNone.Ž¡‘*­ÛDocumentation–?ý:“.texŽ¡‘*­ÛListing‘$¿ë:‘?ý.lisŽ¡‘*­ÛJournal‘$¿ë:‘?ý.jrnŽ¦‘*­ÛÄLo•¸ãw“ercase–UUwill“bGe“used“in“systems“that“are“case“sensitiv¸ãe.ŽŸ¿u‘*­ÛReaders–&Vwho“are“wš¸ãondering“ho˜w“F–ÿ*ªunnelW“eb–&VcopGes“in“en˜vironmen˜ts“suc˜h“as“UNIX‘&Jwhere“there“areŽ¡‘*­Ûno–UU le“extensions“should“refer“to“Section“1.8.3.ŽŸ$YÔ‘*­ÛÛ1.8.2Ž‘SíÛFilename‘€InheritanceŽŸ‡7‘*­ÛÄInheritance–òßin“ lenames“refers“to“ho¸ãw“input“and“output“ les“inherit“parts“of“their“name“from“otherŽ¡‘*­Û lenames–UUand“their“en•¸ãvironmen“t.‘qÇF‘ÿ*ªor–UUexample“if“the“commandŽ¦‘:mÒÊfw–?ýsloth“+J“+L“+TŽ¦‘*­ÛÄw•¸ãas›`gissued,‘£+y“ou˜w“ould˜expGect˜to˜see˜output˜ les˜Êsloth.jrnÄ,–£+Êsloth.lisÄ,“and˜Êsloth.texÄ.‘’ýTheŽ¡‘*­Ûoutput–bn le“names“ha•¸ãv“e–bninherited“the“\ÊslothÄ".‘™The“folloš¸ãwing“table“giv˜es“the“hierarc˜h˜y“devised“forŽ¡‘*­ÛF–ÿ*ªunnelW“eb.ŽŸ9ø=‘XHxŸÙL͉ffO•\¤fdÌÍŸ™œ„ ff‘™›„ ffŽ‘Script‘ ©1Ÿ™œ„ ffŽ‘Aÿ÷Input‘ °Ÿ™œ„ ffŽ‘ic‰Include‘ÌÍŸ™œ„ ffŽ’•UTJournal‘ÌÍŸ™œ„ ffŽ’ÂG!List‘ðOŸ™œ„ ffŽ’íGDoGcumen¸ãt‘ÌÍŸ™œ„ ffŽ’&#ProGduct‘ÌÍŸ™œ„ ffŽŽ©‰ffO•\¡Ìͤ™œ„ ff–ÌÍŸüfd1“¡„ ffŽ‘;ÌÄŸ™œ„ ffŽ‘c0VŸ™œ„ ffŽ‘ic‰Ê@i‘>žŸ™œ„ ffŽ’¼îŸ™œ„ ffŽ’ç䟙œ„ ffŽ’ð\Ÿ™œ„ ffŽ’&#@o‘¾ Ÿ™œ„ ffŽŽ¤ Ìͤ™œ„ ff–ÌÍŸüfdÄ2“¡„ ffŽ‘Ê+x‘LÉŸ™œ„ ffŽ‘Aÿ÷+f‘°eŸ™œ„ ffŽ‘ic‰+i‘>žŸ™œ„ ffŽ’•UT+j‘> Ÿ™œ„ ffŽ’ÂG!+l‘LÉŸ™œ„ ffŽ’íG+t‘()KŸ™œ„ ffŽ’&#+o‘¾ Ÿ™œ„ ffŽŽ¡Ìͤ™œ„ ff–ÌÍŸüfdÄ3“¡„ ffŽ‘\Ê.fwsÄ"‘ÌÍŸ™œ„ ffŽ‘Aÿ÷\Ê.fwÄ"‘pfŸ™œ„ ffŽ‘ic‰\Ê.fwiÄ"‘¾¢Ÿ™œ„ ffŽ’•UT\Ê.jrnÄ"‘¾¤Ÿ™œ„ ffŽ’ÂG!\Ê.lisÄ"‘ÌÍŸ™œ„ ffŽ’íG\Ê.texÄ"‘©OŸ™œ„ ffŽ’Ob)Ÿ™œ„ ffŽŽ¡Ìͤ™œ„ ff–ÌÍŸüfd4“¡„ ffŽ‘;ÌÄŸ™œ„ ffŽ‘c0VŸ™œ„ ffŽ‘ic‰Ê+f‘>žŸ™œ„ ffŽ’•UT+f‘> Ÿ™œ„ ffŽ’ÂG!+f‘LÉŸ™œ„ ffŽ’íG+f‘()KŸ™œ„ ffŽ’Ob)Ÿ™œ„ ffŽŽ¡Ìͤ™œ„ ff–ÌÍŸüfdÄ5“¡„ ffŽ‘DefDir‘SÜŸ™œ„ ffŽ‘Aÿ÷Defdir‘ÌÍŸ™œ„ ffŽ‘ic‰Defdir‘ [Ÿ™œ„ ffŽ’•UTDefdir‘ [Ÿ™œ„ ffŽ’ÂG!Defdir‘ i1Ÿ™œ„ ffŽ’íGDefdir‘E³Ÿ™œ„ ffŽ’&#Defdir‘ ÛŸ™œ„ ffŽŽ¦‰ffO•\ŽŽŽŸ;ê‘*­ÛThe–UUfollo¸ãwing“notes“explain“the“table.Ž¦‘6æ½1.ŽŽŽ‘C­ÛThis–UUsc¸ãheme“is“similar“to“that“used“in“F–ÿ*ªunnelW“eb‘UUV1.Ž©~ê‘6æ½2.ŽŽŽ‘C­ÛThe›MGjournal,–Nãlist,“and˜do•Gcumen¸ãtation˜ les˜all˜fall˜in˜the˜same˜pattern˜and˜can˜b“e˜consideredŽ¡‘C­Ûas–UUa“single“case.Ž¦‘6æ½3.ŽŽŽ‘C­ÛLevš¸ãel–²Ï1“has“the“highest“priorit˜y“bšGecause“it“is“a“direct“sp˜eci cation“b¸ãy“the“user“in“the“inputŽ¡‘C­Û le.Ž¦‘6æ½4.ŽŽŽ‘C­ÛLev¸ãel–MŠ2“comes“next“bšGecause“this“is“also“a“direct“sp˜eci cation“from“the“user“on“the“commandŽ¡‘C­Ûline.Ž¦‘6æ½5.ŽŽŽ‘C­ÛLevš¸ãel–’3“pro˜vides“the“default“ le“extensions.‘\1ProGduct“ les“do“not“inherit“an“extension“as“theyŽ¡‘C­Ûcould–UUbGe“of“anš¸ãy“t˜ypGe.Ž¦‘6æ½6.ŽŽŽ‘C­ÛLevš¸ãel–üÄ5“is“built“in˜to“most“opšGerating“systems'“ le“sp˜eci cation“systems.‘TAIf“I‘ü­sp˜ecify“ le“\Êx.yÄ",Ž¡‘C­Ûit–UUis“tak¸ãen“to“mean“on“the“default“disk“in“the“default“directory‘ÿ*ª.ŽŽŸK’û%20ŽŽŒ‹Êý Ä)< ý;ÖÄ ªÝ» ý_"E‘6æ½Ä7.ŽŽŽ‘C­ÛLevš¸ãel–¨4“loGoks“straigh˜tforw˜ard,‘½[but“secretly“conceals“a“dicult“design“decision.‘knBy“the“timeŽ¤ ‘C­Ûwš¸ãe–s»get“do˜wn“to“this“lev˜el“of“inheritance,‘»Tw˜e“kno˜w“for“sure“that“the“ lename“has“alreadyŽ¡‘C­Ûpic•¸ãk“ed–Œœup“a“ le“extension.‘›So“all“that“is“left“to“inherit“is“the“path“and“the“ lename“propGer.Ž¡‘C­ÛOb•¸ãviously›^½w“e˜ha“v“e˜to˜inherit˜the˜ lename˜propGer˜(e.g.‘þÊsloth˜Äin˜Êsloth.texÄ),‘abut˜should˜w“eŽ¡‘C­Ûinherit–—the“input“ le“path?‘‹If“w¸ãe“do“inherit“the“input“ le“path,‘5g les“will“bGe“placed“in“theŽ¡‘C­Ûsame–Æ,directory“as“the“input“ le.‘ÄMIf“w¸ãe“don't“inherit“the“input“ le“path,‘âb les“will“bGe“placedŽ¡‘C­Ûin–:sthe“currenš¸ãt“directory‘ÿ*ª.‘hÑThe“c˜hoice“I‘:lha˜v˜e“made“is“to“send“all“the“logging“t˜ypGe“ les“in˜to“theŽ¡‘C­Ûsame–±Çdirectory“as“the“input“ le.‘‡This“means,›Èãfor“example,˜that“Êsloth.lis“Äand“Êsloth.texŽ¡‘C­ÛÄwill–RXgenerally“land“in“the“same“directory“as“Êsloth.fwÄ.‘pÈHo•¸ãw“ev“er,‘RñI‘RWha“v“e–RXdecided“that“outputŽ¡‘C­Û les–¸ªshould“bšGe“sen¸ãt“to“the“default“directory“(if“not“earlier“sp˜eci ed)“as“this“is“where“the“actionŽ¡‘C­Ûis.‘ÅhIn–q5normal“use,‘x.the“main“prošGduct“of“F–ÿ*ªunnelW“eb–q5will“b˜e“pro˜duct“ les“and“so“the“user“willŽ¡‘C­ÛexpšGect–UUthem“to“app˜ear“in“the“currenš¸ãt“directory“b˜y“default.ŽŸ(w&‘*­ÛÛ1.8.3Ž‘SíÛP ortable–€Structure“of“File“NamesŽŸe&‘*­ÛÄAnother–Ôšproblem“with“ le“names“is“the“v‘ÿqÇariation“of“their“structure“bGet•¸ãw“een‘Ôšen“vironmen“ts.‘ï—HereŽ¡‘*­Ûare–UUexamples“of“some“of“the“formats“that“prev‘ÿqÇail:Ž©!!à‘:mÒÊUNIX‘¿÷/device/dir1/dir2/nameŽ¡‘:mÒVMS‘ÿônode::device:[dir1.dir2]name.ext;vnŽ¡‘:mÒMSDOS‘ údevice:\dir1\dir2\name.extŽ¡‘:mÒMAC‘ÿôdevice:dir1:dir2:nameŽ¦‘*­ÛÄIsn't–UUit“amazing“that“none“of“these“pGopular“systems“use“the“same“format?Ž© ‘*­ÛThe–·¯solution“to“dealing“with“these“di eren¸ãt“formats“is“to“classify“them“as“non-pGortable“and“hideŽ¡‘*­Ûthe–—functions“that“manipulate“them“in“the“mac¸ãhine-spšGeci c“mo˜dule“of“F–ÿ*ªunnelW“eb.‘7 Luc¸ãkily‘—thereŽ¡‘*­Ûare–UUnot“manš¸ãy“suc˜h“functions.Ž¦‘*­ÛThe–Xßmain“problem“is“coping“with“ le“systems“that“do“not“explicitly“suppGort“ le“extensions.‘|dWithŽ¡‘*­Ûso–Eámanš¸ãy“pGossible“input“and“output“ les,‘HøF–ÿ*ªunnelW“eb–Eáall“but“needs“suc˜h“extensions.‘l Mac˜hines“thatŽ¡‘*­Ûdo–˜Inot“suppšGort“them“p˜ose“dicult“design“decisions.‘:¢If“the“user“sp˜eci es“\ÊslothÄ"“as“an“input“ leŽ¡‘*­Ûon–ØÈsuc¸ãh“a“non-extension-suppšGorting“system,‘ñ±should“F–ÿ*ªunnelW“eb–ØÈlo˜ok“for“Êsloth“Äor“Êsloth.fwÄ?‘HCIf“theŽ¡‘*­Ûuser–UUspGeci es“Êwalrus“Äas“a“listing“ le,“should“it“generate“Êwalrus“Äor“Êwalrus.lisÄ?Ž¦‘*­ÛSome–UUpGossible“solutions“are:ŽŸ!!à‘6æ½1.ŽŽŽ‘C­ÛRegard–UUthe“ lename“Êsloth“Äas“haš¸ãving“an“empt˜y“extension.‘qÇIt“will“then“default“to“Êsloth.fwÄ.Ž©‘6æ½2.ŽŽŽ‘C­ÛRegard–Ó¬the“ lename“Êsloth“Äas“ha¸ãving“a“blank“but“full“extension.‘ìÌThat“is,‘3Ait“cannot“bGeŽ¡‘C­Ûo•¸ãv“erwritten›UUb“y˜inheritance,˜but˜it˜remains˜blank.Ž¦‘6æ½3.ŽŽŽ‘C­ÛProš¸ãvide–áüan“extra“syn˜tactic“mec˜hanism“to“allo˜w“the“user“to“spGecify“one“or“other“of“the“t˜w˜oŽ¡‘C­Ûoptions‘UUabGo•¸ãv“e.ŽŸ!!à‘*­ÛMy–}ísolution“wš¸ãas“to“c˜hoGose“the“ rst“option.‘ëUse“of“F–ÿ*ªunnelW“eb–}íresults“in“lots“of“ les“lying“aroundŽ¡‘*­Û(e.g.–xRÊsloth.lisÄ)“and“it“is“hard“to“see“ho¸ãw“the“user“will“copGe“with“them“all“without“some“kind“ofŽ¡‘*­Ûnaming–UUdiscipline.‘qÇIf“a“naming“discipline“has“to“bGe“used,“it“mighš¸ãt“as“w˜ell“bGe“the“F–ÿ*ªunnelW“eb‘UUone.Ž© ‘*­ÛThš¸ãus–oüthe“names“of“all“ les“read“and“written“b˜y“F–ÿ*ªunnelW“eb–oüwill“ha˜v˜e“a“ le“extension“of“from“zeroŽ¡‘*­Ûto–UUthree“letters“separated“from“the“rest“of“the“ lename“b¸ãy“a“\Ê.Ä".Ž¦‘*­ÛThe––Žonly“exception“is“prošGduct“ les“whose“extension“is“left“unde ned.‘20Pro˜duct“ les“need“not“con¸ãtainŽ¡‘*­Ûa–UU\Ê.Ä"‘qÇand“a“ le“extension,“although“they“can“inherit“one“if“the“user“wishes.ŽŽŸK’û%21ŽŽŒ‹Ú& Ä)< ý;ÖÄ ªÝ» ý_"E‘*­Ûâ1.9Ž‘PfSpuÂecifying–ó÷ConstrainšŠ=ts“on“the“Num˜buÂer“of“Instan˜tia-ŽŸ‘PftionsŽŸÎБ*­ÛÄExpšGerience–{©with“F–ÿ*ªunnelW“eb–{©V1“demonstrated“the“need“to“b˜e“able“to“sp˜ecify“in“macro“de nitionsŽ¤ ‘*­Ûho•¸ãw› }man“y˜times˜it˜w“as˜expGected˜that˜the˜macro˜w“ould˜bGe˜used.‘XF–ÿ*ªunnelW“eb˜V1˜generates˜an˜errorŽ¡‘*­Ûif–5ûa“macro“is“not“used,‘<@but“pšGermits“macros“to“b˜e“called“more“than“once.‘gTThis“caused“problems“forŽ¡‘*­Ûmacro–UUlibraries,“whicš¸ãh“w˜ould“bGe“included,“but“whose“macros“w˜ere“often“not“called.ŽŸ絑*­ÛBy›5Ødefault,‘<$F–ÿ*ªunnelW“eb˜V3˜requires˜that˜eac•¸ãh˜macro˜(except˜for˜the˜ones˜attac“hed˜to˜output˜ les)Ž¡‘*­ÛbGe–Fµcalled“exactly“once.‘EæHo•¸ãw“ev“er,‘ƒ it–Fµalso“proš¸ãvides“syn˜tax“that“allo˜ws“the“user“to“spGecify“that“aŽ¡‘*­Ûmacro–EbšGe“allo•¸ãw“ed–Eto“b˜e“called“zero“times“or“manš¸ãy“times.‘l_This“allo˜ws“a“macro“to“bšGe“sp˜eci ed“withŽ¡‘*­Ûthe–@Z==...Ž¡‘J-É1‘4â@$@==...Ž¡‘J-É1..n‘$¿ë@$@@M==...Ž¡‘:mÒ0.....n‘$¿ë@$@@Z@M==...Ž¦‘*­ÛÄThe–UUonly“t•¸ãw“o–UUproblems“with“this“sc¸ãheme“are:Ž¦‘6æ½1.ŽŽŽ‘C­ÛIt–µ„is“incompatible“with“F–ÿ*ªunnelW“eb–µ„V1“ les,‘Õ{as“the“default“in“F–ÿ*ªunnelW“eb–µ„V1“is“1–ª¨Å:“:“:Ž‘ÿ÷n“ÄwhereasŽ¡‘C­Ûthe–Ǩdefault“in“new“F–ÿ*ªunnelW“eb–Ǩis“1.‘ÈÁThis“is“not“a“big“problem“bGecause“most“macros“in“theŽ¡‘C­Ûold–UU les“wš¸ãere“used“exactly“once.‘qÇOnly“a“few“macros“will“ha˜v˜e“to“bGe“c˜hanged.ŽŸç´‘6æ½2.ŽŽŽ‘C­ÛWhat–UUshould“the“synš¸ãtax“b•Ge?‘qÇ(ab“o˜v˜e–UUis“a“sneak“preview“only!)Ž¦‘*­ÛThe–,2initial“propGosal“for“synš¸ãtax“w˜as“to“allo˜w“the“user“to“insert“zero,–4lone,“or–,2bGoth“of“Ê@?‘dÄand“Ê@M‘,(ÄjustŽ¡‘*­Ûafter–UUthe“Ê@$“Äof“a“macro“de nition.‘qÇHo•¸ãw“ev“er,–UUthis“has“the“folloš¸ãwing“dra˜wbac˜ks:Ž¦‘6æ½1.ŽŽŽ‘C­ÛIt–UUuses“t•¸ãw“o–UUsequences“that“are“desirable“to“reserv¸ãe“(Ê@?‘qÇÄfor“conditionals“and“Ê@M“Äfor“macro).ŽŸç´‘6æ½2.ŽŽŽ‘C­ÛIt–UUstops“the“user“from“searc¸ãhing“for“the“string“Ê@$@@(@5@)==@{@-Ž¡‘*­ÛThis–?ýis“a“short“macro.Ž¡‘*­ÛWith–?ýonly“a“line“or“two@}Ž©‘*­Û@$@@?@M@(@5@)==@{@-Ž¡‘*­ÛThis–?ýis“a“short“macro.Ž¡‘*­ÛWith–?ýonly“a“line“or“two@}Ž¦‘*­Û@$@@(@5@)@?@M==@{@-Ž¡‘*­ÛThis–?ýis“a“short“macro.Ž¡‘*­ÛWith–?ýonly“a“line“or“two@ŽŸªù‘*­ÛÄThe–; rst“form“puts“me“o “bšGecause“I‘,think“that“it“is“a“go˜o˜d“visual“rule“to“start“all“the“macros“withŽ¡‘*­ÛÊ@$Ä.‘GThe–ÕFsecond“form“puts“me“o “bGecause“it“detacš¸ãhes“the“macro“name“from“the“parameter“list,‘îãth˜usŽ¡‘*­Ûmaking–3(it“loGok“less“likš¸ãe“a“call,‘9þwhic˜h“is“desirable“syn˜tactic“resonance.‘fcThe“third“form“is“messy“butŽ¡‘*­Ûprobably–ÃYwš¸ãork‘ÿqÇable.‘»ÒBecause“w˜e“are“righ˜t“next“to“the“tested“constan˜t“string“(either“Ê==“Äor“Ê+=Ä)“w˜eŽ¡‘*­Ûcould–…Aaugmenš¸ãt“it“further.‘ŒF‘ÿ*ªor“example,‘‘<Ê01==“Äcould“allo˜w“a“macro“to“bGe“called“from“0“to“1“times.Ž¡‘*­ÛThe–UUmain“problem“with“this“is“that“wš¸ãe“are“trying“to“phase“out“Ê==“Äan˜yw˜a˜y!ŽŽŸK’û%22ŽŽŒ‹ê Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÄNevš¸ãertheless,‘Õall–„îthe“logic“pGoin˜ts“to“after“the“parameter“list“as“the“bšGest“place“to“lo˜cate“this“infor-Ž¤ ‘*­Ûmation.Ž©/Æ‘*­ÛAfter–¿âsome“thoughš¸ãt,‘…it“w˜as“decided“that“the“\Ê@?Ä"‘±nsequence“bGe“reserv˜ed“for“a“pGossible“futureŽ¡‘*­Ûconditional–UUfacilitš¸ãy‘ÿ*ª,“and“so“Ê@Z“Äw˜as“used“instead.Ž¦‘*­ÛÉDecision:›qÇÄThe–UUpGosition“is“after“the“parameter“list.˜The“notation“is“Ê@Z“Äfor“zero,“and“Ê@M“Äfor“man¸ãy‘ÿ*ª.Ž¦‘*­ÛExample–UUof“ nal“syn¸ãtax:Ž©wo‘*­ÛÊ@$@@(@5@)@Z@M+=@{@-Ž¡‘*­ÛThis–?ýis“a“short“macro.Ž¡‘*­ÛWith–?ýonly“a“line“or“two@}ŽŸ'¨c‘*­Ûâ1.10Ž‘X­ÅThe–$Relationship“Bet•Š=w“een›$DouÂcumen“t˜Structure˜andŽŸ‘X­ÅMacro‘…StructureŽŸ+s‘*­ÛÄHaš¸ãving–Ùalready“decided“upGon“a“fully“hierarc˜hical“doGcumen˜t“structure,‘úI‘Øòdetermined“to“re ne“theŽ¡‘*­Ûdetails.‘qÇThe–UUissues“to“bGe“addressed“wš¸ãere“as“follo˜ws:Ž¦‘9­ÚÆŽŽŽ‘C­ÛÄHoš¸ãw–UUshould“the“hierarc˜hical“structure“connect“to“the“macro“structure?Ž¤_Œ‘9­ÚÆŽŽŽ‘C­ÛÄHoš¸ãw–UUcan“bac˜kw˜ards“compatibilit˜y“bGe“ac˜hiev˜ed?‘qÇShould“it?Ž¡‘9­ÚÆŽŽŽ‘C­ÛÄShould–UUthe“macros“bGe“cross“referenced“bš¸ãy“section“or“b˜y“de nition?Ž¡‘9­ÚÆŽŽŽ‘C­ÛÄShould–UUnameless“sections“inherit“macro“names“as“headings?Ž¡‘9­ÚÆŽŽŽ‘C­ÛÄShould–UUwš¸ãe“simply“use“T‘þU>Ÿ'EŽ‘ãxX“macros“to“structure“the“doGcumen˜t?Ž¦‘*­ÛAfter–UUsome“thoughš¸ãt,“I“arriv˜ed“at“the“follo˜wing“though˜ts:Ž©/Æ‘*­ÛÉBasically–aåa“T‘þ<Ÿ8ãEŽ‘3sX‘aÇ le:‘?–ÄOne–ðôoption“is“simply“to“treat“eac¸ãh“Ê.fw“Ä le“as“a“T‘þU>Ÿ'EŽ‘ãxX‘ðÚ le“laced“with“macros.Ž¤ ‘*­ÛThat–I.is,‘†$a“Ê.fw“Ä le“could“bGe“structured“as“a“real“T‘þU>Ÿ'EŽ‘ãxX‘Hï le“from“whic¸ãh“F–ÿ*ªunnelW“eb–I.could“extractŽ¡‘*­Ûmacro–N§de nitions.‘oThis“approac¸ãh“is“feasible“bšGecause“T‘þU>Ÿ'EŽ‘ãxX‘N¥could“b˜e“programmed“to“resp˜ond“to“theŽ¡‘*­ÛÊ@–8Äsequences“in“the“same“w•¸ãa“y–8that“F–ÿ*ªunnelW“eb–8respGonds“to“them.‘[Thš¸ãus,‘×there“w˜ould“bGe“no“need“forŽ¡‘*­ÛW‘ÿ*ªea•¸ãv“e.Ž¦‘*­ÛI‘˜2rejected–˜Cthis“approac¸ãh,‘¨ÿ rst“bšGecause“it“is“to˜o“t•¸ãyp˜esetter-dep˜enden“t,‘¨ÿand–˜Csecond“b˜ecause“it“com-Ž¡‘*­Ûplicates–Ôšthe“inclusion“of“anš¸ãy“sort“of“complicated“p•Gost-pro“cessing–Ôšin“the“doGcumen˜tation“ le.‘ï–ThisŽ¡‘*­Ûw•¸ãould›UUha“v“e˜to˜bGe˜implemen“ted˜in˜T‘þU>Ÿ'EŽ‘ãxX.Ž¦‘*­ÛA‘H>bGetter–HAapproacš¸ãh“is“to“use“an“in˜v˜en˜ted“section“notation“(e.g.‘mkÊ@A–?ý@B“@CÄ).–HAThis“main˜tains“F‘ÿ*ªunnel-Ž¡‘*­ÛW‘ÿ*ªeb's– t¸ãypšGesetter“indep˜endence“and“can“easily“b˜e“con•¸ãv“erted› in“to˜T‘þU>Ÿ'EŽ‘ãxX‘÷sectioning˜macros˜b“y˜W‘ÿ*ªea“v“e.Ž¦‘*­ÛIn–the“same“spirit,‘)ïit“mighš¸ãt“bGe“w˜orth“in˜troGducing“a“few“Ê@“Äsequences“for“certain“general“t˜ypGesettingŽ¡‘*­ÛopšGerations–UUsuc¸ãh“as“italics“and“program“co˜de.Ž¦‘*­ÛÉConfusion–PÍin“F–ÿ «unnelW“eb–PÍV1“Heading“Num®9bQÇering:‘8(ÄF–ÿ*ªunnelW“eb–âV1“uses“t•¸ãw“o›âlev“els˜of˜sectionŽ¡‘*­Ûheadings,‘ØÓbut›¾‡n•¸ãum“bGers˜all˜the˜headings˜sequen“tially‘ÿ*ª.–­\In˜this,‘ØÓit˜is˜a˜little˜confused.“Clearly˜withŽ¡‘*­Ûa–¹rfully“hierarcš¸ãhical“doGcumen˜t“structure,‘ythe“headings“cannot“bGe“n˜um˜bGered“sequen˜tially“|“theŽ¡‘*­Ûn•¸ãum“bGering›UUm“ust˜re ect˜the˜structure˜(e.g.˜3.2.1).Ž¦‘*­ÛÉHierarc•®9hical›òøn“um“bQÇering˜is˜messy˜for˜macros:‘\ÄUnfortunately‘ÿ*ª,‘·Ýhierarc•¸ãhical›n“um“bGering˜is˜messyŽ¡‘*­Ûand–U confusing“when“applied“to“macro“names.‘q®In“F–ÿ*ªunnelW“eb–U V1's“tš¸ãypGeset“output,‘Ueac˜h“macro“callŽ¡‘*­Ûhas–vqappšGended“in“square“brac•¸ãk“ets–vqthe“n•¸ãum“b˜er–vqof“the“section“in“whic¸ãh“the“macro“is“de ned.‘ÕUse“ofŽ¡‘*­Ûhierarc•¸ãhical›UUn“um“bGering˜w“ould˜bGe˜somewhat˜messy–ÿ*ª.‘qÇF“or˜example,˜a˜macro˜call˜migh•¸ãt˜loGok˜lik“e.ŽŸwo‘:mÒÊWrite–?ýout“the“output[6.7.4.3]ŽŽŸK’û%Ä23ŽŽŒ‹÷¸ Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÄSimilarly‘ÿ*ª,–UUcross“reference“lists“w¸ãould“bGe“messy:Ž¤!t‘:mÒÊThis–?ýmacro“is“used“in“3.4.5,“1.2,“7.8.9,“7.4,“2.2.1.1.Ž¡‘*­ÛÉSeparate›S„n•®9um“bQÇering˜for˜macros˜and˜headings:‘9VÄOne–ätidea“is“to“use“hierarcš¸ãhical“n˜um˜bGering“forŽ¤ ‘*­Ûthe–sections,‘Pbut“to“n•¸ãum“bšGer–the“macros“sequen¸ãtially‘ÿ*ª.‘V°This“could“b˜e“a“little“confusing“in“do˜cumen¸ãtsŽ¡‘*­Ûwithout›¾\m•¸ãuc“h˜structure,‘Øžbut˜w“ould˜bGe˜v“ery˜m“uc“h˜less˜messy˜than˜cross˜referencing˜using˜hierar-Ž¡‘*­Ûc•¸ãhical›·´n“um“b•Gering.‘˜åAlso,‘ÐLit˜will˜b“e˜easier˜to˜ nd˜macros˜indexed˜b•¸ãy˜a˜sequen“tial˜n“um“bGer˜than˜b“yŽ¡‘*­Ûsection,‘ž¾whicš¸ãh–has“a“less“direct“relationship“with“page“bulk“and“n˜um˜bGer.‘!öBy“macro“n˜um˜bGering“isŽ¡‘*­Ûmeanš¸ãt–UUthe“sequen˜tial“n˜um˜bGering“of“eac˜h“macro“b•Go“dy–UUpart“through“the“whole“doGcumen˜t.Ž©.¥‘*­ÛÉInput–­ýformat“matters“more“than“output“format:‘`¬ÄAš¸ãt–3this“pGoin˜t“w˜e“realize“that“a“distinctionŽ¡‘*­Ûshould–ÉKbšGe“made“b˜et•¸ãw“een–ÉKthe“Çinput›format“Äand“the“Çtyp‘ÿ}'eset˜outputÄ.‘CThe“critical“issue“here“is“not“ho¸ãwŽ¡‘*­Ûthe–¸program“should“bGe“formatted“for“prinš¸ãting,‘ÐÉbut“rather“the“format“of“its“Ê.fw“Ä le.‘šThe“t˜ypGesetŽ¡‘*­Ûoutput–_can“alw•¸ãa“ys–_bGe“cš¸ãhanged“simply“b˜y“ ddling“with“W‘ÿ*ªea˜v˜e.‘ŽËHo˜w˜ev˜er,‘alas“sošGon“as“the“do˜cumen¸ãtŽ¡‘*­Ûstructuring–ú¾features“of“F–ÿ*ªunnelW“eb–ú¾are“ xed,‘ Üthey“will“bšGe“used“in“dozens“or“h¸ãundreds“of“do˜cumen¸ãtsŽ¡‘*­Ûand–±Üit“will“bGe“vš¸ãery“dicult“indeed“to“c˜hange“them.‘‡[Therefore,‘Èýthe“impGortan˜t“thing“is“to“pro˜videŽ¡‘*­Ûas–UUsensible“and“expressiv¸ãe“a“Ê.fw“Äformat“as“pGossible.Ž¦‘*­ÛIt–‘Xis“therefore“a“separate“decision“as“to“whether“wš¸ãe“should“n˜um˜bGer“macros“b˜y“section“or“b˜y“sequenceŽ¡‘*­Ûn•¸ãum“b•Ger.‘qÇThe›UUimp“ortan¸ãt˜thing˜is˜to˜address˜the˜format˜and˜rules˜for˜the˜expression˜of˜structure.Ž¦‘*­ÛÉNaming‘:‹sections:‘!ÎÄThe–­Xnaming“of“sections“requires“some“thoughš¸ãt.‘yÑIn“man˜y“cases“(espGecially“inŽ¡‘*­Ûthe–NÍcase“of“high-levš¸ãel“sections)“the“writer“will“pro˜vide“an“explicit“name“for“a“section.‘^.In“otherŽ¡‘*­Ûcases,‘Oaproš¸ãvision–Mãof“suc˜h“a“name“will“merely“duplicate“the“name“of“the“macro“con˜tained“within“theŽ¡‘*­Ûsection.‘cãIt–¦ therefore“makš¸ães“sense“to“allo˜w“the“user“to“omit“the“name“from“a“section,‘º6with“W‘ÿ*ªea˜v˜eŽ¡‘*­Ûnaming–šthe“section“after“the“ rst“macro“de nition“in“the“section.‘WÞIf“a“macro“is“unnamed“and“thereŽ¡‘*­Ûis–UUno“macro“in“the“section,“an“error“can“bGe“generated.Ž¦‘*­ÛAll–UUthese“thoughš¸ãts“lead“to“the“follo˜wing“sc˜heme:Ž©!t‘9­ÚÆŽŽŽ‘C­ÛÄDošGcumen¸ãts–UUwill“b˜e“hierarc¸ãhically“structured“using“Ê@AÄ,“Ê@B“Äetc.Ž¤]J‘9­ÚÆŽŽŽ‘C­ÛÄEacš¸ãh–UUsection“can“bGe“giv˜en“a“name“delimited“b˜y“Ê@<@>Ä.Ž¡‘9­ÚÆŽŽŽ‘C­ÛÄSections–UUthat“do“not“ha•¸ãv“e–UUnames“inherit“the“name“of“their“ rst“macro.Ž¡‘9­ÚÆŽŽŽ‘C­ÛÄIf–UUa“section“doGes“not“ha•¸ãv“e–UUa“name“or“a“macro,“it“is“erroneous.Ž¡‘9­ÚÆŽŽŽ‘C­ÛÄSections–UUwill“bšGe“n•¸ãum“b˜ered›UUhierarc“hically˜either˜b“y˜F–ÿ*ªunnelW“eb˜or˜b¸ãy˜T‘þU>Ÿ'EŽ‘ãxX.Ž¡‘9­ÚÆŽŽŽ‘C­ÛÄMacro›¾b•Go“dy˜parts˜will˜b“e˜n•¸ãum“bGered˜sequen“tially˜b“y˜F–ÿ*ªunnelW“eb˜and˜cross˜referenced˜b¸ãy˜theseŽŸ ‘C­Ûn•¸ãum“bGers.Ž¦‘*­ÛAll–UUthis“results“in“a“system“whic¸ãh:Ž¦‘9­ÚÆŽŽŽ‘C­ÛÄProš¸ãvides–UUa“hierarc˜hical“doGcumen˜t“structuring“capabilit˜y‘ÿ*ª.Ž¡‘9­ÚÆŽŽŽ‘C­ÛÄIs–UUt¸ãypšGesetter“indep˜enden¸ãt.Ž¡‘9­ÚÆŽŽŽ‘C­ÛÄDošGes–UUnot“require“duplication“b˜et•¸ãw“een–UUheading“and“macro“names.Ž¡‘9­ÚÆŽŽŽ‘C­ÛÄSeparates–Šthe“heading“and“macro“systems“so“that“W‘ÿ*ªea•¸ãv“e–Šcan“bGe“con gured“at“a“later“date“toŽŸ ‘C­Ûcross–UUreference“in“di erenš¸ãt“w˜a˜ys“without“requiring“input“ les“to“bGe“rew˜ork˜ed.ŽŽŸK’û%24ŽŽŒ‹ Ä)< ý;ÖÄ ªÝ» ý_"E‘*­Ûâ1.11Ž‘X­ÅDiagnostic‘…MessagesŽŸç‘*­ÛÄIn›a F–ÿ*ªunnelW“eb,‘cøall˜error˜messages˜commence˜with˜an˜indicator˜indicating˜the˜sev•¸ãerit“y˜of˜the˜errorŽ¤ ‘*­Ûmessage.‘qÇHere–UUare“some“of“the“formats“that“I“in•¸ãv“estigated–UUbGefore“settling“on“the“ nal“format:ŽŸ‘*­ÛÊW--Error–?ýcreating“sloth.Ž¡‘*­ÛE--Error–?ýopening“output“file.Ž¡‘*­ÛS--I'm–?ýa“teapot.Ž¡‘*­ÛF--Can't–?ýopen“output“file.Ž©‘*­ÛW-Error–?ýcreating“sloth.Ž¡‘*­ÛE-Error–?ýopening“output“file.Ž¡‘*­ÛS-I'm–?ýa“teapot.Ž¡‘*­ÛF-Can't–?ýopen“output“file.Ž¦‘*­ÛW:Error–?ýcreating“sloth.Ž¡‘*­ÛE:Error–?ýopening“output“file.Ž¡‘*­ÛS:I'm–?ýa“teapot.Ž¡‘*­ÛF:Can't–?ýopen“output“file.Ž¦‘*­ÛW:–?ýError“creating“sloth.‘$¿ë--“Format“chosen.Ž¡‘*­ÛE:–?ýError“opening“output“file.Ž¡‘*­ÛS:–?ýI'm“a“teapot.Ž¡‘*­ÛF:–?ýCan't“open“output“file.Ž¦‘*­ÛWar-Error–?ýcreating“sloth.Ž¡‘*­ÛErr-Error–?ýopening“output“file.Ž¡‘*­ÛSev-I'm–?ýa“teapot.Ž¡‘*­ÛFat-Can't–?ýopen“output“file.Ž¦‘*­ÛW-Old–?ýfashioned“feature.Ž¦‘*­ÛW-Old–?ýfashioned“feature.Ž¦‘*­ÛW--Old–?ýfashioned“feature.Ž¦‘*­ÛW:–?ýOld“fashioned“feature.Ž¦‘*­ÛW:Old–?ýfashioned“feature.ŽŸ'Ä‘*­Ûâ1.12Ž‘X­ÅSummaryŽŸç‘*­ÛÄThis–ìrather“unstructured“cš¸ãhapter“has“addressed“some“of“the“k˜ey“design“decisions“of“F–ÿ*ªunnelW“eb.Ž¡‘*­ÛIn–Yímanš¸ãy“cases,‘[the“alternativ˜es“ha˜v˜e“bGeen“unpleasan˜t,‘[but“I‘Yëam“con den˜t“that“in“all“cases,‘[a“fullyŽ¡‘*­Ûw¸ãork‘ÿqÇable–UUsolution“has“bGeen“found.ŽŽŸK’û%25ŽŽŒ‹e Ä)< ý;ÖÄ ªÝ»ŸK’û%Ä26ŽŽŒ‹ Ä)< ý;ÖÄ ªÝ» ý¯‘î‘*­ÛëJChapter‘óF2ŽŸ7o©‘*­ÛëHF–ýunnelW“eb‘ ‰‹Implemen‘ÿ4‰tationŽŸ?o©‘*­Ûâ2.1Ž‘PfInŠ=trouÂductionŽ©VÄ‘*­ÛÄThis–«cš¸ãhapter“con˜tains“notes“on“the“actual“C‘˜coGde“that“implemen˜ts“F–ÿ*ªunnelW“eb–«V3.‘X9This“c˜hapter“isŽ¤ ‘*­Ûrather›wðpatc•¸ãh“y‘ÿ*ª.‘Ù™It˜has˜acted˜mainly˜as˜a˜dumping˜ground˜for˜ideas˜that˜I‘wçb•Gothered˜to˜write˜ab“outŽ¡‘*­Ûduring‘UUdev•¸ãelopmen“t.ŽŸ&CH‘*­Ûâ2.2Ž‘PfHistory–…of“F–þž¸unnelW“eb‘…ImplemenŠ=tationsŽ¦‘*­ÛÄThe–Ï rst“implemen¸ãtation“of“F–ÿ*ªunnelW“eb›Ï(F“unnelW“eb˜V1)˜w•¸ãas˜written˜in˜Ada˜in˜Decem“bGer˜1986.Ž¡‘*­ÛThe–zÛpro‘Ž8ject“wš¸ãas“initially“canned“as“requiring“toGo“m˜uc˜h“time,‘„=but“w˜as“resurrected“when“I‘zÑdecidedŽ¡‘*­Ûto–+êcommit“to“AdaÉ[USDOD83]“Äand“realized“that“I‘+ßneeded“a“program“to“write“to“help“me“to“learnŽ¡‘*­ÛAda.‘qÇF–ÿ*ªunnelW“eb–UUV1“wš¸ãas,“in“fact,“m˜y“ rst“Ada“program.‘qÇIt“tošGok“ab˜out“one“mon¸ãth“to“write.Ž©o©‘*­ÛF–ÿ*ªunnelW“eb–V1“wš¸ãas“used“in˜tensiv˜ely“b˜y“m˜yself“to“write“Ada“programs“from“Jan˜uary“1986“toŽ¡‘*­ÛJuly–_h1989“at“whicš¸ãh“time“I‘_# nished“m˜y“Ph.D.“and“lost“access“to“the“V‘þãAX.“During“this“time“atŽ¡‘*­Ûleast›À±t•¸ãw“en“t“y˜thousand˜lines˜of˜coGde˜w“ere˜generated˜using˜F–ÿ*ªunnelW“eb.‘³ÛHardly˜an•¸ãy“one˜but˜m“yselfŽ¡‘*­Ûused‘UUF–ÿ*ªunnelW“eb.Ž¦‘*­ÛAfter–:Ýlosing“access“to“Ada“and“the“V›ÿ*ªax“(and“hence“to“F˜unnelW˜eb),‘@(I‘:Öwš¸ãas“forced“bac˜k“to“program-Ž¡‘*­Ûming–—the“non-literate“w•¸ãa“y–ÿ*ª.‘2]F“rom–—time“to“time“I›–åfound“that“I˜needed“to“use“some“of“m¸ãy“old“programsŽ¡‘*­Ûthat–I›~õhad“written“using“Ada“and“F–ÿ*ªunnelW“eb.‘îÈI˜knew–that“Ada“wš¸ãould“bGecome“a˜v‘ÿqÇailable“on“moreŽ¡‘*­Ûmacš¸ãhines,‘]Êbut–\certainly“F–ÿ*ªunnelW“eb–\w˜ouldn't.‘†I‘\recognised“a“strong“need“for“a“pGortable“v˜ersion“ofŽ¡‘*­ÛF–ÿ*ªunnelW“eb–UUwritten“in“C“but“didn't“ha•¸ãv“e–UUthe“time“or“energy“to“create“one.Ž¦‘*­ÛAbGout–É this“time“(late“1989),›%õDa¸ãvid“Hulse,˜at“the“time“a“studen¸ãt“in“Computer“Science“at“theŽ¡‘*­ÛUniv•¸ãersit“y–ÌÔof“Adelaide,‘ê´v•¸ãolun“teered–ÌÔto“translate“the“4000“line“Ada“vš¸ãersion“of“F–ÿ*ªunnelW“eb–ÌÔin˜to“C.Ž¡‘*­ÛT‘ÿ*ªo–6¥mš¸ãy“kno˜wledge“this“translation“prošGcess“to˜ok“ab˜out“three“wš¸ãeeks“(in“Decem˜bGer“1989).‘gŒThe“resultŽ¡‘*­Ûwš¸ãas–UUcalled“F–ÿ*ªunnelW“eb–UUV2“and“w˜as“formally“signed“in˜to“the“public“domain“on“5“Ma˜y“1992.Ž¦‘*­ÛIn–N5general,‘ŒmDaš¸ãvid“Hulse“did“a“go•Go“d–N5job.‘\gHo˜w˜ev˜er,‘Œmthe“resultan˜t“coGde“su ered“from“one“or“fewŽ¡‘*­Ûserious–UUdefects,“the“most“serious“of“whicš¸ãh“w˜as“a“lac˜k“of“pGortabilit˜y‘ÿ*ª.Ž¦‘*­ÛLacš¸ãk–r}of“pGortabilit˜y“of“the“C“coGde,‘ŸÜcom˜bined“with“the“need“for“a“rather“solid“design“review,‘ŸÜcom˜binedŽ¡‘*­Ûwith–the“need“to“strengthen“the“program“to“bring“it“up“to“proGduction“standard,‘0ïresulted“in“m¸ãyŽ¡‘*­ÛpšGerforming–Îãa“complete“rew¸ãorking“of“the“co˜de.‘D÷The“C‘ÎÁco˜de“wš¸ãas“en˜tirely‘ÿ*ª,‘éÇbut“incremen˜tally‘ÿ*ª,‘éÇreplacedŽ¡‘*­Ûor–ÏAreformatted.‘ߊThe“coGde“wš¸ãas“also“strengthened“and“new“features“w˜ere“added.‘ߊThis“proGcessŽ¡‘*­Ûto•Gok›8¦ab“out˜t•¸ãw“o˜mon“ths˜(No“v“em“bGer˜and˜Decem“bGer˜1991).‘¹A‘8kfurther˜t“w“o˜mon“ths˜(appro“x)˜w“ereŽ¡‘*­ÛspšGen¸ãt–ïÚwriting“do˜cumen¸ãtation,›&constructing“a“regression“test“suite,˜pGorting“the“program“to“di eren¸ãtŽ¡‘*­Ûmacš¸ãhines,–UUand“sorting“out“the“legal“issues“in˜v˜olv˜ed“in“its“release.Ž¦‘*­ÛI‘a:w•¸ãould›a=lik“e˜to˜tak“e˜this˜oppGortunit“y˜to˜record˜a˜debt˜of˜gratitude˜to˜Da“vid˜Hulse˜who˜translatedŽ¡‘*­ÛF–ÿ*ªunnelW“eb–ÿfrom“Ada“to“C.“Although“mš¸ãy“rew˜orking“of“his“C“cošGde“obliterated“most“of“his“co˜de,‘%hisŽŽŸK’û%27ŽŽŒ‹Ì Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÄtranslation–fAwš¸ãas“piv˜otal“to“the“dev˜elopmen˜t“proGcess.‘¤ŒWithout“his“e ort“in“mo˜ving“from“Ada“to“C,Ž¤ ‘*­ÛI'm–©œnot“sure“that“I‘©†wš¸ãould“ha˜v˜e“m˜ustered“the“energy“and“time“to“complete“the“proGcess“and“bringŽ¡‘*­ÛF–ÿ*ªunnelW“eb–UUup“to“its“curren¸ãt“standard.ŽŸ(@Ù‘*­Ûâ2.3Ž‘PfWhŠ=y›…F–þž¸unnelW“eb˜W“asn't˜Used˜to˜W“rite˜ItselfŽŸp¡‘*­ÛÄAfter–`‹Kn¸ãuth“created“the“W›ÿ*ªeb“literate“preproGcessing“system,‘£Xhe“re-wrote“it“using“W˜eb“and“dis-Ž¡‘*­Ûtributed–î#the“source“coGde“in“W›ÿ*ªeb“source“form.‘OaT˜o“allo¸ãw“the“W˜eb“source“cošGde“to“b˜e“tangled“b¸ãy“usersŽ¡‘*­Ûnot–UUyš¸ãet“ha˜ving“a“cop˜y“of“W‘ÿ*ªeb,“he“also“included“the“tangled“P˜ascal“coGde“for“the“T‘ÿ*ªangler.Ž©`"‘*­ÛWhile–ròthis“approacš¸ãh“is“heroic“and“serv˜es“to“con˜v˜ey“a“commitmen˜t“and“a“con dence“in“literateŽ¡‘*­Ûprogramming,‘JÍit–H,seemed“to“me“that“writing“F–ÿ*ªunnelW“eb–H,in“F–ÿ*ªunnelW“eb–H,w¸ãould“simply“bGe“asking“forŽ¡‘*­Ûtrouble.‘D¾F‘ÿ*ªor–Î8a“start,‘é>it“wš¸ãould“bGe“v˜ery“hard“to“moGdify“an˜y“feature“of“F–ÿ*ªunnelW“eb–Î8that“had“bGeen“usedŽ¡‘*­Ûto–>›write“F–ÿ*ªunnelW“eb,‘xíand–>›the“thoughš¸ãt“of“what“w˜ould“happGen“if“the“w˜orking“executable“bGecameŽ¡‘*­ÛinopšGerativ¸ãe–UUfor“some“reason“do˜es“not“b˜ear“thinking“up˜on.Ž¦‘*­ÛOne–)Ámillion“billion“computer“programs“wš¸ãere“written“in“the“non-literate“st˜yle“bGefore“F–ÿ*ªunnelW“ebŽ¡‘*­Ûw•¸ãas›UUcreated.‘qÇWh“y˜not˜one˜more?ŽŸ(@Ù‘*­Ûâ2.4Ž‘PfCouÂding‘…StŠ=yleŽŸp¡‘*­ÛÄAlthough›¯¾F–ÿ*ªunnelW“eb˜w•¸ãasn't˜coGded˜under˜an“y˜particular˜coGding˜standard,‘ÆXit˜w“as˜coGded˜in˜accor-Ž¡‘*­Ûdance–PZwith“a“fairly“strict“pGersonal“stš¸ãyle“of“C‘Pwhic˜h“dev˜elopGed“during“the“dev˜elopmen˜t“of“F–ÿ*ªunnelW“eb.Ž¡‘*­ÛThis–ùstš¸ãyle“w˜as“subsequen˜tly“em˜b•Go“died–ùin“a“real“C‘øôcoGding“standard“prepared“for“the“South“Aus-Ž¡‘*­Ûtralian›¯Go•¸ãv“ernmen“t˜Departmen“t˜of˜Lands.Ÿü^ÿ³1ŽŽ‘¶ÏÄUnfortunately–ÿ*ª,‘ÐSF“unnelW“eb˜w•¸ãas˜not˜formally˜dev“elopGedŽ¡‘*­Ûunder–¬ˆthe“standard“and“so“some“holes“remain“in“F–ÿ*ªunnelW“eb's–¬ˆcoGding“st¸ãyle.‘waThis“section“aims“toŽ¡‘*­ÛdescribšGe–UUsome“of“the“more“imp˜ortan¸ãt“asp˜ects“of“the“co˜ding“st¸ãyle.Ž¦‘*­ÛÉP•®9ortabilit“y:‘ù”ÄThis–™;wš¸ãas“a“ma‘Ž8jor“goal“of“the“F–ÿ*ªunnelW“eb–™;implemen˜tation.‘=zTw˜o“excellen˜t“b•Go“oksŽ¡‘*­Ûguided–†Kthis“mo•¸ãv“e–†Kto“pGortabilitš¸ãy‘ÿ*ª.‘©They“w˜ere“É[Rabino®9witz90]“Ä(whic˜h“deals“with“C‘…ücoGde“itself‘Ç)Ž¡‘*­Ûand–¯‹É[Horton90]“Ä(whicš¸ãh“deals“with“the“pGortabilit˜y“of“v‘ÿqÇarious“library“calls).‘€iOther“w˜orks“suc˜h“asŽ¡‘*­ÛÉ[Kernighan88]–UUÄand“É[ANSI]“Äw¸ãere“also“helpful.Ž¦‘*­ÛÉIden•®9ti ers:‘H‚[Rabino“witz90]Älength–ÊspšGeci es“that“for“wide“p˜ortabilit•¸ãy‘ÿ*ª,‘Liden“ti ers–Êof“blo˜c¸ãk“and“ leŽ¡‘*­ÛscopšGe–šshould“b˜e“unique“to“eighš¸ãt“c˜haracters,‘«Iand“iden˜ti ers“of“program“scopšGe“should“b˜e“unique“toŽ¡‘*­Ûsix›Ëtc•¸ãharacters.‘CÒI‘ËRha“v“e˜gone˜further˜in˜F–ÿ*ªunnelW“eb˜and˜actually˜made˜these˜restrictions˜actual˜limitsŽ¡‘*­Ûon–UUiden¸ãti er“length.Ž¦‘*­ÛBecause–×.names“mš¸ãust“bGe“so“short,‘÷¤a“system“of“abbreviations“w˜as“dev˜elopGed“to“organize“the“iden-Ž¡‘*­Ûti ers–µŸused“within“F–ÿ*ªunnelW“eb.›’¤Eac¸ãh–µŸabbreviation“consists“of“a“letter“pair.˜Here“are“Çsome“Äof“theŽ¡‘*­Ûabbreviations‘UUused:ŽŸðU‘*­ÛÊbp–?ý-“Body“Part.Ž¡‘*­Ûcm–?ý-“Compare.“Used“to“prefix“comparison“routines“that“return“[-1,0,1].Ž¡‘*­Ûdc–?ý-“Document“component.Ž¡‘*­Ûdm–?ý-“Dump“package.Ž¡‘*­Ûel–?ý-“Element.Ž¡‘*­Ûeq–?ý-“Equal.“Used“to“prefix“comparison“routines“that“return“a“boolean.Ž¡‘*­Ûex–?ý-“Expression.Ž¡‘*­Ûf‘ ú-–?ýGlobal“files.Ž¡‘*­Ûll–?ý-“List“of“lists.Ž¡‘*­Ûln–?ý-“Line“record.Ž¡‘*­Ûls–?ý-“List“Package.Ž¡‘*­Ûlr–?ý-“Lister“package.Ž‘*­ÛŸ _Ž‰ffª¶ÄŸ J=‘ "5Ÿý-:¯1ŽŽ‘LܸThe–ÕXstandard“is“currenšÃŽtly“una˜v‡ailable,“but“is“lik˜ely“to“bÛwrote–>á(called“ÊmemoryÄ)“that“alloGcated“large“c•¸ãh“unks–>áof“memory“and“then“doled“out“small“pieces“asŽ¡‘*­Ûrequired–UUb¸ãy“the“rest“of“the“program.ŽŽŸK’û%29ŽŽŒ‹;B Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÄHaš¸ãving–UUa“pac˜k‘ÿqÇage“to“manage“all“the“memory“alloGcation“had“t˜w˜o“other“bGene ts.Ž©jI‘*­ÛFirst,‘h¿only–1ªone“c•¸ãhec“k›1ªw“as˜required˜in˜the˜en“tire˜program˜to˜see˜if˜memory˜had˜run˜out˜(in˜theŽ¤ ‘*­Ûmemory–[pac¸ãk‘ÿqÇage),›/and“if“that“failed,˜the“program“could“bGe“brough¸ãt“to“a“screaming“halt.‘„ŸThisŽ¡‘*­Ûorganization–ôwš¸ãas“far“preferable“to“ha˜ving“eac˜h“piece“of“cošGde“that“needed“to“allo˜cate“memoryŽ¡‘*­Ûhaš¸ãving–UUto“c˜hec˜k“to“see“if“Êmalloc“Ähad“failed.Ž¦‘*­ÛSecond,‘ƒthe–¬­decision“to“construct“a“mini-shell“within“F–ÿ*ªunnelW“eb–¬­to“suppGort“regression“testingŽ¡‘*­Ûmean¸ãt–æìthat“F–ÿ*ªunnelW“eb–æìpropšGer“could“b˜e“run“manš¸ãy“times“in“an˜y“giv˜en“in˜v˜oGcation“of“F–ÿ*ªunnelW“eb.‘LúAsŽ¡‘*­Ûa–ƒconsequence“it“wš¸ãas“necessary“to“mak˜e“sure“that“there“w˜as“no“memory“leak‘ÿqÇage“bGet˜w˜een“in˜v˜oGcationsŽ¡‘*­Ûof›ƒ‰F–ÿ*ªunnelW“eb˜propGer.‘üdThis˜w•¸ãas˜accomplished˜b“y˜rew“orking˜the˜memory˜pac“k‘ÿqÇage˜to˜opGerate˜aŽ¡‘*­Ûwš¸ãatermark–~system.‘]€The“user“of“the“pac˜k‘ÿqÇage,›$©when“requesting“memory‘ÿ*ª,˜could“request“\tempGorary"Ž¡‘*­Ûor–®Z\pšGermanen¸ãt".‘|ÕIf“p˜ermanenš¸ãt,‘Ä›the“memory“pac˜k‘ÿqÇage“forgot“that“it“had“alloGcated“the“memory‘ÿ*ª.‘|ÕIfŽ¡‘*­ÛtempšGorary‘ÿ*ª,‘5-the–-#memory“pac¸ãk‘ÿqÇage“places“the“allo˜cated“blo˜cš¸ãk“on“a“list.‘daThere“w˜as“then“a“function“inŽ¡‘*­Ûthe–ÅÂmemory“pac¸ãk‘ÿqÇage“that“could“bšGe“called“to“deallo˜cate“all“the“temp˜orary“memory‘ÿ*ª.‘AìTh¸ãus,‘âyso“long“asŽ¡‘*­Ûall–]requests“for“memory“within“F–ÿ*ªunnelW“eb–]propšGer“w¸ãere“for“temp˜orary“memory‘ÿ*ª,‘_and“that“memoryŽ¡‘*­Ûwš¸ãas–UUfreed“at“the“end“of“ev˜ery“run,“one“could“bGe“sure“that“there“w˜as“no“memory“leak‘ÿqÇage.ŽŸ+‡ø‘*­Ûâ2.7Ž‘PfThe‘…StacŠ=kŽŸí_‘*­ÛÄF›ÿ*ªor–þa“while“during“the“dev•¸ãelopmen“t–þof“F˜unnelW˜eb“a“particularly“nastš¸ãy“bug“pro˜v˜ed“extremely“hardŽ¡‘*­Ûto–ê¦ nd.‘1ºThe“symptom“wš¸ãas“that“F–ÿ*ªunnelW“eb–ê¦w˜ould“crash,›úsometimes“at“random,˜but“more“oftenŽ¡‘*­ÛupšGon–Men¸ãtering“a“particular“function.‘‡°In“the“end“ab˜out“a“da¸ãy“of“sp˜eci c“debugging“w¸ãas“requiredŽ¡‘*­ÛbGefore–M3the“problem“wš¸ãas“trac˜k˜ed“do˜wn“to“a“stac˜k“problem.‘oIt“turned“out“that“someho˜w“(either“theŽ¡‘*­Ûfault–Šîof“the“Macin¸ãtosh“or“the“THINK“C›Šàlanguage“system),‘˜Tonly“6K˜w¸ãas“bšGeing“allo˜cated“for“stac¸ãkŽ¡‘*­Ûspace!!!!!!!Ž¦‘*­ÛThis––expGerience“led“me“immediately“to“go“through“the“enš¸ãtire“program“and“eliminate“(or“remo˜v˜e“toŽ¡‘*­Ûthe–UUheap)“anš¸ãy“automatic“v‘ÿqÇariable“declarations“that“used“more“than“one“h˜undred“or“so“b˜ytes.Ž¦‘*­ÛThe–B(lesson“is“clearly“that“C“programs“that“use“more“than“a“few“thousand“bš¸ãytes“of“stac˜k“space“areŽ¡‘*­Ûrisking–UUtheir“pšGortabilit¸ãy‘ÿ*ª.‘qÇAll“large“data“structures“should“b˜e“placed“in“the“heap.ŽŸ+‡ø‘*­Ûâ2.8Ž‘PfStatic‘…V‘þž¸ariablesŽŸí_‘*­ÛÄStatic–{“v‘ÿqÇariables“also“pro•¸ãv“ed–{“a“problem“on“the“Macinš¸ãtosh.‘)1It“turns“out“that“the“Macin˜tosh“THINK“CŽ¡‘*­Ûcompiler–ÔŸdoGes“not“allo¸ãw“more“than“32K‘Ô~of“statics“Çin–~the“entir›ÿ}'e“pr˜o˜gr˜amÄ.‘FàF‘ÿ*ªor–ÔŸa“while“this“restrictionŽ¡‘*­Ûwš¸ãas– Qa“serious“threat“to“the“program“as“it“w˜as“disco˜v˜ered“that“constan˜t“strings“w˜ere“included“inŽ¡‘*­Ûthis›X™total!‘{“Ho•¸ãw“ev“er,‘Yjsome˜searc“hing˜rev“ealed˜a˜compiler˜option˜that˜remo“v“ed˜the˜strings˜from˜theŽ¡‘*­Ûstatic‘UUcategory‘ÿ*ª.Ž¦‘*­ÛNevš¸ãertheless,‘×Æthe–½°32K‘½•limit“is“rather“sev˜ere.‘ª×Again,‘×Æit“seems“that“for“pGortabilit˜y“reasons,‘×ÆC“pro-Ž¡‘*­Ûgrams–Ñlthat“use“a“lot“of“static“v‘ÿqÇariables“are“risking“their“pGortabilit¸ãy›ÿ*ª.‘æ As“a“result,‘ðqthe“F˜unnelW˜ebŽ¡‘*­ÛcoGde›UUa•¸ãv“oids˜static˜v‘ÿqÇariables˜where˜pGossible˜in˜fa“v“our˜of˜the˜heap.ŽŸ+‡ø‘*­Ûâ2.9Ž‘PfImplemenšŠ=ting–…T‘þž¸ext“Inden˜tationŽŸí_‘*­ÛÄAš¸ãt–õÿÜ*/Ž¡‘*­Û/*–?ýIN:“is_white“should“be“set“to“TRUE“iff“scrap“is“entirely“whitespace.‘$¿ë*/Ž¡‘*­Ûp_ps_t‘?ýp_tkps;Ž¡‘*­Ûchar‘ ú*p_first;Ž¡‘*­Ûchar‘ ú*p_last;Ž¡‘*­Ûchar‘ ú*p_postn;Ž¡‘*­Ûbool‘¿÷is_white;Ž¡‘*­Û{Ž¡‘/íØtk_t‘?ýtoken;Ž©‘/íØ/*–?ýEmpty“text“scraps“should“never“be“generated.“*/Ž¡‘/íØassert(p_first<=p_last,"sendtext:–?ýText“scrap“bounds“are“bad.");Ž¦‘/íØ/*–?ýIf“ch=EOL“then“we“should“be“scanning“more“text,“not“shipping“it!“*/Ž¡‘/íØassert(ch!=EOL,"senttext:–?ýShipping“text“while“still“more“to“scan.");Ž¦‘/íØ/*–?ýCheck“that“p_postn“is“in“range.“See“definition“in“fwdata.h.“*/Ž¡‘/íØassert(p_first<=p_postn–?ý&&“p_postn<=p_last+1,Ž¡‘T­Ã"sendtext:–?ýp_postn“is“out“of“range.");Ž¦‘/íØ/*–?ýDebug:“Check“the“p_postn“field“using“a“brute“force“check.“*/Ž¡‘/íØ{Ž¡‘5-Õchar‘?ý*i,*j;Ž¡‘5-Õj=p_first;Ž¡‘5-Õfor‘?ý(i=p_first;i<=p_last;i++)Ž¡‘DíÌif‘?ý(*i==EOL)Ž¡‘T­Ãj=i+1;Ž¡‘5-Õassert(j==p_postn,"sendtext:–?ýsc_postn“field“is“incorrect.");Ž¡‘/íØ}Ž¦‘/íØ/*–?ýLoad“the“text“token.“*/Ž¡‘/íØtoken.tk_kind‘)ÿè=‘?ýTK_TEXT;Ž¡‘/íØASSIGN(token.tk_ps,*p_tkps);Ž¡‘/íØtoken.tk_sc.sc_first–?ý=“p_first;Ž¡‘/íØtoken.tk_sc.sc_last‘ ú=‘?ýp_last;Ž¡‘/íØtoken.tk_sc.sc_postn–?ý=“p_postn;Ž¡‘/íØtoken.tk_white‘$¿ë=‘?ýis_white;Ž¡‘/íØtoken.tk_parno‘$¿ë=‘?ý0;Ž¡‘/íØls_add(token_list,PV‘?ý&token);Ž¡‘*­Û}ŽŸIé‘*­ÛÄThen–UUall“the“calls“to“sendtext“ha•¸ãv“e–UUto“bGe“c¸ãhanged:ŽŽŸK’û%31ŽŽŒ‹ Z( Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÊ/*–?ý@“instructs“FunnelWeb“to“replace“the“special“construct“with“the“*/Ž¤ ‘*­Û/*–?ýspecial“character.“Luckily“one“appears“just“before“the“@“!!‘?ñ*/Ž¡‘*­Û/*–?ýNote:“FALSE“is“OK“because“space“is“not“a“legal“specialch.‘$¿ë*/Ž¡‘*­Û/*–?ýNote:“Setting“parameter“p_postn“to“p_ch-1“is“OK“as“EOL“is“not“a“*/Ž¡‘*­Û/*‘$¿ëlegal‘?ýspecialch.’Ü‚*/Ž¡‘*­Ûsendtext(&ps_spec,p_ch-1,p_ch-1,p_ch-1,FALSE);Ž¡‘*­Ûbreak;Ž©‘*­Û/*–?ý+“instructs“FunnelWeb“to“insert“an“EOL.“We“can't“look“to“the“end“of“*/Ž¡‘*­Û/*–?ýthe“previous“line“to“find“an“EOL“as“this“might“be“the“first“line.‘¿÷*/Ž¡‘*­Û/*–?ýRunning“ahead“to“the“end“of“the“line“is“expensive,“and“having“the‘¿÷*/Ž¡‘*­Û/*–?ýliner“mini-package“maintain“a“variable“for“it“would“be“extra‘)ÿè*/Ž¡‘*­Û/*–?ýhousekeeping.“Instead“of“all“this,“we“just“point“to“a“static.‘$¿ë*/Ž¡‘*­Û{CONST–?ýstatic“char“stateol“=“EOL;Ž¡‘/íØsendtext(&ps_spec,&stateol,&stateol,(&stateol)+1,TRUE);}Ž¡‘*­Ûbreak;Ž¦‘*­Û/*–?ýIf“we“hit“something“that“ends“a“text“token“*/Ž¡‘*­Û/*–?ýthen“we“can“transmit“a“white“text“token.‘¿÷*/Ž¡‘*­Ûif–?ý(ch==specialch“||“ch==EOFCH)Ž¡‘:mÒ{sendtext(&ps_start,p_first,p_ch-1,MAX(p_sol,p_first),TRUE);‘?ýreturn;}Ž¦‘*­Û/*–?ýOtherwise“we“have“some“more“(non-white)“text“to“scan.“*/Ž¡‘*­Û/*–?ýWe“can“then“send“a“non-white“text“token.‘IÖ*/Ž¡‘*­Ûwhile–?ý(ch!=specialch“&&“ch!=EOFCH)Ž¡‘:mÒNEXTCH;Ž¡‘*­Ûsendtext(&ps_start,p_first,p_ch-1,MAX(p_sol,p_first),FALSE);Ž¤fï‘*­ÛÄThe–UUdump“cošGde“needs“to“b˜e“c¸ãhanged“to˜o!Ž¡‘T­ÃÊwf_str(p_wf,"\"");Ž¤ ‘*­Ûassert(token->tk_sc.sc_first–?ý!=NULL,"dm_tkls:“NULL“ptr1.");Ž¡‘*­Ûassert(token->tk_sc.sc_last‘ ú!=NULL,"dm_tkls:–?ýNULL“ptr2.");Ž¡‘*­Ûfor–?ý(i=token->tk_sc.sc_first;“i<=token->tk_sc.sc_last;“i++)Ž¡‘5-Õ{Ž¡‘:mÒif‘?ý(i==token->tk_sc.sc_postn)Ž¡‘J-Éwf_str(p_wf,"");Ž¡‘:mÒif‘?ý(*i=='\n')Ž¡‘J-Éwf_wl(p_wf,"");Ž¡‘:mÒelseŽ¡‘J-Édm_byte(p_wf,*((ubyte_–?ý*)“i));Ž¡‘5-Õ}Ž¡‘*­Ûif‘?ý(i==token->tk_sc.sc_postn)Ž¡‘:mÒwf_str(p_wf,"");Ž¡‘*­Ûwf_str(p_wf,"\"");Ž¡‘*­Û}ŽŸfï‘*­ÛÄ3.‘ 'xOvš¸ãer–ç;in“the“T‘ÿ*ªangle“moGdule,‘K´create“a“massiv˜e“arra˜y“of“pGoin˜ters“to“scraps“to“bGe“used“as“aŽ¡‘*­Ûstac•¸ãk.‘‰Main“tain›]pGoin“ters˜in“to˜the˜stac“k˜called˜Êcurrent˜Äand˜Çb‘ÿ}'ase˜Ä(similar˜to˜the˜blank˜inden“tationŽ¡‘*­Ûv‘ÿqÇariables).‘qÇImplemenš¸ãt–UUthe“follo˜wing:ŽŸfð‘9­ÚÆŽŽŽ‘C­ÛÄT‘ÿ*ªo–¤¾write“out“a“scrap,‘¸˜scan“it“bš¸ãyte“b˜y“b˜yte.‘`Output“eac˜h“b˜yte.‘`When“y˜ou“hit“an“EOL,“pGopŽ¡‘C­Ûthe–„îstacš¸ãk“bac˜k“to“ÊbaseÄ.‘‘Then“write“out“an“EOL‘„âfollo˜w˜ed“b˜y“the“stac˜k“con˜ten˜ts“but“writingŽ¡‘C­Ûeacš¸ãh–ã scrap“only“from“Êpostn“Äto“end“end“of“eac˜h“scrap.‘K®When“y˜ou“ha˜v˜e“ nished“the“new“scrap,Ž¡‘C­Ûpush–UUit“on“the“stac¸ãk.ŽŸAü‘9­ÚÆŽŽŽ‘C­ÛÄWhen–UUyš¸ãou“hit“a“new“macro“to“expand,“sa˜v˜e“ÊbaseÄ.‘qÇRestore“it“later.ŽŽŸK’û%32ŽŽŒ‹!d& Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÄThe–UUÊpostn“Ä eld“solvš¸ães“the“big“problem“of“ho˜w“to“copGe“with“something“lik˜e“this:Ž¤‘*­ÛÊThe–?ýrain“in“SpainŽ© ‘*­Ûfalls–?ýmainly“@Ž¡‘*­ÛÄThe–ñtrouble“is“that“wš¸ãe“w˜an˜t“to“text“inden˜t“the“lines“in“Ê@–ñÄwith“just“\ÊfallsŽ¦‘*­Ûmainly‘?ýÄ".›ÉšHo•¸ãw“ev“er,‘¹ìthis–r›string“is“only“part“of“a“scrap.˜The“solution“is“to“get“the“scanner“toŽ¦‘*­Ûrecord,›¡¬in–’hthe“Êpostn“Ä eld“of“eac¸ãh“scrap,˜the“pGosition“of“the“ rst“b¸ãyte“with“a“EOL-free“run“to“theŽ¦‘*­Ûend–UUof“the“scrap.ŽŸ‘*­ÛThis–ÛÃscš¸ãheme“is“v˜ery“ecien˜t“bGecause“all“w˜e“are“doing“is“pushing“and“pšGopping“p˜oin¸ãters“to“scrapsŽ¦‘*­Ûon–êta“stacš¸ãk“arra˜y‘ÿ*ª.‘1$The“main“disadv‘ÿqÇan˜tage“is“that“the“arra˜y“m˜ust“necessarily“bGe“ nite“and“w˜ouldŽ¦‘*­ÛimpGose–UUa“limit“on“the“depth“of“inden¸ãtation“nesting“(not“a“big“problem).ŽŽŸK’û%33ŽŽŒ‹"oŒ Ä)< ý;ÖÄ ªÝ»ŸK’û%Ä34ŽŽŒ‹#sV Ä)< ý;ÖÄ ªÝ» ý° ­‘*­ÛëJChapter‘óF3ŽŸ7éh‘*­ÛëHF–ýunnelW“eb‘ ‰‹Mo‘Ëvdi cationŽŸ?éh‘*­Ûâ3.1Ž‘PfInŠ=trouÂductionŽ©Ѓ‘*­ÛÄThis–“Ðcš¸ãhapter“deals“with“moGdi cations“to“F–ÿ*ªunnelW“eb.‘-8Although–“Ðthe“GNU‘“~license“under“whic˜hŽ¤ ‘*­ÛF–ÿ*ªunnelW“eb–—ais“distributed“alloš¸ãws“an˜y˜one“to“mošGdify“F–ÿ*ªunnelW“eb–—aand“distribute“the“mo˜di ed“v¸ãersions,Ž¡‘*­Ûthere–5Œare“a“n•¸ãum“bGer–5Œof“dangers“in“doing“this.‘g/This“cš¸ãhapter“explains“the“dangers“and“presen˜ts“someŽ¡‘*­Ûissues–UUthat“yš¸ãou“should“think“abGout“if“y˜ou“in˜tend“to“distribute“moGdi ed“v˜ersions“of“F–ÿ*ªunnelW“eb.ŽŸ&ñr‘*­Ûâ3.2Ž‘PfThe–…Danger“of“MouÂdifying“LanguagesŽ¦‘*­ÛÄWhenevš¸ãer–RMsomeone“moGdi es“a“computer“program“they“should“alw˜a˜ys“ask“themselv˜es“\what“is“theŽ¡‘*­Ûimpact–·Lof“these“c¸ãhanges“going“to“bšGe“on“users".‘=F‘ÿ*ªor“mature“pro˜ducts,‘Öèthe“degree“of“impact“is“largelyŽ¡‘*­Ûdetermined–ºbš¸ãy“the“in˜v˜estmen˜t“that“users“ha˜v˜e“made“in“particular“ le“formats“suppGorted“b˜y“theŽ¡‘*­ÛproGduct.Ž©éh‘*­ÛAš¸ãt–¨the“t˜w˜o“extremes,‘dthere“are“the“video“game“and“the“compiler.‘ZãIf“one“c˜hanges“a“video“game,‘dtheŽ¡‘*­Ûcš¸ãhange–«a ects“only“the“future“games“pla˜y˜ed.‘9Ho˜w˜ev˜er,‘Íif“one“c˜hanges“a“compiler“in“particular“w˜a˜ys,Ž¡‘*­Ûit–ßis“likš¸ãely“that“thousands“of“users“will“bGe“forced“to“c˜hange“millions“of“source“ les“to“accommoGdateŽ¡‘*­Ûthe–®—new“v•¸ãersion.‘:3Th“us–®—the“impact“of“cš¸ãhanges“to“a“program“depGends“largely“on“the“in˜v˜estmen˜t“madeŽ¡‘*­Ûbš¸ãy–UUusers,“in“source“ les,“training,“and“ev˜en“m˜uscle“memory!Ž¦‘*­ÛF–ÿ*ªunnelW“eb–‘lies“vš¸ãery“m˜uc˜h“at“the“compiler“end“of“this“spGectrum.‘% In“fact“it“lies“ev˜en“further.‘% NotŽ¡‘*­Ûonly–§doGes“it“implemenš¸ãt“a“language,‘»}but“it“is“curren˜tly“the“Çonly“Äimplemen˜tation“of“that“language!Ž¡‘*­ÛThis–¸µmeans“that,›Ø although“they“shouldn't,˜pšGeople“will“b˜e“tempted“to“treat“the“F–ÿ*ªunnelW“eb‘¸µprogramŽ¡‘*­Ûas–Îéthe“de nition“of“its“input“language“instead“of“the“de nition“c¸ãhapter“in“the“ÇF‘ÿ;¼unnelWeb‘ÁUser'sŽ¡‘*­ÛManualÄ,–UUwhicš¸ãh“tak˜es“precedence.Ž¦‘*­ÛBecause›AF–ÿ*ªunnelW“eb˜de nes˜an˜input˜language,‘¶ßand˜pGeople˜will˜write˜programs˜using˜that˜language,Ž¡‘*­Ûparticular–Nžkinds“of“cš¸ãhanges“in“the“language“will“impact“sev˜erely“on“users.‘oŠThree“di eren˜t“kinds“ofŽ¡‘*­Ûcš¸ãhange–UUare“discussed“bGelo˜w.Ž¦‘G!ÂÉRemo®9ving‘šTfeatures:‘X ÄRemoš¸ãv‘ÿqÇal–"of“features“(featurectom˜y)“is“extremely“dicult“onceŽ¡‘G!Âthe–¹tuser“base“has“started“using“them.‘ž$If“a“feature“is“remo•¸ãv“ed,‘Ò{users–¹tof“the“programŽ¡‘G!Âwill›øjha•¸ãv“e˜to˜go˜through˜all˜their˜programs˜and˜ nd˜a˜w“a“y˜to˜sim“ulate˜the˜e ect˜of˜theŽ¡‘G!Âremo•¸ãv“ed–Kfeature“with“other“features.‘nXOften“this“is“so“un¸ãthink‘ÿqÇable,‘Mthat“bad“languageŽ¡‘G!Âconstructs–UUare“tolerated“far“bGey¸ãond“their“useful“lifetime.Ž¦‘G!ÂÉMoQÇdifying‘¾qfeatures:‘1ÄMoGdi cation– of“features“has“less“direct“impact“than“the“re-Ž¡‘G!Âmo¸ãv‘ÿqÇal–y„of“features,›‚but“can“cause“more“subtle“errors.‘ÞTF‘ÿ*ªor“example,˜consider“the“sortsŽ¡‘G!Âof–Ýsubtle“errors“that“mighš¸ãt“arise“if“the“seman˜tics“of“the“F–ÿ*ªunnelW“eb–Ýcommen˜t“Ê@!‘ZJÄw˜ereŽ¡‘G!Âcš¸ãhanged–½so“that“it“no“longer“includes“the“end“of“line“mark˜er.‘©An˜y˜one“moGdifyingŽ¡‘G!Âfeatures–UUshould“bGe“sure“that“they“are“not“inadv•¸ãerten“tly›UUla“ying˜traps.ŽŽŸK’û%35ŽŽŒ‹$s£ Ä)< ý;ÖÄ ªÝ» ý_"E‘G!ÂÉAdding‘/ifeatures:‘qÄAlthough–£ªthe“addition“of“features“is“generally“the“most“painlessŽ¤ ‘G!Âfor–ðthe“user“comm•¸ãunit“y‘ÿ*ª,›Tas–ðHoare“pGoin¸ãts“out,˜it“is“also“the“most“dangerous“in“the“longŽ¡‘G!Ârun.Ž©+ð‘R­Ü\When–W³anš¸ãy“new“language“design“pro‘Ž8ject“is“nearing“completion,‘Šnthere“is“alw˜a˜ys“a“madŽ¡‘C­Ûrush–zÿto“get“new“features“added“bšGefore“standardization.‘)The“rush“is“mad“indeed,‘¦ªb˜ecauseŽ¡‘C­Ûit–ˆìleads“inš¸ãto“a“trap“from“whic˜h“there“is“no“escapGe.‘-¤A‘ˆ¸feature“whic˜h“is“omitted“can“alw˜a˜ysŽ¡‘C­ÛbšGe–0ºadded“later,‘g“when“its“design“and“its“implications“are“w¸ãell“understo˜o˜d.‘õA‘0featureŽ¡‘C­Ûwhic¸ãh–5éis“included“bšGefore“it“is“fully“understo˜o˜d“can“nev¸ãer“b˜e“remo•¸ãv“ed‘5élater."É[Hoare80]Ž¦‘*­ÛÄThese–ž›problems“exist“evš¸ãen“when“there“is“a“cen˜tral“authorit˜y‘ÿ*ª.‘M˜If“w˜e“consider“the“case“where“thereŽ¡‘*­Ûis–åHno“cenš¸ãtral“authorit˜y‘ÿ*ª,‘ Dand“users“moGdify“a“language“and“its“implemen˜tations“and“distribute“theŽ¡‘*­ÛmoGdi ed–“Èvš¸ãersions,‘ãdthe“result“is“ev˜en“w˜orse.‘- F‘ÿ*ªor“a“start,‘ãdthe“structure“of“the“genealogy“of“theŽ¡‘*­Ûprogram–F‰cš¸ãhanges“from“a“list“to“a“tree.‘EbThis“mak˜es“it“impšGossible“to“imp˜ose“an“ordering“on“theŽ¡‘*­Ûdi eren•¸ãt›°¡v“ersions˜and˜mak“es˜it˜dicult˜to˜merge˜them˜once˜they˜div“erge.‘ƒªSecond,‘Çtit˜reduces˜theŽ¡‘*­ÛpGortabilitš¸ãy–8of“ les“created“under“di eren˜t“v˜ersions.‘$Third,‘pÑit“mak˜es“adding“features“hazardous.Ž¡‘*­ÛIf–©ma“feature“is“added“in“one“v¸ãersion,‘¾r les“will“bGe“created“that“use“it.‘nThese“ les“will“immediatelyŽ¡‘*­Ûb•Gecome›~7non-p“ortable.‘*F‘ÿ*ªurthermore,‘©=t•¸ãw“o˜programmers˜ma“y˜in“troGduce˜di eren“t˜features˜that˜use˜theŽ¡‘*­Ûsame–²synš¸ãtactical“constructs,‘Óth˜us“prev˜en˜ting“the“t˜w˜o“v˜ersions“from“ev˜er“bGeing“merged.‘ZwhoGevš¸ãer“o˜wns“the“program“doGes“not“upgrade“the“program“ev˜ery“so“often,‘føit“is“actuallyŽ¡‘C­ÛpšGossible–pÞfor“the“released“executables“to“\expire"“when“new“op˜erating“system“upgrades“app˜ear.ŽŸï¡‘*­ÛThese–kêpšGossibilities“mean“that“users“ab˜out“to“in•¸ãv“est–kêin“a“newly“in¸ãtro˜duced“programming“to˜ol“suc¸ãhŽ¡‘*­Ûas›ÛF–ÿ*ªunnelW“eb˜ha•¸ãv“e˜legitimate˜concerns˜when˜they˜w“orry˜ab•Gout˜the˜to“ol's˜a•¸ãv‘ÿqÇailabilit“y–ÿ*ª.‘†XF“or˜non-Ž¡‘*­Ûcommercially–ª}distributed“toGols“sucš¸ãh“as“F–ÿ*ªunnelW“eb,‘Ì©the–ª}simplest“solution“to“this“problem“is“to“mak˜eŽ¡‘*­Ûthe–Ú–source“coGde“aš¸ãv‘ÿqÇailable,‘ó"either“b˜y“placing“it“in˜to“the“public“domain,‘ó"or“b˜y“releasing“it“under“someŽ¡‘*­Ûkind–™ªof“public“license,‘ª¿suc¸ãh“as“a“GNU‘™˜license.‘>ÆThe“trouble“with“releasing“the“source“coGde“is“thatŽ¡‘*­Ûit›x­remo•¸ãv“es˜con“trol˜from˜the˜design˜authorit“y‘ÿ*ª.‘ÛÎOnce˜the˜coGde˜is˜\out"˜there˜is˜no˜stopping˜an“y“oneŽ¡‘*­Ûfrom–UUmošGdifying“the“program“and“distributing“mo˜di ed“vš¸ãersions.‘qÇAll“c˜haos“can“ensue.Ž©_Ú‘*­ÛOne–Àìsolution“to“this“con ict“is“to“takš¸ãe“the“trade“mark“approac˜h.‘´‹This“separates“the“righ˜t“of“theŽ¡‘*­Ûdesign– authoritš¸ãy“to“con˜trol“the“language“and“its“implemen˜tations,‘‘and“the“righ˜t“of“the“users“to“useŽ¡‘*­Ûthe– ¹source“coGde“in“anš¸ãy“w˜a˜y“they“lik˜e“(but“they“ma˜y“ha˜v˜e“to“c˜hange“its“name!).‘YèHo˜w˜ev˜er,‘ the“tradeŽ¡‘*­Ûmark–UUapproacš¸ãh“is“expGensiv˜e.Ž¦‘*­ÛThe–ÙËsolution“that“I‘Ù¬(Ross“Williams“(Êross@spam.adelaide.edu.auÄ))“ha•¸ãv“e–ÙËadopted“is“to“release“theŽ¡‘*­ÛF–ÿ*ªunnelW“eb–5¬source“coGde“under“a“GNU‘5rlicense“and“then“to“write“this“c¸ãhapter“in“the“ÇF‘ÿ;¼unnelWebŽ¡‘*­ÛHacker's‘¼----------+--------------<-------------+Ž¤ ‘5-Õ|(modifications‘?ýby‘ÿô|’’ÿ¬|Ž¡‘5-Õ|‘?ýme)‘Y?ÍV’’ÿ¬|Ž¡‘5-Õ|‘?ñ+----------------------------------+‘/?å|Ž¡‘5-Õ+--<--|‘ úMy–?ýOfficial“Copy“of“FunnelWeb‘¿÷|‘/?å|Ž¡‘T­Ã|‘¿÷Copyright–?ý(C)“Ross“Williams‘ÿô|‘/?å|Ž¡‘T­Ã+----------------------------------+‘/?å|Ž¡’¨­“|–?ý(Periodic“releases)‘$¿ë/“\Ž¡’¨­“V’ˆ²/‘¿÷\‘ úProgrammersŽ¡‘t-±+------------------+‘SÿÐ/Legal\–?ýsign“awayŽ¡‘t-±|–?ýGNU“Release“Copy“|‘SÿÐ\Filte/“copyright“onŽ¡‘t-±+------------------+‘Y?Í\–?ýr“/‘ úmodificationsŽ¡’¨­“|’¿¯\‘?ý/Ž¡’¨­“|–?ý(Modifications“made“by‘?ñ|Ž¡’¨­“V‘ úrandom–?ýprogrammers)“--->--+Ž¡‘ní´+-----------------------+Ž¡‘ní´|–?ýModified“GNU“Version‘ ú|Ž¡‘ní´+-----------------------+ŽŸ"‘R­Ü¸Once–%a“wšÃŽork“is“released“under“GNU‘%license,‘9 all“deriv˜ed“w˜orks“fall“under“GNU‘%license.‘¶fHo˜w˜ev˜er,Ž¡‘C­Ûthis–xödiagram“shošÃŽws“ho˜w“cop˜yrigh˜t“can“bHo•¸ãw“ev“er,‘ 1if–²Òit“turns“out“that“F–ÿ*ªunnelW“eb–²Òis“bšGoth“p˜opular,‘ 1Çand“Äneeds“widespreadŽ¦‘*­ÛmoGdi cations–sÉand“enhancemenš¸ãts,‘{fthen“the“ocial“feedbac˜k“lošGop“describ˜ed“in“the“previous“sectionŽ¦‘*­Ûwill–UUbšGecome“un•¸ãw“ork‘ÿqÇable,–UUand“there“will“b˜e“a“GNU“break¸ãout.ŽŸ‘*­ÛA–URÉGNU‘ÕQbreak®9out“Äwill“ošGccur“if“F–ÿ*ªunnelW“eb–URusers“b˜ecome“organized“enough“and“anno•¸ãy“ed‘URenoughŽ¦‘*­Û(at–Ê¥the“ocial“dev•¸ãelopmen“t–Ê¥cycle)“to“start“mainš¸ãtaining“a“coheren˜t“v˜ersion“of“F–ÿ*ªunnelW“eb‘Ê¥thatŽ¦‘*­Ûdivš¸ãerges–^ffrom“the“ocial“v˜ersion.‘ŒûIf“a“GNU‘^"break˜out“oGccurs,‘ ªI‘^"w˜ould“appreciate,‘ ªas“requestedŽ¦‘*­Ûearlier,–UUthat“a“di erenš¸ãt“name“and“ le“extensions“bGe“c˜hosen“for“the“div˜erging“v˜ersion.Ž¡‘*­Ûâ3.9Ž‘PfSummaryŽŸç‘*­ÛÄDecenš¸ãtralized–ÃámoGdi cations“to“a“programming“language“and“its“implemen˜tations“can“seriouslyŽ¦‘*­Ûdamage–C¾the“language's“pGortabilitš¸ãy“and“seman˜tic“clarit˜y–ÿ*ª.‘kêUnfortunately“,‘GBthere–C¾is“a“tension“bGet˜w˜eenŽ¦‘*­Ûcen•¸ãtralizing›g¢con“trol˜of˜a˜programming˜language˜and˜pro“viding˜source˜coGde˜securit“y˜to˜nerv“ous˜users.Ž¦‘*­ÛIn›|@F–ÿ*ªunnelW“eb,‘…ûthis˜trade-o ˜has˜bGeen˜resolv•¸ãed˜to˜some˜exten“t˜b“y˜releasing˜the˜source˜coGde˜alongŽ¦‘*­Ûwith–çAa“request“that“if“the“functionalit¸ãy“of“the“program“is“mošGdi ed,‘ ¼that“the“program's“name“b˜eŽ¦‘*­Ûcš¸ãhanged–Íand“a“di eren˜t“ le“extension“bGe“c˜hosen“for“input“ les“created“under“the“moGdi ed“program.Ž¦‘*­ÛThe–A*author“of“F–ÿ*ªunnelW“eb–A*has“decided“to“mainš¸ãtain“an“ocial“v˜ersion“of“F–ÿ*ªunnelW“eb–A*o˜v˜er“whic˜h“heŽ¦‘*­Ûwill–¶½oš¸ãwn“cop˜yrigh˜t,‘Ïbut“whic˜h“he“will“release“under“GNU‘¶£license“from“time“to“time.‘•þThis“meansŽ¦‘*­Ûthat›Ȧcop•¸ãyrigh“t˜on˜all˜c“hanges˜to˜F–ÿ*ªunnelW“eb˜m•¸ãust˜bGe˜signed˜o“v“er˜to˜the˜author˜bGefore˜they˜ha“v“eŽ¦‘*­Ûa–ü{c¸ãhance“of“bšGeing“incorp˜orated“in“the“ocial“v¸ãersion.‘g8Finally‘ÿ*ª,‘&Dit“is“p˜ossible“that“this“reluctanceŽ¦‘*­Ûof–ivthe“author“to“remo•¸ãv“e–ivhis“cop•¸ãyrigh“ted›ivv“ersion˜from˜the˜dev“elopmen“t˜cycle˜of˜the˜ocial˜v“ersionŽ¦‘*­Ûwill–7result“in“a“GNU‘#breakš¸ãout“in“whic˜h“a“div˜erging“GNU‘#v˜ersion“of“F–ÿ*ªunnelW“eb–7will“bGe“main˜tainedŽ¦‘*­Ûbš¸ãy–Z­the“GNU‘Z¬comm˜unit˜y‘ÿ*ª.‘ÏThe“author“hopGes“this“w˜on't“bšGe“necessary“and“requests,‘\if“this“happ˜ens,Ž¦‘*­Ûthat–UUthe“divš¸ãerging“GNU“v˜ersion“bGe“renamed.ŽŽŸK’û%41ŽŽŒ‹*ÜàÄ)< ý;ÖÄ ªÝ»ŸK’û%Ä42ŽŽŒ‹+ë¼ Ä)< ý;ÖÄ ªÝ» ý¯Í¹‘*­ÛëJChapter‘óF4ŽŸ7«t‘*­ÛëHF–ýunnelW“eb‘ ‰‹F“utureŽŸ9«t‘*­ÛÄPrevious– cš¸ãhapters“ha˜v˜e“explained“the“design“of“F–ÿ*ªunnelW“eb– and“giv˜en“reasons“for“wh˜y“it“is“the“w˜a˜yŽ¤ ‘*­Ûit–ÄÔis.‘ÀCThis“cš¸ãhapter“goGes“through“eac˜h“of“the“aspGects“of“F–ÿ*ªunnelW“eb,‘à³and–ÄÔexplores“their“problems,Ž¡‘*­Ûhoš¸ãw–UUthey“can“bGe“solv˜ed,“and“lists“oppGortunities“for“impro˜v˜emen˜t.Ž©&˜Ñ‘*­Ûâ4.1Ž‘PfDouÂcumenŠ=tationŽŸ’‘*­ÛÉAn–ýÎocial“example:‘ÄA‘™¼ocial–™ëexample“program“written“using“F–ÿ*ªunnelW“eb–™ëshould“bGe“constructedŽ¡‘*­Ûand–UUmade“a¸ãv‘ÿqÇailable.ŽŸ«t‘*­ÛÉIndex‘ °program:‘ŠÄIn–axorder“to“t¸ãypšGeset“the“do˜cumen¸ãtation,‘¤a“p˜ortable“index“sorting“program“isŽ¡‘*­Ûrequired.›RÛOne–Kshould“bGe“written“and“added“to“the“distribution“kit.˜P¸ãerhaps“this“could“bGe“theŽ¡‘*­Ûocial‘UUexample!Ž¦‘*­Ûâ4.2Ž‘PfCommand–…Line“InŠ=terfaceŽŸ’‘*­ÛÉBu er‘˜×length:‘WzÄCurrenš¸ãtly– ¼the“F–ÿ*ªunnelW“eb– ¼shell“uses“the“ÊCOMLINE‘¡E‰ff&fŽ‘Ç«MAX‘ ®Äconstan˜t“to“size“its“in˜ternalŽ¡‘*­Ûcommand–äìline“bu ers.› ‹This“is“un¸ãtenable.˜The“maxim¸ãum“length“of“a“shell“command“line“shouldŽ¡‘*­Ûnot–UUbšGe“mac¸ãhine“dep˜enden¸ãt.ŽŸ«t‘*­ÛÉAn®9tiquated‘õªF‘ÿ «eatures:‘ªÄAs–qsthe“F–ÿ*ªunnelW“eb–qslanguage“devš¸ãelops,‘x{it“is“lik˜ely“that“some“c˜hanges“willŽ¡‘*­Ûha•¸ãv“e–œ8to“bšGe“made“that“will“render“one“or“more“language“constructs“obsolete.‘FoWhen“this“happ˜ens,Ž¡‘*­Ûit–âma¸ãy“bšGe“necessary“to“add“a“command“line“option“that“has“the“p˜o•¸ãw“er–âto“turn“on“and“o “w¸ãarningsŽ¡‘*­Ûor–UUerrors“ agging“an¸ãtiquated“features.Ž¦‘*­Ûâ4.3Ž‘PfShell‘…InŠ=terpreterŽŸ’‘*­ÛÉSET‘ÿ «ALL‘×command:‘2ŒÄWhen–5¸writing“F–ÿ*ªunnelW“eb–5¸scripts,‘mÐit“is“sometimes“desirable“to“set“Çal‘‚Øl“ÄofŽ¡‘*­ÛF–ÿ*ªunnelW“eb's–ooptions“to“some“particular“v‘ÿqÇalue“so“that“the“script“is“not“vulnerable“to“c¸ãhanges“inŽ¡‘*­ÛF–ÿ*ªunnelW“eb's–Êhdefault“v‘ÿqÇalues“whicš¸ãh“migh˜t“oGccur“from“time“to“time.‘ÑT‘ÿ*ªo“this“end,‘ç­it“ma˜y“bGe“w˜orthŽ¡‘*­Ûcreating–ÿÃa“\ÊSETALLÄ"›ÿ­command“that“is“iden¸ãtical“to“the“\ÊSETÄ"˜command“except“that“it“will“generateŽ¡‘*­Ûan–UUerror“if“the“v‘ÿqÇalue“of“an“option“is“not“spGeci ed“explicitly‘ÿ*ª.Ž¤«t‘*­ÛÉRecursion‘ÕTtest:‘qÇÄA–UUtest“should“bGe“added“to“test“for“recursivš¸ãe“in˜v˜oGcation“in“a“shellscript.Ž¡‘*­ÛÉDiagnostic‘s­coun®9ting:‘GRÄThe–jcoGde“for“counš¸ãting“diagnostics“in“the“script“in˜terpreter“is“rather“messyŽ© ‘*­Ûand–UUpšGerhaps“ev¸ãen“buggy‘ÿ*ª.‘qÇIt“should“b˜e“cleaned“up“and“commen¸ãted.Ž¡‘*­ÛÉArgumen•®9t‘IScoun“ting:‘;ƒÄIn–º3the“Êcommand.c“ÄmoGdule,‘Ójthere“is“a“v‘ÿqÇariable“that“counš¸ãts“the“argumen˜tsŽ¦‘*­Ûto–lˆa“command.‘·_Currenš¸ãtly“it“tak˜es“the“v‘ÿqÇalue“of“the“n˜um˜bGer“of“parameters“including“the“commandŽŽŸK’û%43ŽŽŒ‹,ì  Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÄvš¸ãerb.‘gãThis–7ªhas“turned“out“to“mak˜e“the“cošGde“less“readable.‘gãIt“should“b˜e“c¸ãhanged“to“b˜e“the“n•¸ãum“b˜erŽ¤ ‘*­Ûof–UUargumenš¸ãts“to“the“command“v˜erb.Ž©‘á‘*­ÛÉMak•®9e‘‘èfacilit“y:‘TwÄIt–´maš¸ãy“bGe“w˜orth“building“some“sort“of“mak˜e“facilit˜y“in˜to“the“script“language“so“asŽ¡‘*­Ûto–UUsuppGort“macš¸ãhines“suc˜h“as“the“Macin˜tosh“that“do“not“already“ha˜v˜e“this“facilit˜y‘ÿ*ª.Ž¦‘*­ÛÉSignature‘r’ le:‘F×ÄOne–ÿuproblem“with“using“F–ÿ*ªunnelW“eb–ÿuin“conjunction“with“an“external“ÊMake“Äfacilit¸ãyŽ¡‘*­Ûis–­ûthat“a“user“mighš¸ãt“c˜hange“a“F–ÿ*ªunnelW“eb–­ûsource“ le“without“making“c˜hanges“that“will“a ect“theŽ¡‘*­Û les–žåthat“it“generates.‘NvIf“F–ÿ*ªunnelW“eb–žåis“then“run“and“the“\Ê+DÄ"‘žÒoption“is“on,‘±Hthen“the“output“ lesŽ¡‘*­Ûwill–úWbšGe“deleted“(to“a•¸ãv“oid–úWfurther“ÊMake“Äpropagations).‘`ÎIf“ÊMake“Äthen“has“a“pro˜duction“linking“theŽ¡‘*­ÛÊ.fw–ÖÄ le“to“its“output“ les,‘!¼then“it“maš¸ãy“conclude“that“the“output“ les“are“still“out“of“date.‘\HT‘ÿ*ªo“solv˜eŽ¡‘*­Ûthe›ñUproblem,‘TF–ÿ*ªunnelW“eb˜could˜bGe˜c•¸ãhanged˜to˜write˜a˜Ê.sig˜Ä le˜whenev“er˜it˜proGcesses˜a˜Ê.fw˜Ä le.Ž¡‘*­ÛThe–UÜÊMake“ÄprošGduction“could“then“b˜e“wired“up“to“link“the“Ê.fw“Ä le“to“the“Ê.sig“Ä le“instead“of“to“theŽ¡‘*­Ûoutput‘UU les.ŽŸ(Ý°‘*­Ûâ4.4Ž‘PfLanguage‘…DesignŽŸ·Ê‘*­ÛÄSome–b*propšGosed“c¸ãhanges“to“F–ÿ*ªunnelW“eb–b*do“not“corresp˜ond“to“an¸ãy“particular“comp˜onen¸ãt“of“F‘ÿ*ªunnel-Ž¡‘*­ÛW‘ÿ*ªeb–UUand“are“really“to“do“with“the“design“of“the“input“language.Ž¦‘*­ÛÉOutput–ëµor“ le?:‘ 4ÄThe–Š/\Ê@OÄ"‘‰ûspGecial“sequence“for“de ning“an“output“ le“is“somewhat“non-mnemonicŽ¡‘*­Ûand–UUcan“bšGe“confused“with“zero“(\Ê0Ä").‘qÇP¸ãerhaps“it“should“b˜e“replaced“b¸ãy“the“\Ê@FÄ"“sequence.Ž¦‘*­ÛÉSyn®9tax–*“of“section“names:‘ÄCurrenš¸ãtly–Ÿusection“names“use“the“same“syn˜tax“as“macro“names.‘P'F‘ÿ*ªorŽ¡‘*­Ûexample–Œ\Ê@Ä".‘¾kIt“can“bšGe“argued“that“angle“brac•¸ãk“ets–Œshould“b˜e“reserv¸ãed“only“for“macroŽ¡‘*­Ûnames–¶and“that“some“other“syn¸ãtax“should“bGe“found“for“delimiting“section“names.‘‚êThis“is“not“aŽ¡‘*­Ûclear–½éissue.‘?NIt“could“also“bšGe“argued“that“they“are“b˜oth“names,‘Ü2and“that“b˜ecause“sections“can“inheritŽ¡‘*­Ûtheir–UUnames“from“the“macros“they“conš¸ãtain,“that“the“names“are“of“the“same“\t˜ypGe".Ž¦‘*­ÛÉOne–¦Åmacro“pQÇer“section:‘]‰ÄOne–,Ùparticular“stš¸ãyle“of“using“F–ÿ*ªunnelW“eb–,Ùis“to“ha˜v˜e“at“most“one“macroŽ¡‘*­Ûde nition–úFpšGer“section.‘SmIt“ma¸ãy“b˜e“w¸ãorth“adding“a“pragma“that“instructs“F–ÿ*ªunnelW“eb–úFto“enforce“this.Ž¦‘*­ÛÉShould–(ý@Æf“Ésuppress“EOL?:‘GÄWhen–žde ning“a“macro“in“F–ÿ*ªunnelW“eb,‘°Eit–žseems“to“bGe“rule“ratherŽ¡‘*­Ûthan–Wãthe“exception“that“the“\Ê@ÆfÄ"“bGe“follo•¸ãw“ed›Wãb“y˜\Ê@-Ä".‘yqThis˜suppresses˜the˜EOL‘Wâon˜the˜de nitionŽ¡‘*­Ûline,‘"allo¸ãwing–2the“ rst“line“of“the“macro“to“bšGe“placed“immediately“ab˜o•¸ãv“e–2and“in“line“with“the“otherŽ¡‘*­Ûlines–¢without“inš¸ãtroGducing“an“EOL‘oat“the“start“of“the“macro“text.‘¾­One“option“is“to“in˜troGduce“aŽ¡‘*­Ûpragma–UUto“determine“whether“to“suppress“EOLs“follo¸ãwing“\Ê@ÆfÄ".Ž¦‘*­ÛÉPragma‘öÊsyn®9tax:‘i/ÄIt–Q is“not“clear“hoš¸ãw“\loGose"“the“syn˜tax“of“pragmas“should“bGe.‘däP˜erhaps“theyŽ¡‘*­Ûshould–UUbGe“case“insensitiv¸ãe.Ž¦‘*­ÛÉConditionals:‘‰ÄDepšGending–(6on“demand,‘\îit“ma¸ãy“b˜e“wš¸ãorth“rein˜troGducing“some“sort“of“conditionalŽ¡‘*­Ûfeature–âinš¸ãto“F–ÿ*ªunnelW“eb.‘Ho˜w˜ev˜er,‘Iit–âw˜ould“ha˜v˜e“to“bGe“v˜ery“simple“to“compGete“with“the“v‘ÿqÇariousŽ¡‘*­Ûw•¸ãa“ys–UUin“whic¸ãh“conditionals“can“already“bGe“fudged“within“F–ÿ*ªunnelW“eb–UUas“it“stands.Ž¦‘*­ÛÉFile‘ƒmark®9ers:‘Õ9ÄIt–‡mighš¸ãt“bGe“w˜orth“mošGdifying“the“language“so“that“a“sp˜ecial“synš¸ãtactical“mark˜er“isŽ¡‘*­Ûrequired–n at“the“start“and“end“of“ les.‘$¶This“will“assist“in“detecting“truncations“and“other“corruptions.Ž¦‘*­ÛÉF‘ÿ «ormal–wyparameter“lists:‘HøÄIt–¸mighš¸ãt“bGe“w˜orth“c˜hanging“o˜v˜er“to“a“syn˜tax“for“formal“parameter“listsŽ¡‘*­Ûthat–äèdošGes“not“require“the“Ê@(“Äand“Ê@)Ä.‘ €Ho•¸ãw“ev“er,‘Íthey–äècould“b˜e“retained“as“optional“for“bac•¸ãkw“ardŽ¡‘*­Ûcompatibilit¸ãy‘ÿ*ª.ŽŸ(Ý°‘*­Ûâ4.5Ž‘PfScanner/MappuÂerŽŸ·Ê‘*­ÛÉAll–sªnon-con®9tiguous“mappings:‘…%ÄCurren¸ãtly›ßF–ÿ*ªunnelW“eb˜requires˜that˜all˜input˜ les˜b•Ge˜mapp“edŽ¡‘*­Ûinš¸ãto–¹ea“con˜tiguous“lump“of“memory‘ÿ*ª.‘÷This“caused“problems“for“t˜w˜o“reasons.‘÷First,›Òito“do“this,˜oneŽ¡‘*­Ûhas–Ηto“alloGcate“the“memory“ rst,›éŠand“to“do“that,˜yš¸ãou“ha˜v˜e“to“kno˜w“ho˜w“long“the“ le“is,‘éŠand“it“turnsŽ¡‘*­Ûout–\…that“ nding“out“the“length“of“a“ le“in“a“pGortable“manner“is“vš¸ãery“inecien˜t.‘‡WSecond,‘^QalthoughŽŽŸK’û%44ŽŽŒ‹-÷o Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÄIBM–-sPC“compatibles–-}maš¸ãy“ha˜v˜e“megab˜ytes“of“memory‘ÿ*ª,‘5uit“is“segmen˜ted“in˜to“bloGc˜ks“of“at“most“64K.Ž¤ ‘*­ÛThis–UUmeans“that“F–ÿ*ªunnelW“eb–UUcurren¸ãtly“cannot“read“a“ le“longer“than“64K“on“a“PC.Ž©—Z‘*­ÛThese–v½problems“could“bšGe“a•¸ãv“oided–v½if“the“mapp˜er“and“scanner“wš¸ãere“reorganized“to“allo˜w“input“ lesŽ¡‘*­Ûto–UUbGe“read“in“and“stored“as“a“linkš¸ãed“list“of“c˜h˜unks“of“text“rather“than“a“con˜tiguous“bloGc˜k.Ž¦‘*­ÛÉEOL‘k¨is‘kÂunspQÇeci able:‘CáÄF–ÿ*ªunnelW“eb–ùˆuses“ASCIGI‘ùqcš¸ãharacter“decimal“ten“(10)“in˜ternally“to“represen˜tŽ¡‘*­Ûlogical–&end-of-line“and“is“currenš¸ãtly“organized“so“that“if“one“of“these“is“inserted“in˜to“the“text“b˜y“theŽ¡‘*­Ûuser–Î-using“a“\Ê@^D(10)Ä",›é5it“will“bGe“written“out“as“a“logical“end“of“line,˜rather“than“as“a“single“ASCIGIŽ¡‘*­Ûc¸ãharacter–UU10.‘qÇThis“should“bGe“ xed.Ž¦‘*­ÛÉAlloš®9w–ò^mnemonics“for“unprin˜tables:‘¤HÄF–ÿ*ªunnelW“eb–n•alloš¸ãws“users“to“insert“unprin˜table“c˜haractersŽ¡‘*­Ûinš¸ãto–æDthe“output“using“the“\Ê@^D(ddd)Ä"“spGecial“sequence.‘$“P˜erhaps“it“w˜ould“bGe“c˜hanged“so“that“itŽ¡‘*­Ûunderstands–UUASCIGI“standard“mnemonics“sucš¸ãh“as“\ÊLFÄ"“as“w˜ell“as“ASCIGI“n˜um˜bGers.Ž¦‘*­ÛÉV‘ÿ «ersion‘]Æpragma:‘_ÄA‘ËÝ\ÊversionÄ"–Ëûpragma“should“bšGe“added“that“allo¸ãws“the“user“to“sp˜ecify“in“theŽ¡‘*­Ûinput–¶q le“the“vš¸ãersion“of“F–ÿ*ªunnelW“eb–¶qthat“w˜as“around“when“the“input“ le“w˜as“created.‘•A˜t“a“laterŽ¡‘*­Ûdate,‘£Bsucš¸ãh–“¬a“construct“w˜ould“bGe“v˜ery“useful“for“determining“ho˜w“an“input“ le“should“bšGe“up˜datedŽ¡‘*­Ûif–UUthe“F–ÿ*ªunnelW“eb–UUlanguage“has“cš¸ãhanged“bGet˜w˜een“v˜ersions.Ž¤(îò‘*­Ûâ4.6Ž‘PfPŠ=arserŽ©¿Ÿ‘*­ÛÄThere–UUare“no“propšGosals“to“c¸ãhange“the“parser“except“as“a“consequence“of“other“prop˜osals.Ž¡‘*­Ûâ4.7Ž‘PfAnalyserŽ¦‘*­ÛÉRecursion‘?Àdetection:‘0¾ÄCurren¸ãtly–ÓCthe“F–ÿ*ªunnelW“eb–ÓCanalyser“ ags,›íGwith“an“error,˜all“macros“with“anŽ¤ ‘*­Ûin nite–·Lexpansion.‘=This“w¸ãould“bšGe“b˜est“c¸ãhanged“to“ agging“all“macros“that“are“directly“or“indirectlyŽ¡‘*­Ûrecursiv¸ãe.‘@³T›ÿ*ªo–Âdo“this,‘ߊT˜arjan's“algorithmÉ[T‘ÿ «arjan72]“Äfor“the“detection“of“strong“compGonen¸ãts“shouldŽ¡‘*­ÛbGe‘UUinstalled.ŽŸ—Z‘*­ÛÉOnce– ionly“macros:‘ÏÖÄBy–„\default“F–ÿ*ªunnelW“eb›„\prev•¸ãen“ts˜a˜macro˜from˜bGeing˜called˜more˜than˜onceŽ¡‘*­Ûunless–I£it“has“a“\Ê@MÄ"‘I assošGciated“with“it.‘máHo•¸ãw“ev“er,‘KúF–ÿ*ªunnelW“eb–I£do˜es“alloš¸ãw“a“macro“that“calls“suc˜h“aŽ¡‘*­Ûmacro–UUto“bšGe“called“more“than“once.‘qÇP¸ãerhaps“this“\lo˜ophole"“should“b˜e“plugged“someho¸ãw.ŽŸ(îò‘*­Ûâ4.8Ž‘PfT‘þž¸angleŽ¦‘*­ÛÄThe–ÓHT›ÿ*ªangler“is“one“of“the“cleanest“compGonen¸ãts“of“F˜unnelW˜eb,‘íJas“basically“all“it“has“to“do“is“expandŽ¡‘*­Ûsome–UUvš¸ãery“w˜ell-de ned“macros.ŽŸ—Z‘*­ÛÉT‘ÿ «ext‘Šéinden®9tation:‘jÊÄCurren¸ãtly›ÑÖF–ÿ*ªunnelW“eb˜suppGorts˜Çno–ñøindentation˜Äand˜Çblank“indentationÄ.‘çKAŽ¡‘*­Ûthird–ôform“could“bGe“added“if“it“w¸ãas“considered“necessary‘ÿ*ª.‘OEÇT‘ÿ;¼ext‘&Uindentation“Äis“the“same“as“ÇblankŽ¡‘*­Ûindentation– ÔÄexcept“that“instead“of“indenš¸ãting“with“blanks,‘³´F–ÿ*ªunnelW“eb– Ôw˜ould“inden˜t“with“the“textŽ¡‘*­Ûto–éWthe“left“of“the“called“macro.‘-ÍThis“facilitš¸ãy“could“bGe“useful“for“commen˜ting“out“large“b•Go“dies‘éWofŽ¡‘*­Ûtext–€…in“languages“that“do“not“ha•¸ãv“e›€…m“ulti-line˜commen“ts˜(e.g.–óWAda).“A‘€zdiscussion˜of˜the˜pros˜andŽ¡‘*­Ûcons–UUof“this“form“of“inden¸ãtation“appGears“earlier.ŽŸ(îò‘*­Ûâ4.9Ž‘PfW‘þž¸ea•Š=v“eŽ¦‘*­ÛÄP¸ãerhaps›UUF–ÿ*ªunnelW“eb's˜w•¸ãeak“est˜aspGect˜is˜its˜t“ypGesetting˜facilit“y‘ÿ*ª.ŽŸ—Z‘*­ÛÉAlign–,£table“of“con•®9ten“ts:‘ ŸÄWhen›¡AF–ÿ*ªunnelW“eb˜generates˜a˜table˜of˜con•¸ãten“ts,‘´  Ä)< ý;ÖÄ ªÝ» ýk"E‘5-ÕÊFor–?ýexample,“if“you“distribute“copies“of“such“a“program,“whetherŽ¤ ‘*­Ûgratis–?ýor“for“a“fee,“you“must“give“the“recipients“all“the“rights“thatŽ¡‘*­Ûyou–?ýhave.‘ ú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.Ž©‘5-ÕWe–?ýprotect“your“rights“with“two“steps:“(1)“copyright“the“software,“andŽ¡‘*­Û(2)–?ýoffer“you“this“license“which“gives“you“legal“permission“to“copy,Ž¡‘*­Ûdistribute–?ýand/or“modify“the“software.Ž¦‘5-ÕAlso,–?ýfor“each“author's“protection“and“ours,“we“want“to“make“certainŽ¡‘*­Ûthat–?ýeveryone“understands“that“there“is“no“warranty“for“this“freeŽ¡‘*­Ûsoftware.‘ úIf–?ýthe“software“is“modified“by“someone“else“and“passed“on,“weŽ¡‘*­Ûwant–?ýits“recipients“to“know“that“what“they“have“is“not“the“original,“soŽ¡‘*­Ûthat–?ýany“problems“introduced“by“others“will“not“reflect“on“the“originalŽ¡‘*­Ûauthors'‘?ýreputations.Ž¦‘5-ÕFinally,–?ýany“free“program“is“threatened“constantly“by“softwareŽ¡‘*­Ûpatents.‘ úWe–?ýwish“to“avoid“the“danger“that“redistributors“of“a“freeŽ¡‘*­Ûprogram–?ýwill“individually“obtain“patent“licenses,“in“effect“making“theŽ¡‘*­Ûprogram–?ýproprietary.‘ úTo“prevent“this,“we“have“made“it“clear“that“anyŽ¡‘*­Ûpatent–?ýmust“be“licensed“for“everyone's“free“use“or“not“licensed“at“all.Ž¦‘5-ÕThe–?ýprecise“terms“and“conditions“for“copying,“distribution“andŽ¡‘*­Ûmodification‘?ýfollow.Ž¦‘?­ÏGNU–?ýGENERAL“PUBLIC“LICENSEŽ¡‘:mÒTERMS–?ýAND“CONDITIONS“FOR“COPYING,“DISTRIBUTION“AND“MODIFICATIONŽ¦‘5-Õ0.–?ýThis“License“applies“to“any“program“or“other“work“which“containsŽ¡‘*­Ûa–?ýnotice“placed“by“the“copyright“holder“saying“it“may“be“distributedŽ¡‘*­Ûunder–?ýthe“terms“of“this“General“Public“License.‘ úThe“"Program",“below,Ž¡‘*­Ûrefers–?ýto“any“such“program“or“work,“and“a“"work“based“on“the“Program"Ž¡‘*­Ûmeans–?ýeither“the“Program“or“any“derivative“work“under“copyright“law:Ž¡‘*­Ûthat–?ýis“to“say,“a“work“containing“the“Program“or“a“portion“of“it,Ž¡‘*­Ûeither–?ýverbatim“or“with“modifications“and/or“translated“into“anotherŽ¡‘*­Ûlanguage.‘ ú(Hereinafter,–?ýtranslation“is“included“without“limitation“inŽ¡‘*­Ûthe–?ýterm“"modification".)‘ úEach“licensee“is“addressed“as“"you".Ž¦‘*­ÛActivities–?ýother“than“copying,“distribution“and“modification“are“notŽ¡‘*­Ûcovered–?ýby“this“License;“they“are“outside“its“scope.‘ úThe“act“ofŽ¡‘*­Ûrunning–?ýthe“Program“is“not“restricted,“and“the“output“from“the“ProgramŽ¡‘*­Ûis–?ýcovered“only“if“its“contents“constitute“a“work“based“on“theŽ¡‘*­ÛProgram–?ý(independent“of“having“been“made“by“running“the“Program).Ž¡‘*­ÛWhether–?ýthat“is“true“depends“on“what“the“Program“does.Ž¦‘5-Õ1.–?ýYou“may“copy“and“distribute“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“and“disclaimer“of“warranty;“keep“intact“all“theŽ¡‘*­Ûnotices–?ýthat“refer“to“this“License“and“to“the“absence“of“any“warranty;Ž¡‘*­Ûand–?ýgive“any“other“recipients“of“the“Program“a“copy“of“this“LicenseŽ¡‘*­Ûalong–?ýwith“the“Program.Ž¦‘*­ÛYou–?ýmay“charge“a“fee“for“the“physical“act“of“transferring“a“copy,“andŽ¡‘*­Ûyou–?ýmay“at“your“option“offer“warranty“protection“in“exchange“for“a“fee.ŽŽŸK’û%Ä50ŽŽŒ‹3Fö Ä)< ý;ÖÄ ªÝ» ýk"E‘5-ÕÊ2.–?ýYou“may“modify“your“copy“or“copies“of“the“Program“or“any“portionŽ¤ ‘*­Ûof–?ýit,“thus“forming“a“work“based“on“the“Program,“and“copy“andŽ¡‘*­Ûdistribute–?ýsuch“modifications“or“work“under“the“terms“of“Section“1Ž¡‘*­Ûabove,–?ýprovided“that“you“also“meet“all“of“these“conditions:Ž©‘?­Ïa)–?ýYou“must“cause“the“modified“files“to“carry“prominent“noticesŽ¡‘?­Ïstating–?ýthat“you“changed“the“files“and“the“date“of“any“change.Ž¦‘?­Ïb)–?ýYou“must“cause“any“work“that“you“distribute“or“publish,“that“inŽ¡‘?­Ïwhole–?ýor“in“part“contains“or“is“derived“from“the“Program“or“anyŽ¡‘?­Ïpart–?ýthereof,“to“be“licensed“as“a“whole“at“no“charge“to“all“thirdŽ¡‘?­Ïparties–?ýunder“the“terms“of“this“License.Ž¦‘?­Ïc)–?ýIf“the“modified“program“normally“reads“commands“interactivelyŽ¡‘?­Ïwhen–?ýrun,“you“must“cause“it,“when“started“running“for“suchŽ¡‘?­Ïinteractive–?ýuse“in“the“most“ordinary“way,“to“print“or“display“anŽ¡‘?­Ïannouncement–?ýincluding“an“appropriate“copyright“notice“and“aŽ¡‘?­Ïnotice–?ýthat“there“is“no“warranty“(or“else,“saying“that“you“provideŽ¡‘?­Ïa–?ýwarranty)“and“that“users“may“redistribute“the“program“underŽ¡‘?­Ïthese–?ýconditions,“and“telling“the“user“how“to“view“a“copy“of“thisŽ¡‘?­ÏLicense.‘ ú(Exception:–?ýif“the“Program“itself“is“interactive“butŽ¡‘?­Ïdoes–?ýnot“normally“print“such“an“announcement,“your“work“based“onŽ¡‘?­Ïthe–?ýProgram“is“not“required“to“print“an“announcement.)Ž¦‘*­ÛThese–?ýrequirements“apply“to“the“modified“work“as“a“whole.‘ úIfŽ¡‘*­Ûidentifiable–?ýsections“of“that“work“are“not“derived“from“the“Program,Ž¡‘*­Ûand–?ýcan“be“reasonably“considered“independent“and“separate“works“inŽ¡‘*­Ûthemselves,–?ýthen“this“License,“and“its“terms,“do“not“apply“to“thoseŽ¡‘*­Ûsections–?ýwhen“you“distribute“them“as“separate“works.‘ úBut“when“youŽ¡‘*­Ûdistribute–?ýthe“same“sections“as“part“of“a“whole“which“is“a“work“basedŽ¡‘*­Ûon–?ýthe“Program,“the“distribution“of“the“whole“must“be“on“the“terms“ofŽ¡‘*­Ûthis–?ýLicense,“whose“permissions“for“other“licensees“extend“to“theŽ¡‘*­Ûentire–?ýwhole,“and“thus“to“each“and“every“part“regardless“of“who“wrote“it.Ž¦‘*­ÛThus,–?ýit“is“not“the“intent“of“this“section“to“claim“rights“or“contestŽ¡‘*­Ûyour–?ýrights“to“work“written“entirely“by“you;“rather,“the“intent“is“toŽ¡‘*­Ûexercise–?ýthe“right“to“control“the“distribution“of“derivative“orŽ¡‘*­Ûcollective–?ýworks“based“on“the“Program.Ž¦‘*­ÛIn–?ýaddition,“mere“aggregation“of“another“work“not“based“on“the“ProgramŽ¡‘*­Ûwith–?ýthe“Program“(or“with“a“work“based“on“the“Program)“on“a“volume“ofŽ¡‘*­Ûa–?ýstorage“or“distribution“medium“does“not“bring“the“other“work“underŽ¡‘*­Ûthe–?ýscope“of“this“License.Ž¦‘5-Õ3.–?ýYou“may“copy“and“distribute“the“Program“(or“a“work“based“on“it,Ž¡‘*­Ûunder–?ýSection“2)“in“object“code“or“executable“form“under“the“terms“ofŽ¡‘*­ÛSections–?ý1“and“2“above“provided“that“you“also“do“one“of“the“following:Ž¦‘?­Ïa)–?ýAccompany“it“with“the“complete“corresponding“machine-readableŽ¡‘?­Ïsource–?ýcode,“which“must“be“distributed“under“the“terms“of“SectionsŽ¡‘?­Ï1–?ýand“2“above“on“a“medium“customarily“used“for“software“interchange;“or,Ž¦‘?­Ïb)–?ýAccompany“it“with“a“written“offer,“valid“for“at“least“threeŽ¡‘?­Ïyears,–?ýto“give“any“third“party,“for“a“charge“no“more“than“yourŽ¡‘?­Ïcost–?ýof“physically“performing“source“distribution,“a“completeŽ¡‘?­Ïmachine-readable–?ýcopy“of“the“corresponding“source“code,“to“beŽŽŸK’û%Ä51ŽŽŒ‹4Tr Ä)< ý;ÖÄ ªÝ» ý_"E‘?­ÏÊdistributed–?ýunder“the“terms“of“Sections“1“and“2“above“on“a“mediumŽ¤ ‘?­Ïcustomarily–?ýused“for“software“interchange;“or,Ž©‘?­Ïc)–?ýAccompany“it“with“the“information“you“received“as“to“the“offerŽ¡‘?­Ïto–?ýdistribute“corresponding“source“code.‘ ú(This“alternative“isŽ¡‘?­Ïallowed–?ýonly“for“noncommercial“distribution“and“only“if“youŽ¡‘?­Ïreceived–?ýthe“program“in“object“code“or“executable“form“with“suchŽ¡‘?­Ïan–?ýoffer,“in“accord“with“Subsection“b“above.)Ž¦‘*­ÛThe–?ýsource“code“for“a“work“means“the“preferred“form“of“the“work“forŽ¡‘*­Ûmaking–?ýmodifications“to“it.‘ úFor“an“executable“work,“complete“sourceŽ¡‘*­Ûcode–?ýmeans“all“the“source“code“for“all“modules“it“contains,“plus“anyŽ¡‘*­Ûassociated–?ýinterface“definition“files,“plus“the“scripts“used“toŽ¡‘*­Ûcontrol–?ýcompilation“and“installation“of“the“executable.‘ úHowever,“as“aŽ¡‘*­Ûspecial–?ýexception,“the“source“code“distributed“need“not“includeŽ¡‘*­Ûanything–?ýthat“is“normally“distributed“(in“either“source“or“binaryŽ¡‘*­Ûform)–?ýwith“the“major“components“(compiler,“kernel,“and“so“on)“of“theŽ¡‘*­Ûoperating–?ýsystem“on“which“the“executable“runs,“unless“that“componentŽ¡‘*­Ûitself–?ýaccompanies“the“executable.Ž¦‘*­ÛIf–?ýdistribution“of“executable“or“object“code“is“made“by“offeringŽ¡‘*­Ûaccess–?ýto“copy“from“a“designated“place,“then“offering“equivalentŽ¡‘*­Ûaccess–?ýto“copy“the“source“code“from“the“same“place“counts“asŽ¡‘*­Ûdistribution–?ýof“the“source“code,“even“though“third“parties“are“notŽ¡‘*­Ûcompelled–?ýto“copy“the“source“along“with“the“object“code.Ž¦‘5-Õ4.–?ýYou“may“not“copy,“modify,“sublicense,“or“distribute“the“ProgramŽ¡‘*­Ûexcept–?ýas“expressly“provided“under“this“License.‘ úAny“attemptŽ¡‘*­Ûotherwise–?ýto“copy,“modify,“sublicense“or“distribute“the“Program“isŽ¡‘*­Ûvoid,–?ýand“will“automatically“terminate“your“rights“under“this“License.Ž¡‘*­ÛHowever,–?ýparties“who“have“received“copies,“or“rights,“from“you“underŽ¡‘*­Ûthis–?ýLicense“will“not“have“their“licenses“terminated“so“long“as“suchŽ¡‘*­Ûparties–?ýremain“in“full“compliance.Ž¦‘5-Õ5.–?ýYou“are“not“required“to“accept“this“License,“since“you“have“notŽ¡‘*­Ûsigned–?ýit.‘ úHowever,“nothing“else“grants“you“permission“to“modify“orŽ¡‘*­Ûdistribute–?ýthe“Program“or“its“derivative“works.‘ úThese“actions“areŽ¡‘*­Ûprohibited–?ýby“law“if“you“do“not“accept“this“License.‘ úTherefore,“byŽ¡‘*­Ûmodifying–?ýor“distributing“the“Program“(or“any“work“based“on“theŽ¡‘*­ÛProgram),–?ýyou“indicate“your“acceptance“of“this“License“to“do“so,“andŽ¡‘*­Ûall–?ýits“terms“and“conditions“for“copying,“distributing“or“modifyingŽ¡‘*­Ûthe–?ýProgram“or“works“based“on“it.Ž¦‘5-Õ6.–?ýEach“time“you“redistribute“the“Program“(or“any“work“based“on“theŽ¡‘*­ÛProgram),–?ýthe“recipient“automatically“receives“a“license“from“theŽ¡‘*­Ûoriginal–?ýlicensor“to“copy,“distribute“or“modify“the“Program“subject“toŽ¡‘*­Ûthese–?ýterms“and“conditions.‘ úYou“may“not“impose“any“furtherŽ¡‘*­Ûrestrictions–?ýon“the“recipients'“exercise“of“the“rights“granted“herein.Ž¡‘*­ÛYou–?ýare“not“responsible“for“enforcing“compliance“by“third“parties“toŽ¡‘*­Ûthis‘?ýLicense.Ž¦‘5-Õ7.–?ýIf,“as“a“consequence“of“a“court“judgment“or“allegation“of“patentŽ¡‘*­Ûinfringement–?ýor“for“any“other“reason“(not“limited“to“patent“issues),Ž¡‘*­Û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Ž¡‘*­Ûdistribute–?ýso“as“to“satisfy“simultaneously“your“obligations“under“thisŽŽŸK’û%Ä52ŽŽŒ‹5b7 Ä)< ý;ÖÄ ªÝ» ý_"E‘*­ÛÊLicense–?ýand“any“other“pertinent“obligations,“then“as“a“consequence“youŽ¤ ‘*­Ûmay–?ýnot“distribute“the“Program“at“all.‘ úFor“example,“if“a“patentŽ¡‘*­Ûlicense–?ýwould“not“permit“royalty-free“redistribution“of“the“Program“byŽ¡‘*­Ûall–?ýthose“who“receive“copies“directly“or“indirectly“through“you,“thenŽ¡‘*­Ûthe–?ýonly“way“you“could“satisfy“both“it“and“this“License“would“be“toŽ¡‘*­Ûrefrain–?ýentirely“from“distribution“of“the“Program.Ž©‘*­ÛIf–?ýany“portion“of“this“section“is“held“invalid“or“unenforceable“underŽ¡‘*­Ûany–?ýparticular“circumstance,“the“balance“of“the“section“is“intended“toŽ¡‘*­Ûapply–?ýand“the“section“as“a“whole“is“intended“to“apply“in“otherŽ¡‘*­Ûcircumstances.Ž¦‘*­ÛIt–?ýis“not“the“purpose“of“this“section“to“induce“you“to“infringe“anyŽ¡‘*­Ûpatents–?ýor“other“property“right“claims“or“to“contest“validity“of“anyŽ¡‘*­Ûsuch–?ýclaims;“this“section“has“the“sole“purpose“of“protecting“theŽ¡‘*­Ûintegrity–?ýof“the“free“software“distribution“system,“which“isŽ¡‘*­Ûimplemented–?ýby“public“license“practices.‘ úMany“people“have“madeŽ¡‘*­Ûgenerous–?ýcontributions“to“the“wide“range“of“software“distributedŽ¡‘*­Ûthrough–?ýthat“system“in“reliance“on“consistent“application“of“thatŽ¡‘*­Ûsystem;–?ýit“is“up“to“the“author/donor“to“decide“if“he“or“she“is“willingŽ¡‘*­Ûto–?ýdistribute“software“through“any“other“system“and“a“licensee“cannotŽ¡‘*­Ûimpose–?ýthat“choice.Ž¦‘*­ÛThis–?ýsection“is“intended“to“make“thoroughly“clear“what“is“believed“toŽ¡‘*­Ûbe–?ýa“consequence“of“the“rest“of“this“License.Ž¦‘5-Õ8.–?ýIf“the“distribution“and/or“use“of“the“Program“is“restricted“inŽ¡‘*­Ûcertain–?ýcountries“either“by“patents“or“by“copyrighted“interfaces,“theŽ¡‘*­Ûoriginal–?ýcopyright“holder“who“places“the“Program“under“this“LicenseŽ¡‘*­Ûmay–?ýadd“an“explicit“geographical“distribution“limitation“excludingŽ¡‘*­Ûthose–?ýcountries,“so“that“distribution“is“permitted“only“in“or“amongŽ¡‘*­Ûcountries–?ýnot“thus“excluded.‘ úIn“such“case,“this“License“incorporatesŽ¡‘*­Ûthe–?ýlimitation“as“if“written“in“the“body“of“this“License.Ž¦‘5-Õ9.–?ýThe“Free“Software“Foundation“may“publish“revised“and/or“new“versionsŽ¡‘*­Ûof–?ýthe“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–?ýa“version“number“of“this“License“which“applies“to“it“and“"anyŽ¡‘*­Ûlater–?ýversion",“you“have“the“option“of“following“the“terms“and“conditionsŽ¡‘*­Ûeither–?ýof“that“version“or“of“any“later“version“published“by“the“FreeŽ¡‘*­ÛSoftware–?ýFoundation.‘ úIf“the“Program“does“not“specify“a“version“number“ofŽ¡‘*­Ûthis–?ýLicense,“you“may“choose“any“version“ever“published“by“the“Free“SoftwareŽ¡‘*­ÛFoundation.Ž¦‘5-Õ10.–?ýIf“you“wish“to“incorporate“parts“of“the“Program“into“other“freeŽ¡‘*­Ûprograms–?ýwhose“distribution“conditions“are“different,“write“to“the“authorŽ¡‘*­Ûto–?ýask“for“permission.‘ úFor“software“which“is“copyrighted“by“the“FreeŽ¡‘*­ÛSoftware–?ýFoundation,“write“to“the“Free“Software“Foundation;“we“sometimesŽ¡‘*­Ûmake–?ýexceptions“for“this.‘ úOur“decision“will“be“guided“by“the“two“goalsŽ¡‘*­Ûof–?ýpreserving“the“free“status“of“all“derivatives“of“our“free“software“andŽ¡‘*­Ûof–?ýpromoting“the“sharing“and“reuse“of“software“generally.Ž¦‘?­ÏNO‘?ýWARRANTYŽŽŸK’û%Ä53ŽŽŒ‹6p° Ä)< ý;ÖÄ ªÝ» ý_"E‘5-ÕÊ11.–?ýBECAUSE“THE“PROGRAM“IS“LICENSED“FREE“OF“CHARGE,“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.Ž©‘5-Õ12.–?ýIN“NO“EVENT“UNLESS“REQUIRED“BY“APPLICABLE“LAW“OR“AGREED“TO“IN“WRITINGŽ¡‘*­ÛWILL–?ýANY“COPYRIGHT“HOLDER,“OR“ANY“OTHER“PARTY“WHO“MAY“MODIFY“AND/ORŽ¡‘*­ÛREDISTRIBUTE–?ý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.Ž¦‘DíÌEND–?ýOF“TERMS“AND“CONDITIONSŽ¦‘*­ÛAppendix:–?ýHow“to“Apply“These“Terms“to“Your“New“ProgramsŽ¦‘5-Õ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.Ž¦‘5-Õ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Ž¡‘*­Ûconvey–?ý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)“19yy‘ úŽ¦‘?­Ï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“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,“write“to“the“Free“SoftwareŽ¡‘?­ÏFoundation,–?ýInc.,“675“Mass“Ave,“Cambridge,“MA“02139,“USA.Ž¦‘*­ÛAlso–?ýadd“information“on“how“to“contact“you“by“electronic“and“paper“mail.Ž¦‘*­ÛIf–?ýthe“program“is“interactive,“make“it“output“a“short“notice“like“thisŽ¡‘*­Ûwhen–?ýit“starts“in“an“interactive“mode:Ž¦‘?­ÏGnomovision–?ýversion“69,“Copyright“(C)“19yy“name“of“authorŽ¡‘?­ÏGnomovision–?ýcomes“with“ABSOLUTELY“NO“WARRANTY;“for“detailsŽŽŸK’û%Ä54ŽŽŒ‹7~ Ä)< ý;ÖÄ ªÝ» ý_"E‘?­ÏÊ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,“the“commands“you“use“mayŽ¡‘*­Ûbe–?ýcalled“something“other“than“`show“w'“and“`show“c';“they“could“even“beŽ¡‘*­Ûmouse-clicks–?ýor“menu“items--whatever“suits“your“program.Ž¦‘*­ÛYou–?ýshould“also“get“your“employer“(if“you“work“as“a“programmer)“or“yourŽ¡‘*­Ûschool,–?ýif“any,“to“sign“a“"copyright“disclaimer"“for“the“program,“ifŽ¡‘*­Ûnecessary.‘ úHere–?ýis“a“sample;“alter“the“names:Ž¦‘5-ÕYoyodyne,–?ýInc.,“hereby“disclaims“all“copyright“interest“in“the“programŽ¡‘5-Õ`Gnomovision'–?ý(which“makes“passes“at“compilers)“written“by“James“Hacker.Ž¦‘5-Õ,“1“April“1989Ž¡‘5-ÕTy–?ýCoon,“President“of“ViceŽ¦‘*­ÛThis–?ý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“Library“GeneralŽ¡‘*­ÛPublic–?ýLicense“instead“of“this“License.Ž‘*­ÛŸff‰ffªÊ•ŽŸK’û%Ä55ŽŽŒ‹8‹³ Ä)< ý;ÖÄ ªÝ»ŸK’û%Ä56ŽŽŒ‹9‘E Ä)< ý;ÖÄ ªÝ» ý°"E‘*­ÛëJApp‘©›endix‘óFBŽŸ8‘*­ÛëHReferencesŽŸ:‘*­ÛÉ[ANSI]‘å˜ÄAustralian–æStandard“AS“3955-1991,‘J*\Programming“Languages“|“C",“(ISBN:“0-7262-Ž¤ ‘*­Û6970-0),‘S*12– fJuly“1991.‘ÒúIdenš¸ãtical“to:‘éIn˜ternational“Standard“ISO/IEC‘ 29899:‘é1990“ProgrammingŽ¡‘*­ÛLanguages–UU|“C.Ž©‘*­ÛÉ[Ben®9tley86]–ÅÄBenš¸ãtley“J.,‘á‹\Programming“P˜earls:‘RLiterate“Programming",‘á‹ÇCommunic‘ÿ}'ations–ûof“theŽ¡‘*­ÛA¾“CMÄ,–UUV‘ÿ*ªol.“29,“No.“5,“pp.“364{369,“1986.Ž¦‘*­ÛÉ[Hoare80]–rÄHoare“C.A.R.,›Ÿz\The“EmpGeror's“Old“Clothes",˜T‘ÿ*ªuring“Aw¸ãard“Lecture,˜1980,˜from“\A¸ãCMŽ¡‘*­ÛT‘ÿ*ªuring–¹\Awš¸ãard“Lectures:‘9ÕThe“First“Tw˜en˜t˜y“Y‘ÿ*ªears“1966{1985",–Ò^A˜CM‘¹BPress,“New›¹\Y‘ÿ*ªork,“(ISBN:˜0-Ž¡‘*­Û201-07794-9),–UU1987“(see“p.“155).Ž¦‘*­ÛÉ[Horton90]–UUÄHorton“M.R.,“\Pš¸ãortable“C“Soft˜w˜are",“Pren˜tice“Hall,“(ISBN:“0-13-868050-7),“1990.Ž¦‘*­ÛÉ[Kernighan88]–5ÄKernighan“B.W.,›>íRitc¸ãhie“D.M.,˜\The“C‘Programming“Language",˜(second“edi-Ž¡‘*­Ûtion,\ANSI–UUC"),“Pren¸ãtice“Hall,“(ISBN:“0-13-110362-8),“1988.Ž¦‘*­ÛÉ[Kn®9uth83]–•ðÄKnš¸ãuth“D.E.,‘¦\The“WEB‘•àSystem“of“Structured“DoGcumen˜tation",‘¦(W‘ÿ*ªeb“User“Man˜ual,Ž¡‘*­ÛV›ÿ*ªersion–UU2.5,“No•¸ãv“em“bGer,–UU1983),“Stanford“Univ•¸ãersit“y˜,‘UU1983.Ž¦‘*­ÛÉ[Kn®9uth84]–UUÄKn¸ãuth“D.E.,“\The“T‘þU>Ÿ'EŽ‘ãxXb•Go“ok",›UUAddison-W–ÿ*ªesley“,˜(ISBN:˜0-201-13448-9),˜1984.Ž¦‘*­ÛÉ[LampQÇort86]–õÄLampšGort“L.,‘ \L‘üffŸþµUëIaŽ‘‹ÄT‘þU>ŸŒEŽ‘ãxX:“A‘ôñDo˜cumen¸ãt“Preparation“System",› Addison-W–ÿ*ªesley“,˜(ISBN:Ž¡‘*­Û0-201-15790-X),‘UU1986.Ž¦‘*­ÛÉ[Rabino®9witz90]–&ÓÄRabinoš¸ãwitz“H.,‘[2Sc˜haap“C.,‘[2\P˜ortable“C",“Pren˜tice“Hall,‘[2(ISBN:0-13-685967-4)Ž¡‘*­Û1990.Ž¦‘*­ÛÉ[Ramsey89]–_ÂÄRamsey“N.,‘â]\W‘ÿ*ªeaš¸ãving“a“Language-IndepGenden˜t“WEB",“ÇCommunic‘ÿ}'ations–t‰of“theŽ¡‘*­ÛA¾“CMÄ,–UUV‘ÿ*ªol.“32,“No.“9,“pp.“1051{1055,“1989.Ž¦‘*­ÛÉ[T‘ÿ «arjan72]–ëØÄT‘ÿ*ªarjan“R.E.,›x\Depth-First“Searc¸ãh“and“Linear“Graph“Algorithms",˜ÇSIAM‘óJò"V½p cmbx10óIŒ-ø cmcsc10óHò"VáG cmbx10óBKñ`yáG cmr10ó9DÓítG®G®cmr17ó7ò"Vff cmbx10ó4Kñ`yff cmr10ó0ÂÖN  cmbx12óßê cmmi10óKñ`y cmr10ó |{Ycmr8óÙ“ Rcmr7ó¹Aa¨cmr6ùÑßßßßßßß