?_:ÿÿÿÿtì*!lí¼5Consistent Changes HelpC1Copyright © 1998 Summer Institute of LinguisticsZƒmain?main¾;:Ÿ‚Oz0WGGä ô ”OŸm##ÊO,‡lG¦ŸŸŸ@Zûsecondaryglossary:Ÿ‚Oz0WGGä ô ”OŸg##ÊO,‡lŸŸÿ/&;)z4ÿÿ ‹ ÿÿÿÿ|CONTEXTEä|CTXOMAP.Ò|FONTüÆ|KWBTREEçÓ|KWDATA9Ò|KWMAPÖÓ|SYSTEM|TOPICi|TTLBTREEÜš>Ÿÿÿ¶>Ÿÿÿ“ÁŠÁÿÿÿÿ 3ÿÿÿÿ?1…ÿÿÿÿÿÿÿÿÿÿÿÿ?‘''R, ‘& €X€€€‚ÿ'' null match; null replacement9?Ê1”ÿÿÿÿÿÿÿÿÿÿÿÿÊ%'number'[5‘%& €j€€€‚ÿ'number' number for arithmetic operation7Ê\1œÿÿÿÿÿÿÿÿÿÿÿÿ\Á(name)e?%Á& €~€€€‚ÿ(name) name of storage area, switch, group, or define?\1ŽÿÿÿÿÿÿÿÿÿÿÿÿO(number_charc)O)ÁO& €R€€€‚ÿ(number) number of characters3‚1tÿÿÿÿÿÿÿÿÿÿÿÿ‚Ã/dAOÃ& €6€€€‚ÿ/d debug trace?‚1'ÿÿÿÿÿÿÿÿÿÿÿÿ߉ASCII Codes 90>Ã@' €.€€€‚‚ÿ4.4 ASCII Codes 90·a÷V |€Â€¨ŠI€Ù€!{ù€ƒã`O‰€ãâþ€‰€ãÎ`*N€‰€€‚ÿ Dec Hex Octal Character Abbrev Meaningâ(@Ùº#DP'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€ €˜ÿ€"€˜‚ÿ€:€˜‚ÿ€D€˜€‚ÿÿÿ 00 0 CTRL + @NULnulß%÷¸º#DJ'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€ €˜ÿ€"€˜‚ÿ€:€˜‚ÿ€D€˜€‚ÿÿÿ 11 1 CTRL + ASOHß%Ù—º#DJ'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€ €˜ÿ€"€˜‚ÿ€:€˜‚ÿ€D€˜€‚ÿÿÿ 22 2 CTRL + BSTXã)¸zº#DR'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€ €˜ÿ€"€˜‚ÿ€:€˜‚ÿ€D€˜€‚ÿÿÿ 33 3 CTRL + CEXTexitê0—dº#D`'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€ €˜ÿ€"€˜‚ÿ€:€˜‚ÿ€D€˜€‚ÿÿÿ 44 4 CTRL + DEOTend of tapeß%zC º#DJ'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€ €˜ÿ€"€˜‚ÿ€:€˜‚ÿ€D€˜€‚ÿÿÿ 55 5 CTRL + EENQß%d" º#DJ'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€ €˜ÿ€"€˜‚ÿ€:€˜‚ÿ€D€˜€‚ÿÿÿ 66 6 CTRL + FACKã)C  º#DR'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€ €˜ÿ€"€˜‚ÿ€:€˜‚ÿ€D€˜€‚ÿÿÿ 77 7 CTRL + GBELbellé/" î º#D^'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€"€˜ÿ€$€˜‚ÿ€<€˜‚ÿ€D€˜€‚ÿÿÿ 88 10 CTRL + HBSback spaceí3 Û º#Df'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€"€˜ÿ€$€˜‚ÿ€<€˜‚ÿ€D€˜€‚ÿÿÿ 99 11 CTRL + IHThorizontal tabé/î Ä º#D^'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€$€˜ÿ€&€˜‚ÿ€>€˜‚ÿ€F€˜€‚ÿÿÿ 10A 12 CTRL + JLFline feedì2Û °º#Dd'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€$€˜ÿ€&€˜‚ÿ€>€˜‚ÿ€F€˜€‚ÿÿÿ 11B 13 CTRL + KVTvertical tabé/Ä ™º#D^'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€$€˜ÿ€&€˜‚ÿ€>€˜‚ÿ€F€˜€‚ÿÿÿ 12C 14 CTRL + LFFform feedï5°”@º#Dj'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€™”@À˜‚ÿ€€˜‚ÿ€$€˜ÿ€&€˜‚ÿ€>€˜‚ÿ€F€˜€‚ÿÿÿ 13D 15 CTRL + MCRcarriage returnà&™tAº#DL'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€$€˜ÿ€&€˜‚ÿ€>€˜‚ÿ€F€˜€‚ÿÿÿ 14E 16 CTRL + NSOà&”@TBº#DL'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€$€˜ÿ€&€˜‚ÿ€>€˜‚ÿ€F€˜€‚ÿÿÿ 15F 17 CTRL + OSIâ(tA6Cº#DP'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 1610 20 CTRL + PSLEâ(TBDº#DP'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 1711 21 CTRL + QDC1â(6CúDº#DP'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 1812 22 CTRL + RDC2â(DÜEº#DP'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 1913 23 CTRL + SDC3â(úD¾Fº#DP'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 2014 24 CTRL + TDC4â(ÜE Gº#DP'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 2115 25 CTRL + UNAKâ(¾F‚Hº#DP'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 2216 26 CTRL + VSYNâ( GdIº#DP'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 2317 27 CTRL + WETBâ(‚HFJº#DP'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 2418 30 CTRL + XCANá'dI'Kº#DN'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€H€˜€‚ÿÿÿ 2519 31 CTRL + YEMí3FJLº#Df'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 261A 32 CTRL + ZEOFend of fileè.'KüLº#D\'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€J€˜€‚ÿÿÿ 271B 33 CTRL + [ESCescapeá'LÝMº#DN'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€H€˜€‚ÿÿÿ 281C 34 CTRL + \FSá'üL¾Nº#DN'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€H€˜€‚ÿÿÿ 291D 35 CTRL + ]GSá'ÝMŸOº#DN'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€H€˜€‚ÿÿÿ 301E 36 CTRL + ^RSá'¾NŒ€º#DN'4 . 1 “ F — €€˜€‚ÿ€€˜ÿ€€˜‚ŸOŒ€Ãÿ€€˜‚ÿ€€˜‚ÿ€&€˜ÿ€(€˜‚ÿ€@€˜‚ÿ€H€˜€‚ÿÿÿ 311F 37 CTRL + _USg,ŸOó€; F€X€T˜ôŠ€EA¿‚=€‚€€‚ÿDecimal Hexadecimal Octal Character´ØŒ€§ƒÜ †±€¨ˆu€[A퀃ƒƒƒ€€ƒƒƒƒƒƒƒƒ€ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ÿ 3220 40 SPACE 3321 41! 3422 42" 3523 43# 3624 44$ 3725 45% 3826 46& 3927 47‘ 4028 50( 4129 51) 422A 52* 432B 53+ 442C 54, 452D 55- 462E 56. 472F 57/ 4830 600 4931 611 5032 622 5133 633 5234 644 5335 655 5436 666 5537 677 5638 7085739 719 583A 72: 593B 73; 603C 74< 613D 75= 623E 76> 633F 77? 6440 100@[*ó€„1 2€T€¨ˆu€[Aí€ €‚ÿDecimal Hexadecimal Octal Character²ã§ƒ´†Ï lÇ€¨ˆu€[A=€ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚ÿ 6541 101A 6642 102B 6743 103C 6844 104D 6945 105E 7046 106F 7147 107G 7248 110H 7349 111I 744A 112J 754B 113K 764C 114L 774D 115M 784E 116N 794F 117O 8050 120P 8151 121Q 8252 122R 8353 123S 8454 124T 8555 125U 8656 126V 8757 127W 8858 130X 8959 131Y 905A 132Z 915B 133[ 925C 134\ 935D 135] 945E 136^ 955F 137_ 9660 140`í„¡‰Ð n;€¨ˆu€[A=€ € ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ€‚ÿDecimal Hexadecimal Octal Character 9761 141a 9862 142b 9963 143c 10064 144d 10165 145e 10266 146f 10367 147g 10468 150h 10569 151i 1066A 152j 1076B 153k 1086C 154l 1096D 155m 1106E 156n 1116F 157o 11270 160p 11371 161q 11472 162r 11573 163s 11674 164t 11775 165u 11876 166v 11977 167w 12078 170x 12179 171y 1227A 172z 1237B 173{ 1247C 174| 1257D 175} 1267E 176~ 1277F 177DELETE>´†ß‰, (€$€ã¼˜Ì߀ ‰€‚ÿAll CommandsA¡‰ Š1!ÿÿÿÿÿÿÿÿÿÿÿÿ ŠŒAdvance FeaturesàK߉Œ• ø€—€€‚‚ãCz"O‰‚ãCz"O‰€‚€ã¥Òï<‰‚ã;`q¥‰‚ãàÃe‰‚ã¡#rS‰‚ãÝÃÑ䉀‚€ãÜEЉ‚ãZ=ÒZ‰‚ã[àˉ‚ã"lx ‰€‚€ã§×þ‰‚ãìʼnf‰€‚ÿ3. Advance Features3.1 Store Commands 3.1.1 Overview 3.1.2 Deletion 3.1.3 Selection 3.1.4 Rearrangement 3.1.5.Summary3.2 The Back Command3.3 Groups3.4 Switches 3.4.1 Concept 3.4.1 What the Commands Do3.5 Arithmetic Commands3.6 Doublebyte Command= Š=Œ1!ÿÿÿÿÿÿÿÿÿÿÿÿ=ŒPAll Commands?Œ|Œ' €0€€‚€‚ÿ5. All Commandstest8=ŒýŒI#b€p·´ $€€˜ã9~€‰‚ÿ€.€˜‚ÿÿÿadd(name) 'number'add numeric string to area name6|Œ|I#b€l·´ $€€˜ãü€‰‚ÿ€€˜‚ÿÿÿany(name)match any element of storage area name†=ýŒŽI#b€z·´ $€€˜ã¶¬¢›€‰‚ÿ€"€˜‚ÿÿÿappend(name)store in area name, keep previous contents‹B|ŽI#b€„·´ $€€˜ãkT€‰‚ÿ€"€˜‚ÿÿÿback(number)put last number of chars output back into inputw.ŽI#b€\·´ $€€˜ãñ$Å€‰‚ÿ€€˜‚ÿÿÿbeginbeginning of table or nested blockXŽ\I#b€·´ $€€˜ã€‰‚ÿ€ €˜‚ÿÿÿccomment6ÛI#b€l·´ $€€˜ãíɳ€‰‚ÿ€€˜‚ÿÿÿcaselessignore case of first character of match€7\gÀI#b€n·´ ÛgÀŒ$€€˜ãþñ€‰‚ÿ€€˜‚ÿÿÿcont(name)match or compare contents of area namel#ÛÓÀI#b€F·´ $€€˜ãá½€‰‚ÿ€ €˜‚ÿÿÿclear(name)clear switch name8gÀTÁI#b€p·´ $€€˜ãsU¢³€‰‚ÿ€"€˜‚ÿÿÿdefine(name)defines a set of commands called nameˆ?ÓÀÜÁI#b€~·´ $€€˜ãÍ”€‰‚ÿ€.€˜‚ÿÿÿdiv(name) 'number'divide value in name by numeric string{2TÁWÂI#b€d·´ $€€˜ã{€‰‚ÿ€€˜‚ÿÿÿdo(name)execute set of commands called namei ÜÁÀÂI#b€@·´ $€€˜ãË–€‰‚ÿ€€˜‚ÿÿÿdupduplicate match stringXWÂÃI#b€·´ $€€˜ãAJ€‰‚ÿ€€˜‚ÿÿÿelseelsecÀÂ{ÃI#b€4·´ $€€˜ãËœ€‰‚ÿ€€˜‚ÿÿÿendend nested blockw.ÃòÃI#b€\·´ $€€˜ãW }󀉂ÿ€€˜‚ÿÿÿendfilematch or output end of file charr){ÃdÄI#b€R·´ $€€˜ãW }󀉂ÿ€€˜‚ÿÿÿendfileend of conditional commandscòÃÇÄI#b€4·´ $€€˜ãÚ ¸è€‰‚ÿ€€˜‚ÿÿÿendstoreend storing}4dÄDÅI#b€h·´ $€€˜ãDž€‰‚ÿ€ €˜‚ÿÿÿexcel(name)exclude (make inactive) group name6ÇÄÃÅI#b€l·´ $€€˜ã7¤€‰‚ÿ€€˜‚ÿÿÿfol(name)if following character is in area nameŠADÅMÆI#b€‚·´ $€€˜ã‡¥€‰‚ÿ€ €˜‚ÿÿÿfwd(number)forward number of characters (does not process)z1ÃÅÇÆI#b€b·´ $€€˜ã«ûÙ€‰‚ÿ€$€˜‚ÿÿÿgroup(number)specifies a group called namem$MÆ4ÇI#b€H·´ $€€˜ãI€‰‚ÿ€€˜‚ÿÿÿif(name)if switch name is setˆ?ÇƼÇI#b€~·´ $€€˜ãéö€‰‚ÿ€0€˜‚ÿÿÿifeq(name) 'string'if contents of area name equal string‰@4ÇEÈI#b€€·´ $€€˜ãB÷€‰‚ÿ€0€˜‚ÿÿÿifgt(name) 'string'if contents of area name exceed stringr)¼Ç·ÈI#b€R·´ $€€˜ãa¸€‰‚ÿ€€˜‚ÿÿÿifn(name)if switch name is not setƒ:EÈ:ÉI#b€t·´ $€€˜ãA¸3€‰‚ÿ€2€˜‚ÿÿÿifneg(name) 'string'negative of ifeq(name) 'string'w.·È±ÉI#b€\·´ $€€˜ãV0€‰‚ÿ€€˜‚ÿÿÿincl(name)include (activate) group name‚9:É3ÊI#b€r·´ $€€˜ã\0€‰‚ÿ€€˜‚ÿÿÿincr(name)add one to contents of storage area name›R±ÉÎÊI#b€¤·´ $€€˜ã¾Ö€‰‚ÿ€.€˜‚ÿÿÿmod(name) 'number'remainder when value in name is divided by numeric string—N3ÊeËI#b€œ·´ $€€˜ãÈ×€‰‚ÿ€.€˜‚ÿÿÿmul(name) 'number'product of value in name multiplied by numeric stringr)ÎÊ×ËI#b€R·´ $€€˜ãÃ%€‰‚ÿ€€˜‚ÿÿÿnextperform commands in next entryj!eËAÌI#b€B·´ $€€˜ã&€‰‚ÿ€€˜‚ÿÿÿnlmatch or output new linen%×˯ÌI#b€J·´ $€€˜ã"Œ€‰‚ÿ€€˜‚ÿÿÿ''null match; null replacement…<AÌ4ÍI#b€x·´ $€€˜ã™q&€‰‚ÿ€"€˜‚ÿÿÿomit(number)omit next number of characters from inputq(¯Ì¥ÍI#b€P·´ $€€˜ãB怉‚ÿ€€˜‚ÿÿÿout(name)output storage area name~54Í#ÎI#b€j·´ $€€˜ã9­&€‰‚ÿ€€˜‚ÿÿÿouts(name)output area name (storing continues)€7¥Í£ÎI#b€n·´ $€€˜ãŒË'€‰‚ÿ€€˜‚ÿÿÿprec(name)if preceding character is in area namel##ÎÏI#b€F·´ $€€˜ã"Ú)€‰‚ÿ€€˜‚ÿÿÿreadread input from keyboardq(£Î€ÏI#b€P·´ $€€˜ãg¼Z.€‰‚ÿ€€˜‚ÿÿÿrepeatrepeat from preceding beginhÏ I#b€>·´ $€€˜ãv€‰‚ÿ€€˜‚ÿÿÿset(name)set switch name€Ï Œ‰@€Ï•I#b€€·´ $€€˜ã‘hN€‰‚ÿ€ €˜‚ÿÿÿstore(name)store in area name (discard previous contents)ŒC !I#b€†·´ $€€˜ã€‰‚ÿ€.€˜‚ÿÿÿsub(name) 'number'subtract numeric string from value in namen%•I#b€J·´ $€€˜ã3€‰‚ÿ€€˜‚ÿÿÿuse(name)use group called name‹B!I#b€„·´ $€€˜ã¡€‰‚ÿ€€˜‚ÿÿÿwd(name)if characters before and after in storage area namet+ŽI#b€V·´ $€€˜ã/{€‰‚ÿ€$€˜‚ÿÿÿwrite'string'output string to screen6 I#b€l·´ $€€˜ãf¯¿—€‰‚ÿ€$€˜‚ÿÿÿwrstore(name)output storage area name to screene"ŽrC#V€D·´ €€˜€‚ÿ€ €˜‚ÿÿÿ/bbackup to previous questionW ÉC#V€(·´ €€˜€‚ÿ€ €˜‚ÿÿÿ/ccompile table]r&I#b€(·´ $€€˜ãC€‰‚ÿ€€˜‚ÿÿÿ/ddebug trace^É„C#V€6·´ €€˜€‚ÿ€ €˜‚ÿÿÿ/mcompile table for MSY&ÝC#V€,·´ €€˜€‚ÿ€ €˜‚ÿÿÿ/onew output file]„:C#V€4·´ €€˜€‚ÿ€ €˜‚ÿÿÿ/rreturn to beginning\Ý–C#V€2·´ €€˜€‚ÿ€ €˜‚ÿÿÿ/tchange input mediaY:ïC#V€,·´ €€˜€‚ÿ€ €˜‚ÿÿÿ/wwait for system'–$ €€˜€‚ÿ:ïP, (€€ãŠUô%€ ‰€‚ÿContentsOŸ1 JÿÿÿÿÿÿÿÿŸ\9AAlphabetic Summary of Commands½kP\R t€Ö€€ €‚€ƒã1(œ‰ãÜ(œ‰ãN$(œ‰ãÝV(œ‰ãOe(œ‰ã¥(œ‰€‚ÿAlphabetic Summary of Commandsa to d, d to f, f to m, m to o, o to u, u through w Y,Ÿµ- *€X€€€‚€ €‚ÿ4.2 Alphabetic Summary of Commands 8\6I#b€pä³ $€€˜ã¬€‰‚ÿ€.€˜‚ÿÿÿadd(name) 'number'add numeric string to area name6µµI#b€lä³ $€€˜ãoeœ€‰‚ÿ€€˜‚ÿÿÿany(name)match any element of storage area name†=6; I#b€zä³ $€€˜ãÙpñ€‰‚ÿ€"€˜‚ÿÿÿappend(name)store in area name, keep previous contents‹BµÆ I#b€„ä³ $€€˜ã&»G¡€‰‚ÿ€"€˜‚ÿÿÿback(number)put last number of chars output back into inputw.; = I#b€\ä³ $€€˜ãüÒç:€‰‚ÿ€€˜‚ÿÿÿbeginbeginning of table or nested block…0Æ  U#z€`ä³ $€€˜ã\OÌ€‰‚ÿ€€˜ÿ€€‚ÿÿÿbinaryhandle input data as a binary filee= ' U#z€ ä³ €€ÿ$€€˜ãŽ‹€‰‚ÿ€€˜‚ÿÿÿccomment6 ¦ I#b€lä³ $€€˜ã˜f‡€‰‚ÿ€€˜‚ÿÿÿcaselessignore case of first character of matchl#'  I#b€Fä³ $€€˜ãlp”ð€‰‚ÿ€ €˜‚ÿÿÿclear(name)clear switch name€7¦ ’ I#b€nä³ $€€˜ãlp”ð€‰‚ÿ€€˜‚ÿÿÿcont(name)match or compare contents of area namep$  L#h€Hä³ *€€˜ãq[-€‰€‚ÿ€€˜‚ÿÿÿdtreat as decimal ASCII code‚-’ „ U#z€Zä³ $€€˜ãïïž³€‰‚ÿ€€˜ÿ€€‚ÿÿÿdecrdecrements the named store by oneŽ9 U#z€rä³ €€ÿ$€€˜ãî-{o€‰‚ÿ€$€˜‚ÿÿÿdefine(name)defines a set of commands called nameˆ?„ šI#b€~ä³ $€€˜ãø¾2€‰‚ÿ€.€˜‚ÿÿÿdiv(name) 'number'divide value in name by numeric string{2I#b€dä³ $€€˜ã¶%€‰‚ÿ€€˜‚ÿÿÿdo(name)execute set of commands called name LšµT#x€˜ä³ €€˜ÿ"€€ãÈpi€‰‚ÿ€"€‚ÿÿÿdoublebyte treat qualifying pairs of bytes as one doublebyte elementv!7@U#z€Bä³ €€ÿ$€€˜ã†"A€‰‚ÿ€µ7@P€˜‚ÿÿÿdupduplicate match stringXµ@I#b€ä³ $€€˜ãÌQâ½€‰‚ÿ€€˜‚ÿÿÿelseelsec7@ò@I#b€4ä³ $€€˜ã†xl€‰‚ÿ€€˜‚ÿÿÿendend nested blockw.@iAI#b€\ä³ $€€˜ã²–¾¢€‰‚ÿ€€˜‚ÿÿÿendfilematch or output end of file charp'ò@ÙAI#b€Nä³ $€€˜ã變󀉂ÿ€€˜‚ÿÿÿendifend of conditional commandsciA€ÿ€@€˜€€‚ÿÿÿifsubset(name)’string'compares name to stringw.×HùII#b€\ä³ $€€˜ãyDဉ‚ÿ€€˜‚ÿÿÿincl(name)include (activate) group name‚9‚I{JI#b€rä³ $€€˜ãÏJDဉ‚ÿ€€˜‚ÿÿÿincr(name)add one to contents of storage area name„*ùIÿJZ#„€Tä³ €€˜ÿ.€€ãlÏ€‰€€‚ÿ€"€‚ÿÿÿlen(name)length of a named storeµT{J´Ka#’€¨ä³ €€ÿ€€ÿ$€€˜ã¡€‰‚ÿ€2€˜‚ÿÿÿmod(name) 'number'remainder when value in name is divided by numeric string—NÿJKLI#b€œä³ $€€˜ãÛ…€‰‚ÿ€.€˜‚ÿÿÿmul(name) 'number'product of value in name multiplied by numeric stringr)´K½LI#b€Rä³ $€€˜ã¾-X €‰‚ÿ€€˜‚ÿÿÿnextperform commands in next entryj!KL'MI#b€Bä³ $€€˜ãÉ1%€‰‚ÿ€€˜‚ÿÿÿnlmatch or output new linen%½L•MI#b€Jä³ $€€˜ã"Œ€‰‚ÿ€€˜‚ÿÿÿ''null match; null replacement…<'MNI#b€xä³ $€€˜ã‰_Ç€‰‚ÿ€"€˜‚ÿÿÿomit(number)omit next number of characters from inputq(•M‹NI#b€Pä³ $€€˜ã€‰‚ÿ€€˜‚ÿÿÿout(name)output storage area name~5N OI#b€jä³ $€€˜ã#Y€‰‚ÿ€€˜‚ÿÿÿouts(name)output area name (storing continues)€7‹N‰OI#b€nä³ $€€˜ã(m€‰‚ÿ€€˜‚ÿÿÿprec(name)if preceding character is in area namel# O €I#b€Fä³ $€€˜ãåH.€‰‚ÿ€€˜‚ÿÿÿreadread input from keyboard‰O €Pq(‰O}€I#b€Pä³ $€€˜ãBÆZÍ€‰‚ÿ€€˜‚ÿÿÿrepeatrepeat from preceding beginh €å€I#b€>ä³ $€€˜ã™V<€‰‚ÿ€€˜‚ÿÿÿset(name)set switch name‰@}€nI#b€€ä³ $€€˜ãœAQÅ€‰‚ÿ€ €˜‚ÿÿÿstore(name)store in area name (discard previous contents)ŒCå€úI#b€†ä³ $€€˜ãÇ=O€‰‚ÿ€.€˜‚ÿÿÿsub(name) 'number'subtract numeric string from value in nameœ?n–‚]#Š€~ä³ €€˜ÿ(€€ãü$k€‰€‚ÿ€€€€‚ÿÿÿtabprovides a tab, much like nl provides a new lineˆ'úƒa#’€Nä³ €€ÿ€€ÿ$€€˜ã®;µ€‰‚ÿ€ €˜‚ÿÿÿuse(name)use group called name‹B–‚©ƒI#b€„ä³ $€€˜ã,ã/€‰‚ÿ€€˜‚ÿÿÿwd(name)if characters before and after in storage area nameu,ƒ„I#b€Xä³ $€€˜ãʸµ•€‰‚ÿ€&€˜‚ÿÿÿwrite 'string'output string to screen6©ƒ„I#b€lä³ $€€˜ã Úy€‰‚ÿ€$€˜‚ÿÿÿwrstore(name)output storage area name to screent(„…L#h€Pä³ $€€˜ã;#€‰‚ÿ€ €˜€‚ÿÿÿxtreat as hexadecimal ASCII codee"„v…C#V€Dä³ €€˜€‚ÿ€ €˜‚ÿÿÿ/bbackup to previous questionW…Í…C#V€(ä³ €€˜€‚ÿ€ €˜‚ÿÿÿ/ccompile table]v…*†I#b€(ä³ $€€˜ãÇ’€‰‚ÿ€€˜‚ÿÿÿ/ddebug trace^Í…ˆ†C#V€6ä³ €€˜€‚ÿ€ €˜‚ÿÿÿ/mcompile table for MSY*†á†C#V€,ä³ €€˜€‚ÿ€ €˜‚ÿÿÿ/onew output file]ˆ†>‡C#V€4ä³ €€˜€‚ÿ€ €˜‚ÿÿÿ/rreturn to beginning\ᆚ‡C#V€2ä³ €€˜€‚ÿ€ €˜‚ÿÿÿ/tchange input mediaY>‡ó‡C#V€,ä³ €€˜€‚ÿ€ €˜‚ÿÿÿ/wwait for system'š‡ˆ$ €€˜€‚ÿL%ó‡fˆ' €J€R€ €‚ÿ4.3 Commands by Logical GroupingsHˆ®ˆ, (€8€\¨°‘€s€ €‚ÿCommands Using Switches:l#fˆ‰I#b€FÇ´ $€€˜ãá½€‰‚ÿ€ €˜‚ÿÿÿclear(name)clear switch namem$®ˆ‡‰I#b€HÇ´ $€€˜ãI€‰‚ÿ€€˜‚ÿÿÿif(name)if switch name is setr)‰ù‰I#b€RÇ´ $€€˜ãa¸€‰‚ÿ€€˜‚ÿÿÿifn(name)if switch name is not seth‡‰aŠI#b€>Ç´ $€€˜ãv€‰‚ÿ€€˜‚ÿÿÿset(name)set switch name‰^ù‰êŠ+ &€¼€˜¤€€€‚ÿThe following are similar to if(name) in function, but use store names, not switch names:ˆ?aŠr‹I#b€~Ç´ $€€˜ãéö€‰‚ÿ€0€˜‚ÿÿÿifeq(name) 'string'if contents of area name equal string‰@êŠû‹I#b€€Ç´ $€€˜ãB÷€‰‚ÿ€0€˜‚ÿÿÿifgt(name) 'string'if contents of area name exceed stringƒ:r‹~ŒI#b€tÇ´ $€€˜ãA¸3€‰‚ÿ€2€˜‚ÿÿÿifneq(name) 'string'negative of ifeq(name) 'string'j>û‹èŒ, (€|€^°¨°ì€ €‚ÿCommands Using Store Numbers or Related to Storage Areas:‰@~ŒqI#b€€Ç² $€€˜ã9~€‰‚ÿ€.€˜‚ÿÿÿadd(name) 'number'add numeric string to storage area name6èŒðI#b€lDz $€€˜ãü€‰‚ÿ€€˜‚ÿÿÿany(name)match any element of storage area name†=qvŽI#b€zDz $€€˜ã¶¬¢›€‰‚ÿ€"€˜‚ÿÿÿappend(name)store in area name, keep previous contents€7ðöŽI#b€nDz $€€˜ãþñ€‰‚ÿ€€˜‚ÿÿÿcont(name)match or compare contents of area nameŒCvŽ‚I#b€†Ç² $€€˜ãÍ”€‰‚ÿ€.€˜‚ÿÿÿdiv(name) 'number'divide storage area name by numeric stringcöŽ ÀI#b€4Dz $€€˜ãÚ ¸è€‰‚ÿ€€˜‚ÿÿÿendstoreend storing‚ ÀP6‚‹ÀI#b€lDz $€€˜ã7¤€‰‚ÿ€€˜‚ÿÿÿfol(name)if following character is in area nameˆ? ÀÁI#b€~Dz $€€˜ãéö€‰‚ÿ€0€˜‚ÿÿÿifeq(name) 'string'if contents of area name equal string‰@‹ÀœÁI#b€€Ç² $€€˜ãB÷€‰‚ÿ€0€˜‚ÿÿÿifgt(name) 'string'if contents of area name exceed stringz1ÁÂI#b€bDz $€€˜ãA¸3€‰‚ÿ€2€˜‚ÿÿÿifneq(name) 'string'negative of ifeq(name)6œÁ•ÂI#b€lDz $€€˜ã\0€‰‚ÿ€€˜‚ÿÿÿincr(name)increment number in storage area name›RÂ0ÃI#b€¤Ç² $€€˜ã¾Ö€‰‚ÿ€.€˜‚ÿÿÿmod(name) 'number'remainder when value in name is divided by numeric stringF•Â¿ÃI#b€ŒÇ² $€€˜ãÈ×€‰‚ÿ€.€˜‚ÿÿÿmul(name) 'number'multiply value in area name by numeric stringq(0Ã0ÄI#b€PDz $€€˜ãB怉‚ÿ€€˜‚ÿÿÿout(name)output storage area name~5¿Ã®ÄI#b€jDz $€€˜ã9­&€‰‚ÿ€€˜‚ÿÿÿouts(name)output area name (storing continues)€70Ä.ÅI#b€nDz $€€˜ãŒË'€‰‚ÿ€€˜‚ÿÿÿprec(name)if preceding character is in area name‰@®Ä·ÅI#b€€Ç² $€€˜ã‘hN€‰‚ÿ€ €˜‚ÿÿÿstore(name)store in area name (discard previous contents)G.ÅGÆI#b€ŽÇ² $€€˜ã€‰‚ÿ€.€˜‚ÿÿÿsub(name) 'number'subtract numeric string from storage area name‹B·ÅÒÆI#b€„Dz $€€˜ã,ã/€‰‚ÿ€€˜‚ÿÿÿwd(name)if characters before and after in storage area name6GÆQÇI#b€lDz $€€˜ãf¯¿—€‰‚ÿ€$€˜‚ÿÿÿwrstore(name)output storage area name to screenEÒÆ–Ç- *€0€^°¨°‘€s€ €‚ÿArithmetic Commands:‰@QÇÈI#b€€Ç² $€€˜ã9~€‰‚ÿ€.€˜‚ÿÿÿadd(name) 'number'add numeric string to storage area nameŒC–Ç«ÈI#b€†Ç² $€€˜ãÍ”€‰‚ÿ€.€˜‚ÿÿÿdiv(name) 'number'divide storage area name by numeric string6È*ÉI#b€lDz $€€˜ã\0€‰‚ÿ€€˜‚ÿÿÿincr(name)increment number in storage area name›R«ÈÅÉI#b€¤Ç² $€€˜ã¾Ö€‰‚ÿ€.€˜‚ÿÿÿmod(name) 'number'remainder when value in name is divided by numeric stringF*ÉTÊI#b€ŒÇ² $€€˜ãÈ×€‰‚ÿ€.€˜‚ÿÿÿmul(name) 'number'multiply value in area name by numeric stringGÅÉäÊI#b€ŽÇ² $€€˜ã€‰‚ÿ€.€˜‚ÿÿÿsub(name) 'number'subtract numeric string from storage area nameLTÊ0Ë. ,€<€^°¨°‘€s€ ‚€‚ÿOrdinary Number Commands:‹BäÊ»ËI#b€„Ç¢ $€€˜ãkT€‰‚ÿ€"€˜‚ÿÿÿback(number)put last number of chars output back into inputŠA0ËEÌI#b€‚Ç¢ $€€˜ã‡¥€‰‚ÿ€ €˜‚ÿÿÿfwd(number)forward number of characters (does not process)…<»ËÊÌI#b€xÇ¢ $€€˜ã™q&€‰‚ÿ€"€˜‚ÿÿÿomit(number)omit next number of characters from inputP#EÌÍ- *€F€^°¨°‘€s€ €‚ÿCommands that can Cause a Loop:£ZÊ̽ÍI#b€´Î¢ $€€˜ãkT€‰‚ÿ€"€˜‚ÿÿÿback(number)if not sending output to something different or using a different groupq(Í.ÎI#b€P΢ $€€˜ãg¼Z.€‰‚ÿ€€˜‚ÿÿÿrepeatif no way to stop repeating8½Í¯ÎI#b€p΢ $€€˜ã"Œ€‰‚ÿ€(€˜‚ÿÿÿ'' (null match)if not used with fwd, omit, or usey0.Î(ÏI#b€`΢ $€€˜ãW }󀉂ÿ€€˜‚ÿÿÿendfileif matched and not output on rightžO¯ÎÆÏO#n€žÎ¢ 0€€˜ãsU¢³€‰ã{‰‚ÿ€8€˜‚ÿÿÿdefine(name)/do(name)if two or more defined procedures call each otherN!(Ï - *€B€^°¨°‘€s€ €‚ÿCommands UsiÆÏ Png Group Numbers:|3ÆÏœI#b€fÇ¢ $€€˜ãDž€‰‚ÿ€€˜‚ÿÿÿexcl(name)exclude (make inactive) group namex/ I#b€^Ç¢ $€€˜ã«ûÙ€‰‚ÿ€ €˜‚ÿÿÿgroup(name)specifies a group called namew.œ‹I#b€\Ç¢ $€€˜ãV0€‰‚ÿ€€˜‚ÿÿÿincl(name)include (activate) group namen%ùI#b€JÇ¢ $€€˜ã3€‰‚ÿ€€˜‚ÿÿÿuse(name)use group called nameS&‹L- *€L€^°¨°‘€s€ €‚ÿCommands Using Defined Procedures:8ùÍI#b€pÇ¢ $€€˜ãsU¢³€‰‚ÿ€"€˜‚ÿÿÿdefine(name)defines a set of commands called name{2LHI#b€dÇ¢ $€€˜ã{€‰‚ÿ€€˜‚ÿÿÿdo(name)execute set of commands called namew.Í¿I#b€\Ç¢ $€€˜ãÃ%€‰‚ÿ€€˜‚ÿÿÿnextdo next set of replacement commandsu,H4I#b€XÇ¢ $€€˜ãíɳ€‰‚ÿ€€˜‚ÿÿÿcaselessprocess data in caseless mode[.¿- *€\€^°¨°‘€s€ €‚ÿCommands Involving the Screen or Keyboard:l#4ûI#b€FÇ´ $€€˜ã"Ú)€‰‚ÿ€€˜‚ÿÿÿreadread input from keyboard6zI#b€lÇ´ $€€˜ã/{€‰‚ÿ€&€˜‚ÿÿÿwrite 'string'output following string to screen6ûùI#b€lÇ´ $€€˜ãf¯¿—€‰‚ÿ€$€˜‚ÿÿÿwrstore(name)output storage area name to screenGz@- *€4€^°¨°‘€s€ €‚ÿNested Block Commands:n%ù®I#b€JÇ´ $€€˜ãñ$Å€‰‚ÿ€€˜‚ÿÿÿbeginbeginning of nested blockX@I#b€Ç´ $€€˜ãAJ€‰‚ÿ€€˜‚ÿÿÿelseelsef®lI#b€:Ç´ $€€˜ãËœ€‰‚ÿ€€˜‚ÿÿÿendend of nested blockw.ãI#b€\Ç´ $€€˜ã|zl€‰‚ÿ€€˜‚ÿÿÿendifend of conditional set of commandsm$lPI#b€HÇ´ $€€˜ãI€‰‚ÿ€€˜‚ÿÿÿif(name)if switch name is setˆ?ãØI#b€~Ç´ $€€˜ãéö€‰‚ÿ€0€˜‚ÿÿÿifeq(name) 'string'if contents of area name equal string‰@Pa I#b€€Ç´ $€€˜ãB÷€‰‚ÿ€0€˜‚ÿÿÿifgt(name) 'string'if contents of area name exceed stringr)ØÓ I#b€RÇ´ $€€˜ãa¸€‰‚ÿ€€˜‚ÿÿÿifn(name)if switch name is not setƒ:a V I#b€tÇ´ $€€˜ãA¸3€‰‚ÿ€2€˜‚ÿÿÿifneq(name) 'string'negative of ifeq(name) 'string'p'Ó Æ I#b€NÇ´ $€€˜ãg¼Z.€‰‚ÿ€€˜‚ÿÿÿrepeatrepeat from previous begin^1V $ - *€b€^°¨°‘€s€ €‚ÿCommands which occur Only on the Search Side:6Æ £ I#b€lÇ´ $€€˜ãü€‰‚ÿ€€˜‚ÿÿÿany(name)match any element of storage area name6$ " I#b€lÇ´ $€€˜ã7¤€‰‚ÿ€€˜‚ÿÿÿfol(name)if following character is in area name€7£ ¢ I#b€nÇ´ $€€˜ãŒË'€‰‚ÿ€€˜‚ÿÿÿprec(name)if preceding character is in area name~5"  I#b€jÇ´ $€€˜ã¡€‰‚ÿ€€˜‚ÿÿÿwd(name)if chars before and after in area name8¢ ¡ I#b€pÇ´ $€€˜ãsU¢³€‰‚ÿ€"€˜‚ÿÿÿdefine(name)defines a set of commands called name' È $ €€˜€‚ÿZ,¡ ". ,€X€^°¨°‘€s€ ‚€‚ÿCommands which may occur on Either Sidef@È ˆ& €€€€€‚ÿNote that the meaning is often different on different sides:w."ÿI#b€\Ç´ $€€˜ãñ$Å€‰‚ÿ€€˜‚ÿÿÿbeginbeginning of table or nested block€7ˆI#b€nÇ´ $€€˜ãþñ€‰‚ÿ€€˜‚ÿÿÿcont(name)match or compare contents of area namew.ÿ @I#b€\Ç´ $€€˜ãW }󀉂ÿ€€˜‚ÿÿÿendfilematch or output end of file char @Pj!v@I#b€BÇ´ $€€˜ã&€‰‚ÿ€€˜‚ÿÿÿnlmatch or output new linen% @ä@I#b€JÇ´ $€€˜ã"Œ€‰‚ÿ€€˜‚ÿÿÿ''null match; null replacementU%v@9A0 0€J€€‚ã⿲€‰€‚ÿCommands by Logical GroupingsDä@}A1ªÿÿÿÿÿÿÿÿ ÿÿÿÿ}AãIArithmetic Commandsá†9A^D[ „€ €€‚€‚‚€€‚‚€€‚€ €€ €€€€ €€ €‚ÿ3. 5 Arithmetic CommandsThere are five arithmetic commands:add(name)div(name)mod(name)mul(name)sub(name)For each command, the syntax is the same, only the command name changes:add(name) 'number'These commands are always used on the right side of the wedge. They all work with numeric strings. A numeric string is a string that CC can convert to a value. Valid characters in a numeric string are 0 through 9. It is valid to precede a string of numeric characters with - or +. CC will convert a numeric string to a numeric value. Such values must be in the range of -1,999,999,999 to +1,999,999,999 (without the commas).â}AyF9 @€Å€€€€€€€€€‚ÿCC assumes that the specified storage area contains a valid numeric string and that the string following the command is also a valid numeric string. CC will first convert both the string in the specified storage area and the string following the command into numeric values. The operation (add, divide, etc.) is then performed using the two numeric values and the result is stored as a numeric string in the specified storage area, replacing the store's original contents.Ù^D‰I7 <€³€€€€€€‚€ €‚ÿThe cont(name) function can be used instead of a numeric string. For more information on the cont(name) command, see section 2.4. The numeric string following the arithmetic command can be any combination of literal strings and ASCII characters. For example, the expression '34' is identical to the expression '3' d52. (see section 2.1 for an explanation of using ASCII characters.The numeric string following the command is terminated by the next command. In other words, CC will regard everything following the command up until the next command as part of the string to be operated upon. Note that nl is considered a character and will not terminate an arithmetic command, nor will c (comment), endfile, or '' (null).Z7yFãI# €n€€‚ÿThere are examples of these commands in section 3.4.= ‰I J1ÿÿÿÿÿÿÿÿ ÿÿÿÿ JñÃBack Commandì©ãI MC T€S€€‚€‚€€€€‚€€‚€ €‚ÿ3.2 The Back CommandThe command back(number) pulls back the previous number of characters which were stored or output and treats them as if they were new input.One of the main difficulties in writing a general changes table is trying to anticipate all the irregular typing sequences, both legitimate variations as well as errors, which occur in any manuscript.An often-encountered problem is that of extra spaces or ENTERs. These occur in various combinations and in varying numbers. Often in a printout, it is desirable that a sequence of spaces be treated like one. (There are exceptions, of course.) Without the back command there is no way to effectively do so.sP JM# € €€‚ÿThe following command line causes any sequence of spaces to become one space:> M½M( €,€‘€€€‚ÿ" " > " " back(1)êÅM³€% €‹€€‚‚ÿThis says, "if there are two spaces, put out one instead; then put that one character back into the input so that it is available to be matched again in the table." Keep in mind that the 1 in back(1) does not refer to a storage area, but to the quantity of characters to be moved back. See section 2.4 for more information on the back command.If these two spaces are followed by another space (i.e., if there were originally three spaces in a row), then the space that was output and backed over, plus the space following, will be a pair of½M³€ãI spaces which will match the entry above and be reduced to one space. This will continue for however many spaces occur together. Finally just one space will be left.‡W½M:‚0 .€¯€€€ €€ €‚ÿAnother place stray spaces occur is at the end of a line. The automatic wrap feature of various edit programs removes such spaces, but people still manage to get a few. The following command will remove a space that precedes an ENTER. (Multiple spaces preceding the ENTER will have been reduced to one by the command described earlier.)?³€y‚( €.€‘€€€‚ÿ" " nl > nl back(1)¥z:‚„+ $€õ€€‚€ €‚ÿThis says, "if a space immediately preceding a new line is matched, output a new line; then back up so the new line is treated like input and is available to be matched again in the table."Yet another source of multiple spaces in printouts is blank lines (multiple ENTERs). The following command takes care of blank lines in the same way multiple spaces are taken care of.?y‚]„( €.€‘€€€‚ÿnl nl > nl back(1) Ÿ|„ü„# €ø€€‚ÿAnd the following command removes spaces from the beginnings of lines, just as a previous one removed them from the ends:?]„;…( €.€‘€€€‚ÿnl " " > nl back(1)[*ü„–ˆ1 0€U€€€ €€ €‚‚ÿTogether these four force any sequence of spaces to be treated like a single space, and any combination of spaces and ENTERs to be treated like a single ENTER.But that is only one aspect of the difficulties needing to be dealt with. It is not uncommon to find text files that include Standard Format markers. These markers most commonly take the form of a \ followed by a lower case character and then a space character. Markers are put in by the person editing the file so that the file can be manipulated later by utility programs (such as CC). People are encouraged to put the Standard Format Markers at the left margin because it makes proofing and editing easier. But sometimes they don't. It would be a simple matter to write a changes table that put each \ on a new line. It would be as follows:8;…Έ( € €‘€€€‚ÿ"\" > nl "\"ࣖˆ®‹= H€G€€€€‚€ €€ €€ €‚ÿThat would work fine, but what if the \ was part of something else that we wanted to match (like a \w for instance)? The \ has already been output. The back(number) command can help us because it can take characters which have just been output and put them back into the input file as if they've never come through the table yet.In the following changes table, the first line will catch each \ that is preceded by an ENTER (as Standard Markers ought to be) so that they won't be changed. The second and third lines will catch each \ that isn't preceded by an ENTER, and put an ENTER in front of it. There could be a potential problem with the third line, however.­‚Έ[Œ+ $€€‘€€€‚ÿnl "\" > dup c Don't add nl to "\" if not needed! " \" > nl "\" back(2) "\" > nl "\" back(2) c This line is dangerousK®‹¦1 0€5€€€ €€ €‚‚ÿThe danger of the third line is that the program could be caught in a loop. Once the \ is matched, an ENTER is put in front of it, and it is sent through the table again. It would again match at the backslash if the first line of the table had not been included, or if we had said back(1) instead of back(2). An ENTER would again be put in front of it and it would be sent through the table again... and again... and again...How can such a thing be prevented? In this case we have included the first line to capture the newline and \, so there will be no problem with the program getting caught in a loop. This is the most obvious way, turning what is to be backed over into something different so that no piece of it will match at the same place again. But that isn't always desirable.¾š[ŒpÀ$ €5€€‚ÿThe second way is to be sure to include something to ¦pÀãIcatch the repetitions, such as a switch. (See section 3.4.) For example, the line could have been: t¦Á, (€è€‘€€€‚ÿ"\" > ifn(checked) set(checked) nl "\" back(2) else "\" clear(checked) endifS.pÀcÂ% €]€€‚‚ÿIt would catch itself when it attempted to send the same backslash through for a second time, thus preventing the loop.Another solution, sometimes a better one, is to catch the output of that dangerous entry (that might cause the program to go into a loop) and do something else with it. The lines:[2Á¾Â) "€d€‘€€€‚ÿnl "\" > dup "\" > nl "***ERROR***" nl "\"3cÂñÃ1 0€€€‚ãÜEЀ ‰€‚ÿcan be placed in the table. If a \ is not at the beginning of a line, the second entry would catch it, and draw attention to it in the output file for later correction, rather than try to fix it, back it into the input file, and match it again.GroupsE¾Â6Ä1]õÿÿÿÿÿÿÿÿ ÿÿÿÿ6Ä €Command DescriptionsWþñÃÇY €€ý€€‚‚€€‚€€€€‚€€€€€€€€‚€€‚ÿ2.4 Command DescriptionsAll commands must be entered in lower case.In the list of commands that follows, you will notice that some commands take an argument in parenthesis. An example of an argument is the name in store(name) command.Three commands take an argument with numerical value, represented by (number). These commands are: back(number), fwd(number), and omit(number).Other commands take a string argument represented by (name). Any combination of printable characters (including numbers) can be used in a string as an argument for these commands, except a comma, which is used as a separator for multiple arguments. These strings are case-sensitive. In other words, CC will treat store(Fred) and store(fred) as two different stores.$ó6ıË1 0€ç€€‚€€€€‚ÿThere are four classes of elements which can be named: defined sets of commands, groups, storage areas, and switches. The names used in each class is totally independent of the naming of any in the other classes. For example, nothing automatically happens to a switch named Fred when something is stored in a storage area named Fred.Some commands which take a parenthesized string argument may take more than one string, separated by commas, such as: (I,J,K). This has the effect of repeating the command. For example, set(1,2) has the same effect as set(1) set(2); it sets both switches 1 and 2. However, this does not work at all for the define command and will cause an error. And use(1,2) makes both group(1) and group(2) active, while use(1) use(2) only makes group(2) active. Commands which may take more than one argument inside the parenthesis are shown with name,name or number,number inside the parenthesis on the command description line. See specific commands for more details and examples.š=ÇKÍ] ˆ€{€€ €€‚€ ƒ€€ €€ €€€‚€€€€€€€€‚ÿadd(name) 'number'ADD number TO STORE nameThis command adds the number specified to the value in storage area name. It can only be used on the right side of the wedge(>). The results of the operation are stored in name, replacing name's previous contents. The following example will output 56.—j±ËâÍ- *€Ô€‘€€ƒƒƒ€‚ÿbegin > store(test) '22' endstore add(test) '34' out(test) c test contains 56¦rKÍ”4 6€å€€ €€ €€ €‚‚ÿNOTE: A + or - sign may precede the number. Leading zeros in a storage area will be removed after an add or any other arithmetic operation except the incr command. If store(test) had 0022 in the above example before the add operation, the final result would still be 56.Multiple arguments do not work with the arithmetic commands. In other words add(1,2) '4' will only add 4 to the contents of storage area 2. Zero will be added to the contents of storage area one. In order to add tâÍ”ñÃhe same number to both storage areas, you need: add(1) '4' add(2) '4'. See section 3.5 for more information about arithmetic commands.~FâÍ8 >€€€‚‚€ €€ ‚ƒ€€‚‚ÿThe contents of another store can be added to the store. For example,any(name,name)ANY ELEMENT OF STORAGE AREA nameThis function causes a match if any single character in the specified storage area is found in the input data. It may be combined with a string or used alone. This command can only be used on the left side of the wedge(>). It is useful for matching patterns which use any element of a closed class (e.g., any vowel). In contrast to the prec, fol, and wd commands, the character is actually matched and can be output with dup or stored in a storage area.äÀ”ö$ €€€‚ÿFor example, you could change all the consonants to "C" and all the vowels to "V" in a text, then run it through the wordlist program (WDL) to get a count of all the word-level CV patterns:F<2 2€)€‘€€ƒƒƒƒ€‚ÿbegin > store(vowel) 'aeiou' endstore store(cons) 'bcdfghjklmnpqrstvwxyz' endstore store(punct) '.,"?:;!<>()[]{}' "'" endstore any(vowel) > 'V' c Vowels become V any(cons) > 'C' c Consonants become C any(punct) > '' c Remove punctuationçwö# p ®€ï€€‚‚‚‚€ €€‚ƒ€ €€€‚ãœAQʼn€€ãœAQʼn€€€€€€€€ãCz"O‰‚ÿThis will delete all punctuation, change all vowels to "V", and change all consonants to "C."Multiple any commands may be specified in the search entry, such as any(vowel) any(cons). This search entry will match any vowel followed immediately by any consonant in the input file. This is equivalent to any(vowel,cons).See also the examples under the fol, prec, and wd commands.append(name) APPEND TO STORAGE AREA name This command is quite similar to the store(stet) command. However, the store(name) command causes the previously stored contents of area name to be discarded, whereas the append(name) command retains the previous contents and inserts the new data after any data that was already in the storage area. This command can only be used on the right side of the wedge(>) and does not take multiple arguments. See section 3.1 Storage Commands.(Ð<K X ~€¡€€‚€€€€€€‚ƒ€€€€€€‚€€€€‚ÿback(number,number)MOVE BACK number OF CHARACTERS INTO INPUTThis command causes the last number of characters output to be removed from output or storage and put back into the input stream of text, so they can be checked for a match again. This command can only be used on the right side of the wedge(>). It may take multiple arguments (repeats the command), or it may occur without an argument (backs up one character). The maximum number of characters that can be backed over is 999 characters, or to the beginning of the storage area (or output), whichever is less. Note that the number cannot be larger than 127, but more than one back command can be used to back up a total of 999 characters.H$# “ $ €I€€‚ÿBe careful when using the back command, since it is easy for the table to become hung up in an endless loop. If you use the back command, make sure there is either something else in the group that will match the results or send the table to another group with the use command. For example:åK ª2 2€Ë€‘€€ƒ€‚ÿc make orthography changes in word entries only group(1) '\w' > dup use(2) c change ae to e and return to group one group(2) 'ae' > 'e' '\' > dup back(1)c this will hang use(1) c without this line7ì“ íAK d€Ù€€‚‚‚€€‚€ƒ€€‚€€€€€€‚ÿWithout the use command to get the program out of group(2), the program will hang up when it comes to the next back slash. It will recognize the back slash, dup it, back up, recognize the back slash, dup it, back up . . . and on, and on.See section 3.2 on the back ªíAñÃcommand for more details.beginBEGINNING OF INPUT FILE OR NESTED BLOCKOn the left side of the wedge(>), this command must be by itself, and it must be the first entry in the table. Only comments may occur before the begin entry. The replacement which follows the begin command will be executed before any input data is read. This allows initialization of the table by setting switches and storing appropriate values in storage areas. It will not be executed again.·Yª¤D^ Š€³€€€€€€€€€€€€€‚€€€€€€€€‚ÿOn the right side of the wedge(>), this command is used in conjunction with the end command to set off a command or string from other commands or strings. The begin - end combination is primarily used for nesting if's and else's. See the end command for an example.Since a string only ends when a command is encountered - not a c (comment) or nl (new line),the begin and end commands must be used when two strings are adjacent and no command occurs between them. For example, suppose that at each new line we wanted to add 2 to a count and to output the new line. For example:Z.íAþD, (€\€‘€€€€‚ÿnl > add(count) '2' c causes an error ᪤DßE7 <€U€€€€‚€€€€‚ÿThis produces an error, because CC considers the nl command as part of the string that should be added.To overcome this problem, use the begin and end commands.¸†þD—F2 2€ €‘€€ƒƒƒ‚€‚ÿnl > begin add(count) '2' c this works end nl ornl > add(count) ‘2’ c this works begin nl end¬wßECG5 :€î€€€€ã†xl€‰€‚ÿThis particular problem can also be solved without the begin and end commands in either of the following ways:†Y—FÉG- *€²€‘€€‚ƒƒƒ‚€‚ÿnl > add(count) ‘2’ dup c this worksornl > nl add(count) ‘2’ dup c this worksœJCGeJR r€•€€‚‚€ €‚ƒ€ €‚ãüÒç:‰‚‚€ €‚€ƒ€‚€€‚ÿThis table will generate no errors and will produce the correct output.binaryDATA IS A BINARY FILEThis command is put on the right side of the wedge(>) in the begin section. This causes the input data to be handled as a binary file, and not as a text filecCOMMENTThis command may occur at the beginning of a line followed by a space or on the right side of the wedge(>), surrounded by spaces. It is used to indicate comments which explain to the user the purpose of entries in the table. Anything to the right of a c on the same line is ignored by the program.æÉG€M5 8€Í€€‚‚€‚ƒ€‚€€‚ÿComments are of great value and should be used throughout the table to explain the purpose and the approach.caselessCASELESS MATCHThis command is placed on the right side of the wedge(>) in the begin section of the table. See the begin command. It will be applied to all of the input data. The caseless command causes the first letter of a potential match string from the input to be treated as if it were a lowercase letter during the matching process, regardless of whether it was upper or lowercase in the input file. For this reason, the first character in the match string must be lowercase for a match to occur when using caseless. Note: All other characters in the match string are matched exactly, and case is not ignored.J%eJÊO% €K€€‚‚ÿIf the replacement string begins with a lowercase letter, the case of the first letter of the matched string will be preserved in the output. If the replacement string begins with an uppercase letter, the first letter of the output string will always be output as an uppercase letter, regardless of the case of the first letter of the input string that was matched.Caseless only works with the alphabetic letters a-z and A-Z. It will not apply to the first letter of a string which does not begin with a letter (e.g., it will not apply to "~n").*Í€M‚] ˆ€›€€‚€€€€‚ƒ€€ÊO‚ñÀ‚‚‚€€€€‚ƒ€€€‚€€‚ÿclear(name,name)CLEAR SWITCH nameThis command clears (un-sets) a switch which was set by a set command. This command can only be used on the right side of the wedge(>) and may take multiple arguments. Such as, clear(1,2,3), will clear switches one, two and three.cont(name)CONTENTS OF STORAGE AREA nameOn the search side, this function causes the contents of the specified storage area to be treated like a match string. For example:mDÊOm‚) "€ˆ€‘€€€‚ÿbegin > store(quark) "abcd" endstore cont(quark) > "wxyz"Ö‚€ƒ= H€­€€‚€€€€€€€€‚ÿwill function exactly like "abcd" > "wxyz"On the replacement side, this function is used in conjunction with the ifeq(name) 'string', ifneq(name) 'string', and ifgt(name) 'string' commands. For example:c:m‚ãƒ) "€t€‘€€€‚ÿ'x' > ifeq(proton) cont(quark) out(quark) endifÊ€ƒú†M h€•€€‚‚€ €‚ƒ€ €‚€€€€€€ã’\ ‰‚ÿsays, "if the string in storage area proton is the same as the string in storage area quark, then output the contents of storage area quark." This command will only accept multiple arguments on the left side of the wedge(>). Thus, cont(1,2) > ‘a’ c this works ‘a’ > ifeq(3) cont(1,2) c this fails.dDECIMALThe decimal value of a character may be used, without quotes, if it is immediately preceded by a d (either upper or lower case) or 0d (e.g., d8 is BACKSPACE, d9 is TAB). The d and the numbers must be surrounded by spaces or tabs. ASCII control codes are listed in Section 5.4 of this manual. The decimal codes 1 to 255 are legal before or after the wedge(>), but see the note sec. 2.1 C.‡$ドc ”€I€€‚€ €‚ƒ€ €‚ãÏJDቂ‚€€€€‚ƒ€€€€‚€€€€‚ÿdecrDECREMENTThis decrements the named store by one. The operates in an analogous way to the incr() command.define(name)DEFINE SET OF COMMANDS nameThis command allows the user to define a set of commands to be executed by the do(name) command. A changes table may have up to 127 defines distinguishing them by using a different number or string for name. The name specify for define command is the same name that is specified by the do command to executed the defined set of instructions. The form of the command is:R*ú†Ó‰( €T€‘€€€‚ÿdefine(name) > commands to be executedÒa‰¥Œq °€Ã€€ãf¸j ‰€€‚‚€€€€€‚ƒ€€€€€€€‚€€€€€€€€‚ÿThe define set of instructions ends at the next group, define, or match string. As a matter of practice, it is probably best to put all defined commands at the beginning of the table, after the begin statement and before the first group. This command occurs only on the search side of the table and will not take multiple arguments.div(name) 'number'DIVIDE STORE name BY numberThis command divides the value in the storage area name by a specified number. The results of the operation are stored in name, replacing name's previous contents. The following example will output 7.™nÓ‰>+ &€Ü€‘€€ƒ€‚ÿbegin > store(results) '21' endstore div(results) '3' out(results) c results holds 7׳¥ŒŽ$ €g€€‚ÿAny remainder will be discarded. In the following example, 21 divided by 5 is equal to 4 with a remainder of 1. CC will discard the remainder 1 and store a 4 in store(results):›q>°Ž* $€â€‘€€€‚ÿbegin > store(results) '21' endstore div(results) '5' out(results) c results holds 4†\Ž6* $€¸€€ãáÕò¬‰‚ÿA second store can be used in place of the number with the cont command. For example:³‡°Ž À, &€€‘€€€‚ÿbegin > store(results) '21' endstore store(divisor) '5' endstore div(results) cont(divisor) out(results)6 ÀñÃü®6ÂN j€]€€‚㡉‚‚€€€€‚ƒ€€€€‚€€‚ÿwill function the same as the previous example.This command will not take multiple arguments. See section 3.5 for more information about arithmetic commands. See also mod command.do(name, name)DO SET OF COMMANDS nameThis command causes the set of commands which were specified by define(name) to be executed. It can only be used on the right side of the wedge(>) and can take multiple arguments. For example:ãµ ÀëÂ. *€k€‘€€€‚ÿdefine(vowel) > '***' dup '***' 'a' > do(vowel) set(proton) 'e' > do(vowel) set(neutron) 'i' > do(vowel) set(nucleus) 'o' > do(vowel) set(quark) 'u' > do(vowel) set(fusion) ÎÂöÄ= H€€€‚ã¾-X ‰ã¾-X ‰€€€€‚ÿThe above will cause each vowel in the input to be output with three asterisks on each side. In addition, a switch, unique to each vowel, will be set (which might be used elsewhere in the table).The do command is more flexible than the next command, because do can be used before other commands in the same replacement, and next cannot. Also, do commands can be nested, that is, they can be used inside of define's, up to a depth of 10. For example:dëÂ…Å+ &€È€‘€€€‚ÿdefine(1) > 'x' do(2) 'x' define(2) > 'y' do(3) 'y' define(3) > 'z' 'a' > 'w' do(1) 'w'rMöÄ÷È% €›€€‚‚ÿIn this example, an "a" will be changed to "wxyzyxw."In this example, when the command do(1) is encountered in the table, it causes CC to execute the commands following the define(1) command. These commands happen to include a do(2) command which causes CC to execute the commands following the define(2) command. These instructions happen to include a do(3) command, which causes CC to execute the commands following the define(3) command. At this point the nesting depth is three. After the commands following the define(3) command are finished, CC will go back and finish the commands (if any) in define(2). When finished doing define(2), CC will go back and finish the commands (if any) in define(1). When finished doing define(1), CC will go back and finish the commands (if any) on the line that originally contained the do(1) command.ªX…Å¡ËR r€±€€‚€ €‚ƒ€ €‚ã`O‰ãâþ‰ãÎ`*N‰ãüÒç:‰ãìʼnf‰‚ÿdoublebyte(num1,num2)TREAT num1,num2 AS ONE DOUBLEBYTE ELEMENT.Based on the arguments that are the criteria of the new doublebyte command CC will internally treat qualifying pairs of bytes as one doublebyte element. The syntax of the command is doublebyte(dn1,dn2) where n1 and n2 are decimal numbers, or doublebyte(xn1,xn2) where n1 and n2 are a hexadecimal number, or doublebyte(n1,n2) where n1 and n2 are octal numbers. Note that octal is the default, to be consistent with other commands. The doublebyte command must be in the begin section. See section 3.6 Doublebyte.œK÷È=ÎQ p€—€€‚€€‚€ƒ€€‚‚‚€€‚€ƒ€€‚ã”õ‰‚ÿdupDUPLICATE SEARCH ELEMENTThis function will duplicate the search element of the change as found in the input file into the output file or storage area. Duplication may be done repeatedly (e.g., dup dup) Note: dup should not be performed after a back or fwd command. Incorrect results can occur. (You can dup into a store and output the store later.)elseELSEThe else command signals the program to take action when the condition of the if statement is not true. It also signals the program to stop taking action when the condition of the if statement is true.﹡Ë,Ï6 :€s€€ã”õ‰ã”õ‰ãï«€ó‰‚ÿThere are three basic parts to an if statement. The first part is the if command and the last is the closing endif command. The else command is the second part and is optional.›p=ÎÇÏ+ &€à€‘€€€‚ÿ'I will ' > dup if(rain) 'stay inside.' else 'go for a walk.' endif˜,Ïk† Ú€%€€‚ã”õ‰ãï«€ó‰ã”õ‰‚ã”õÇÏkñÉã†xl‰ã†xl‰ã”õ‰€€ã4[¥ß‰€€ãާ߉€€ãì¶3‰€€ãÌÏ’‰€€‚ÿPutting this CC table into English would give, "I will stay inside if it is raining, otherwise I will go for a walk."Note how the if, else, and endif commands were aligned. This is not necessary for the table to function, but makes it easier to see what action will take place when the condition is true or false, and shows that there is an endif command to terminate the if command.If an else command occurs without a preceding if command, no error message will occur, but the commands following the else command will never be executed. If you must check on multiple conditions, you should use the begin and end commands for nesting. See the end command for an example of this. See also if(name), ifeq(name), ifgt(name), ifn(name), and ifneq(name).ØÇÏq. *€±€€‚€‚ƒ€‚‚ÿendEND OF BLOCKThis command indicates the end of a block of commands. The corresponding block initiator is the begin command. (Do not confuse the begin command on the right side of the wedge(>) which initiates a block with the begin command on the left side of the wedge(>) which allows commands to be executed at the beginning of a changes table.) The begin and end commands are often used to delimit a nested block of commands within if statements. For example:²}k#5 8€û€‘€€€‚ÿ'x' > if(1) begin if(2) ‘1 and 2 are set’ else ‘1 is set, 2 is not’ end else begin if(2) ‘1 is not set, 2 is set’ else ‘neither 1 nor 2 is set’ end c The preceding entry outputs 'a' if 1 and 2 are on, c 'b' if 1 is on and 2 off, 'c' if 1 is off and 2 c on, and 'd' if 1 and 2 are both offÓ”qö ? L€)€€‚‚‚€€‚€ƒ€€‚€€‚ÿNote that when using the begin and end commands, it is not necessary to also use the endif command.The command end can also indicate the end of a repeated block of commands. (See the repeat command.)endfileEND OF INPUT FILENormally CC stops processing data when the program encounters the end of file marker in the input data. When used on the left side of the wedge(>) in a changes table, this command matches the end of file marker at the end of the text file and allows additional processing to take place before the program stops. The last element of the replacement must also be endfile (or dup), or the program will not stop. For example:`8#V ( €p€‘€€€‚ÿendfile > out(3) endfile c output store 3 and stopÛ¦ö 1 5 8€M€€‚‚€‚ƒ€‚€€‚ÿThis line in a table permits the contents of storage area three to be sent to the output and not be lost when the program encounters the end of the input data. The endfile entry may occur anywhere in the table; it does not have to be last.endifEND IFThis command marks the end of an if statement. It applies to all conditionals currently in effect, unless nested within the begin and end commands. For example:¹V ê , &€€‘€€€‚ÿ'x' > if(1) c Line 1 if(2) 'a' c Line 2 else 'b' endif c Ends ifs on lines 1 and 2èÄ1 Ò $ €‰€€‚ÿThe endif command in the preceding example ends both of the preceding if commands. In the following example, the endif command only ends the if command nested within the begin and end commands:Ö¨ê ¨. *€Q€‘€€€‚ÿ'x' > if(1) c Line 1 begin if(2) 'a' c Line 3 else 'b' endif c Ends if on line 3 only end ËÒ Á@B R€—€€‚‚‚€‚ƒ€‚ãœAQʼn€€ãCz"O‰‚ÿNote that when begin and end are used to mark the block of conditional code, the endif command is unnecessary. In the example above, if(1) does not need to be terminated by an endif.See also begin, end, else, if(name), ifeq(name), ifgt(name), ifn(name), ifneq(name).endsto¨Á@ñÃreEND STORINGThis command will cause any storing in effect to stop. Further output then goes to the actual output file. See store(name) ans section 3.1 Storage Commands.m¨.B^ Š€€€‚€€€€€€‚ƒ€€€€‚ãf¸j ‰€€ãf¸j ‰€€‚ÿexcl(name,name)EXCLUDE GROUP nameThis command will exclude the group name (see the group(name) command) from the groups that CC is currently using. It can only be used on the right side of the wedge(>) and may take multiple arguments. This table:mDÁ@›B) "€ˆ€‘€€€‚ÿbegin > use(dos,mac,unix,windows) use(dos,mac,windows) N+.BéB# €V€€‚ÿwill have the same effect as this table:b9›BKC) "€r€‘€€€‚ÿbegin > use(dos,mac,unix,windows) excl(unix)0ÂéB{En ª€…€€€€ãyDቀ€‚‚€€€€€€‚ƒ€€€‚€€€€€€€€‚ÿThe excl(name) command has the opposite effect of the incl(name) command.fol(name,name)MATCH IF FOLLOWED BY ANY CHARACTER IN nameThis function will cause the string to be matched only when followed by any one of the characters contained in the storage area name. Note that the character itself is not matched and will not be output by the dup command. The character is a condition of the match, not a part of the match.¥{KC G* "€÷€€€€‚ÿThis function should be used only on the search side, between the match string and the wedge(>) and will take multiple arguments. It is particularly convenient for matching strings which are required to be at the end of a word. All word-final punctuation, including a space, can be stored in a particular storage area and used with the fol(name) command. Here is an example:—m{E·G* $€Ú€‘€€€‚ÿbegin > store(vowel) 'aeiou' endstore store(stop) 'bdg' endstore any(vowel) fol(stop) > dup dupé GÑI1 0€Ó€€‚€€€€‚ÿThis would double any character found in storage area vowel (a, e, i, o, or u) that was followed by one of the characters in storage area stop (b, d, or g).More than one fol(name) command may be used in succession. If for example, 'test' fol(1,2,3) were on the search side of a table, CC will look for test, followed by something in storage area 1, followed by something in storage area 2, followed by something in storage area 3. This is equivalent to 'test' fol(1) fol(2) fol(3).¯&·G€M‰ à€M€€ã,ã/‰€€ã(m‰€€ãoeœ‰€€‚‚€€€€€€€‚€ƒ€€€€€€‚€€€€€€‚ÿCompare this with the commands wd(name), prec(name), and any(name).fwd(number,number)MOVE FORWARD number OF CHARACTERSThis command causes the following number of characters that would be input to be passed directly to output or storage, without being considered for matching in the table. This command may only be used on the right side of the wedge(>). It may take multiple arguments (repeats the command), or it may occur without an argument (passes one character to the output or storage area). Although number cannot be greater than 127, as many as 300 characters may be forwarded in sequence by using more than one fwd(number) command; attempting to move more than 300 characters will be regarded as an error condition, and an appropriate message will be given.®5ÑI:€y À€k€€‚€€€€‚€ƒ€€€€‚€€ã®;µ‰€€ãyDቀ€ãwAÀ‰€€€€€€‚ÿgroup(name)GROUP OF CHANGES CALLED nameThis command identifies the following changes as belonging to the group name. Which group of commands is currently active is controlled by the use(name), incl(name), and excl(name) commands. The group command is put at the beginning of a line by itself and is not followed by a wedge(>). In a sense, it is not a command, but a label at the beginning of each set of change entries. It does not take multiple arguments. If a table consists of only one €M:€ñÃgroup, the group command is not necessary.>ê€Mx‚T v€Õ€€€€€€€€ã®;µ‰€€ãyDቀ€€€‚ÿA changes table may have up to 127 groups. Each must be distinguished by a different string or number for each. Whatever name is used in the group(name) command, is the name that must be used to subsequently make the group active with the use(name) or incl(name) command. If the changes table is longer than two pages, then numbers could be used for each group name instead of string names. This will make it easier read and follow its flow when the table changes groups.á·:€Y„* "€o€€€€‚ÿThe program will always start with the group that has a name of 1 or the first group in the table, if there is no group(1). If a number is used in the beginning of a group name, that number is assigned to it when the table is loaded. If there is a group name with the number one followed by letters, it will be assigned to group one and will be the first active group, even though it was not the first group in the table. For example:ýÈx‚V…5 8€‘€‘€€€‚ÿbegin > caseless group(main) '\w' > dup use(1st) '\d' > dup use(2nd) group(1st) c CV pattern of words 'a' > 'V' 'b' > 'C' '\' > dup back(1) use(main) group(2nd) c definition ...…`Y„Û‡% €Á€€‚‚ÿCC will begin processing text using the set of changes found in group(1st) not in group(main) as you might expect. This feature of CC could cause strange looking output, until the table gets in sync with the data coming into it. However, a use command in the begin statement can initialize the table to start with a specific group. Or the incl command can be used to initialize the table to start with several groups active.Groups are particularly useful when certain changes are wanted in one context but not in another, e.g., changing the orthography of one language inside a bilingual dictionary file.«@V…†Šk ¤€€€‚€€€€€€‚€ƒ€€€€€‚€€‚ã™V<‰€€ãlp”ð‰€€‚ÿif(name,name)IF SWITCH name IS SETThe if command checks the status of switch (name) and executes the following commands based on the condition of the switch. The if command can only be used on the right side of the wedge(>). It can take multiple arguments, e.g., if(1,2), means perform the following changes only if switches one and two are both set.If the switch is set, then the following replacement commands are executed. See the set(name) and clear(name) commands. If the switch is clear, then the following replacement commands are ignored./µÛ‡µŒz €k€€€€ãï«€ó‰ãÌQ⽉‚ãüÒç:‰ã†xl‰ã†xl‰ãì¶3‰€€‚‚€€€€€‚ƒ€€€€€€‚ÿThere are three parts to an if command. The if(name) is the first part. The last part is the endif command. The second part (optional) is the else command.The if command may be nested with other if commands (checking for multiple conditions) by using the begin and end commands. See the end command for an example of nested if commands.) See also ifn(name.ifeq(name) 'string'IF STORE name EQUALS stringz†Š/` Ž€5€€ãœAQʼn€€ãÉ1%‰ãÔ0B‰€€ãœAQʼn€€ãáÕò¬‰€€ã$‰‚ÿThis command executes the following commands if the content of store name exactly matches the string. It can only be used on the right side of the wedge(>) and does not take multiple arguments. A string is any combination of literal strings, nl's, and ASCII characters (such as d8 for BACKSPACE). The cont(name) command can be used instead of a string to compare the contents of store name to the contents of another storage area. (See the cont(name) command. Also see section 2.1.C ASCII number codes) For example:_6µŒŽ) "€l€‘€€€‚ÿ'x' > ifeq(orange) 'apple' set(ripe) endif L)/Ú# €R€€‚ÿwill have exactly the same results as:ˆ^ŽnÀ* $€¼€‘€€€ÚnÀñÂÿ'x' > store(fruit) 'apple' endstore ifeq(orange) cont(fruit) set(ripe) endifÅ:Ú3Ë ä€u€€€€ã4[¥ß€‰€ãʸµ•€‰€€ã²–¾¢‰€ã"Œ‰‚€€ãÌQâ½€‰€ã4[¥ß€‰€ãÌÏ’€‰€ãާ߀‰€‚ÿThe string is terminated by the following command. Note that nl is considered a character and will not terminate an ifeq or write command, nor will a comment, endfile, or '' (null).The conditional execution is terminated by an endif or else command, or by the end of the table entry. Note that when doing comparisons of stores with ifeq( ), ifneq( ), and ifgt( ), any leading zeros that may be in the store area will be irrelevant because CC attempts a numerical comparison of stores before it does a byte-for-byte ASCII comparison.UÛnÀˆÅz €·€€ã”õ€€€€‰‚‚€€€€€‚ƒ€€€€€€€€‚ã4[¥ß‰ãœAQʼn€€€€‚ÿSee also the discussion under the if(name) command.ifgt(name) 'string'IF name GREATER THAN stringThis command is very similar to the ifeq command, in that it compares the contents of store name to the following string or to the contents of another storage area. It can only be used on the right side of the wedge(>). If the contents of name are greater than the string, the following commands will be executed; if not, they will be skipped.9í3ÃÁÇL f€Û€€‚‚€ €€€‚ƒ€ €€€€ €€ €‚ÿWhen comparing numbers, the actual values are compared. Leading zeros are disregarded. Thus "0011" is greater than "2." When comparing characters, "greater than" is strictly according to ASCII codes. See the ASCII table in section 5.4 of this manual for details. Thus, "b" is greater than "abc" and "a" is greater than "B" or "1." CC attempts a numerical comparison first, before it does a byte-for-byte ASCII comparison.iflt(name) 'string'IF STORE name IS LESS THAN string.A߈ÅÊb ’€¿€€ãާ߉‚‚€€€€€€‚ƒ€€€€€‚ã”õ‰€€€€‚ÿIF STORE name IS LESS THAN string. This command is like ifgt(), but it means if less than.ifn(name,name)IF SWITCH name IS NOT SETThis command is completely parallel to if except that it executes the commands and replacements following it if the switch is not set (is clear), and doesn't execute them if the switch is set. It can take multiple arguments, e.g., ifn(1,2), means perform the following changes only if switches one and two are both clear.SÒÁÇUÌ Ѐ¥€€‚€€€€€‚ƒ€€€€€€€€‚ã4[¥ß‰€€€€‚‚€ €€€€‚€ƒ€‚ãާ߉‚ÿifneq(name) 'string'IF name IS NOT EQUAL TO stringThis command is like ifeq, except that the following commands and replacements are executed if name is not equal to the string. It will not take multiple arguments.ifngt(name) 'string'IF STORE name IS NOT GREATER THAN string. IF STORE name IS NOT GREATER THAN string. This command is like ifgt(), but it means if not greater than (this is the same as less than or equal to).™ÊfÎx ¾€3€€‚€ €€€€‚€ƒ€ €€€ €‚ãާ߉‚‚€€€€€‚ƒ€€€€€€€‚‚ÿifnlt(name) 'string'IF STORE name IS NOT LESS THAN string.IF STORE name IS NOT LESS THAN string. This command is like ifgt(), but it means if not less than (this is the same as greater than or equal to)ifsubset(name)’string’COMPARES name TO 'string' This command compares a named store to see if it a subset of the given string. If so the commands following are executed©EUÌd –€‹€€€‚€€€€€€‚ƒ€€€‚€€ãf¸j ‰€€ãwAÀ‰€€‚ÿ.incl(name,name)INCLUDE GROUP nameThis command will include group name with the group(s) that CC is currently using. (See the group(name) command.) This command has the opposite effect of excl(name). It can only be used on the right side of the wedge(>) and can take multiple argumentsfÎñÃ. This table:AfÎ\( €2€‘€€€‚ÿbegin > use(2,5,8,4) N+ª# €V€€‚ÿwill have the same effect as this table:Q(\û) "€P€‘€€€‚ÿbegin > use(2,5,8) incl(4)T*ªO* "€U€€€€‚ÿNote that the specified group is appended to the end of the list of groups that CC is using. If CC finds no matches in the first group, then it will test the next group in line for a match. In the following example, with input of characters abce, the program will output abc g1 e, not abce g2.Ÿrûî- *€ä€‘€€€‚ÿbegin > use(1) incl(2) group(1) 'abcd' > dup ' g1 ' 'abc' > dup ' g1 ' group(2) 'abce' > dup ' g2'^þOL` Ž€ý€€‚‚€€€€€€‚ƒ€€€€‚ãœAQʼn€€ãÔ0B‰‚€€‚ÿWhen setting multiple groups active, the groups with the longest strings should be made active first.incr(name,name)INCREMENT STORE name BY ONEThis command causes the last character of store name to be incremented by one so that it becomes the next character on the ASCII chart. This command can only be used on the right side of the wedge(>) and may take multiple arguments.A common use of incr(name) is to count the number of occurrences of a certain character or string in a file:ŠaîÖ) "€Â€‘€€€‚ÿ'x' > dup incr(total) c count every x endfile > out(total) endfile c output countÕL«8 >€;€€‚€€‚㬉㬉‚ÿThe above table will count every occurrence of x.The incr command preserves leading zeros in a store. For example, if store x contained "0001," it would contain "0002" after doing incr(x). Note that when doing comparisons of stores with ifeq( ), ifneq( ) and ifgt( ), the leading zeros will be irrelevant because CC attempts a numerical comparison of stores before it does a byte-for-byte ASCII comparison.It should be noted that incr(x) is not absolutely identical to add(x) '1'. The incr command will preserve leading zeros, the add command will not. Also, the incr command is allowed on stores which contain non-numeric strings, whereas add(x) '1' is not. áÖ¶ * "€Ã€€ãœAQʼn‚ÿThe incr command can also be used to change letters to the next letter in order. This could be used to advance footnote reference entries. In the following example the "x" in store(zork) is incremented and becomes a "y."X0« ( €`€‘€€€‚ÿbegin > store(zork) 'x' incr(zork) out(zork)iD¶ w % €‰€€‚‚ÿWhenever CC tries to increment a character that doesn't exist, it will create the character 0, and then increment the 0 to 1.If the last character in the store is a 9, then the character to its right in the store will be incremented by one, and the 9 will be changed to a zero. In the following example the output is B0.‰_  * $€¾€‘€€€‚ÿbegin > store(alpha) 'A7' incr(alpha) incr(alpha) incr(alpha) out(alpha)HÕw Hs ´€«€€‚‚€ €€ €‚ƒ€ €‚‚‚€€€€€‚ƒ€€€€€€‚€€€€€€‚ÿHad there only been a 7 in store(alpha), rather than A7, then CC's final result would have been 10.len(name)LENGTHThis command provides the length of a named storemod(name) 'number'REMAINDER OF STORE name numberThis command divides the value in the specified storage area by the value of the number. The remainder from the division operation is stored in name, replacing name's previous contents. The following example will output 7:zP Â* $€ €‘€€€‚ÿbegin > store(test) '40' endstore mod(test) '11' out(test)ÎoHœA_ Œ€ß€€€€‚‚€€€€€‚ƒ€€€€€€€‚€€€€‚ÿSince 40 divided by 11 is 3 with a remainder of 7, CC discards the 3, and stores the 7 in storage area test. If there is no remainder, CC will store a 0 as the remainder. This command can only be used on the right side oÂœAñÃf the wedge(>) and does not take multiple arguments. See section 3.5 for more information about arithmetic commands.mul(name) 'number'MULTIPLY STORE name BY numberThis command multiplies the value in the specified storage area by the value of the number. The results of the operation are stored in name, replacing name's previous contents. The following example will output 48:yOÂB* $€ž€‘€€€‚ÿbegin > store(test) '4' endstore mul(test) '12' out(test)šPœA¯EJ b€¡€€‚‚€€‚€ƒ€€€€‚ãœAQʼnãœAQʼn‚ÿThis command can only be used on the right side of the wedge(>) and does not take multiple arguments. See section 3.5 for more information about arithmetic commands.(name)NAME OF STORAGE AREA, SWITCH, GROUP, OR DEFINEAny combination of printable characters (including numbers) can be used in name to designate specific switches, groups, defines or storage areas. The only exceptions are a space and a comma. A comma is used as a separator for multiple names. See individual commands for which can or cannot take multiple arguments. Letters are case-sensitive. In other words, CC will treat store(NAME) and store(name) as two different stores. The naming of each is totally independent of the naming of any of the others. For example, nothing happens to a switch named Vowel when something is stored in a storage area named Vowel.6ÿBåF7 <€ÿ€€‚€€‚€ƒ€€‚‚ÿnextUSE CHANGES IN NEXT ENTRYThis command executes the replacement side of the next search entry. This is useful when a number of similar match-strings need the same change. It saves table space and makes the table easier to read. For example:±„¯E–G- (€ €‘€€€‚ÿ'a' > next c change all vowels to V 'e' > next c and add one to vowel count 'i' > next 'o' > next 'u' > 'V' incr(vowel)4åFJK d€i€€‚‚‚€€‚€ƒ€€‚€€€ €€ €‚ÿCommands and replacement strings may precede next on the replacement side, but anything following the next command on that replacement is ignored.See also the define and do commands.nlNEW LINEIf used on the left side of the wedge(>), nl matches an ENTER in the input. If used on the right side of the wedge(>), it has the effect of putting an ENTER into the output. Note, that the program considers nl as a character sequence and not a command. You cannot put an ENTER between quotes. The only way to indicate an ENTER is to use the nl command.Eí–GZMX ~€Û€€‚€‚ƒ€‚€ €€€€€€€€€€€€€‚ÿ' 'NULL MATCH or REPLACEMENTIf used on the left side of the wedge(>), the null match will match when nothing else will. In other words, if nothing else in this group matches the input, do what is on the right side of the wedge(>). Note that the following restriction must be observed to avoid putting the table into a loop: When ' ' is used on the left side of the wedge(>), you should put either a fwd(number), omit(number) or a use(name) command on the right side of the wedge(>) so progress can be made through the input. See the fwd(number), omit(number), and use(name) commands. If the table uses a fwd or omit command on a null match, then there should be a separate entry in that group to look for endfile. For example:ÕJ`N1 0€«€‘€€€€‚ÿ'a' > 'a' endfile > endfile c protect against null c match at end of file '' > fwd(1) '-' c this puts a hyphen after c any char other than 'a' P ZM°O0 .€A€€€ €€€‚ÿThe ' ' is meaningless when used on the right side of the wedge(>). It is sometimes used, however, to visually signify that nothing is being output. It is not necessary, but is helpful to clarify what is happening. (It's absence does not save any table space.) Thus, the following:}Q`N9€, (€¢€‘€€€€‚ÿ"a" > '' c get rid of every °O9€ñÃa "b" > "c" c change every b to c 5°On€# €$€€‚ÿis the same as:uK9€ã€* $€–€‘€€‚€‚ÿ"a" > c get rid of every a "b" > "c" c change b to c ¦n€‰ƒ è€3€€€‚ƒ€‚€ €€ €€ €€ €ã¬‰€€ãø¾2‰€€ã¡‰€€ãÛ…‰€€ãÇ=O‰€€ãø¾2‰ã¡‰‚ÿ'number'NUMBER FOR ARITHMETIC OPERATIONA valid number should only contain the characters 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9. The number may be preceded by a minus (-) or plus (+) sign. The 'number' must be in the range of -1,999,999,999 to +1,999,999,999 and not contain commas. It is used with the following arithmetic commands: add(name) 'number', div(name) 'number', mod(name) 'number', mul(name) 'number', or sub(name) 'number'. When used with the div or mod commands, 'number' must not be zero.‘〈 Ѐ!€€‚€€‚€ƒ€€€€‚€€€€‚‚€€€€€€‚ƒ€€€€€‚€€€€€€‚ÿ(number)number OF CHARACTERSThe value of the (number) must be in the range of 1 to 127. The fwd, back, and omit commands use the value of(number) to either advance through characters in the input, back up over characters previously sent to the output, or remove characters from the input.omit(number,number)OMIT number OF CHARACTERS FROM INPUTThis command causes the following number of characters, that would be input, to be discarded. These characters will not be passed through the table to be matched nor put into output or storage. This command can only be used on the right side of the wedge(>). It can take multiple arguments (repeats the command), or it may occur without an argument (discards one character from the input). Although number cannot be greater than 127, as many as 300 characters may be omitted in sequence by using more than one omit(number) command. Attempting to omit more than 300 characters will be regarded as an error condition, and an appropriate message will be given.¸T‰ƒÒŠd –€©€€‚€€€€€€‚ƒ€€€€‚€€ãœAQʼn€€ã¸V¸T‰ãCz"O‰‚ÿout(name,name)OUTPUT STORAGE AREA nameThis command sends the contents of storage area name to the output. The contents of store(name) remain unchanged and may be output more than once. If storage was in progress when the out was encountered, the program stops the storing process. The contents of that storage area are unchanged. After this command is completed, results will go to the actual output. This command can only be used on the right side of the wedge(>) and can take multiple arguments. See section 4.5 Predefined Constants.and section 3.1 Storage Commands.‰0ˆ[Y €€a€€‚€€€€€€‚ƒ€€€€€€‚€€€€‚‚ÿouts(name,name)OUTPUT STORE name WHILE STORINGThis command sends the contents of storage area name to the current output or storage area. Any storing already in progress continues. The contents of storage area name are unchanged. This allows transfer of material between storage areas. This command can only be used on the right side of the wedge(>) and can take multiple arguments.For example, the following copies the contents of storage area 1 to storage area 2, and storage area 2 remains open after the outs(1) command is executed:<ÒŠ—( €(€‘€€€‚ÿstore(2) outs(1)p[ÀY €€/€€ã¸V¸T‰ãCz"O‰‚‚€€€€€€‚ƒ€€€€‚€€‚ÿNote that the contents of storage area 1 does not change. See section 4.5 Predefined constants. and section 3.1 Storage Commands.prec(name,name)MATCH IF PRECEDED BY ANY CHARACTER IN nameThis function will cause the string to be matched only when that string is preceded by any one of the characters contained in the specified storage area. This command can only be used on the search side, between the match string and the wedge(>) or between the match string and a fol command. It can take multiple argum—ÀñÃents.ÿÈ—Â7 <€‘€€€€€€‚€€‚ÿNote that the character is not considered part of the match and will not be output by the dup command. The character is a condition of the match, not a part of the match.This function is particularly convenient for matching a string which is required to be at the beginning of a word. Any character that may appear before a word such as a space, can be stored in a particular storage area and used with the prec(name) command. An example follows:sJÀ…Â) "€”€‘€€€‚ÿstore(begin-word) ' ' nl '<"([{' endstore 'c' prec(begin-word) > 'ch'.̳Äb ’€™€€€€€€‚€€€€‚ã,ã/‰€€ã’¢‰€€ãoeœ‰€€‚ÿThis would change any c that is preceded by a word-break character to the character sequence ch.More than one prec(name) command (up to a maximum of 10) can be used in succession. For example, 'test' prec(1,2,3) will look for test, preceded by something in 3, preceded by something in 2, preceded by something in 1. This is equivalent to 'test' prec(1) prec(2) prec(3).Compare this with the wd(name), fol(name), and any(name) commands.瞅šÇI `€=€€‚€€‚€ƒ€€‚€ €€ €€ €‚ÿreadREAD CHARACTERS FROM THE KEYBOARDThis command takes information typed at the keyboard and sends it into the current storage area if storing, or directly to the output. CC stops reading characters from the keyboard when the ENTER key is pressed. The ENTER is simply a signal to the read command to stop reading characters from the keyboard; the ENTER does not actually go to the storage area or output. It can only be used on the right side of the wedge(>). Prior to issuing a read command, it would be advisable to use a write command to send a message to the screen to prompt the operator for the desired information to be entered at the keyboard.Η³ÄhÈ7 <€/€€‚€€‚€ƒ€€‚‚ÿrepeatREPEAT FROM beginThis command goes to the nearest previous begin. It can only be used on the right side of the wedge(>). For example:ö¶šÇ^Ë@ N€m€‘€€‚‚€‚ÿc This table fills short lines with the letter x c until all lines have sixty characters begin > caseless store(char) ' abcdefghijklmnopqrstuvwxyz,.?!' store(count) '0' endstoreany(char) > dup incr(count)nl > ifgt(count) '59' begin '**** ERROR count 60 or greater ***' nl end else begin incr(count) c Increment count 'x' c and output an x ifneq(count) '60' c If count not sixty, repeat c go back to begin endif store(count) '0' endstore nl c restore count and output newline end endif©\hÈÏM h€¹€€‚‚€€€€€€‚ƒ€€€€‚€€‚ÿWhenever a repeat command is being used, the condition that controls it should be checked to make sure it is properly set before beginning the repeat loop. In this example we checked first to make sure that the count was less than 60 before starting the repeat command. If, for some reason the count was 60 or greater when we encountered a newline, the program would hang up in an endless loop.set(name,name)SET SWITCH nameThis command sets a switch or flag which can be checked using if commands for conditional execution of table entries. It can only be used on the right side of the wedge(>) and may take multiple arguments. CC permits use of up to 127 switches, distinguished by different names. Whatever number or name is used when a switch is set is the name or number checked by the if or ifn command for the condition of the switch.˜Ý^Ë«» D»€€€€ãlp”ð‰‚‚€€€‚ƒ€€‚ãuü@E‰‚‚€€€€€€‚ƒ€€€€‚€€€€€€€€€€€€ãÙpñ‰€€ã‰€€ã#Y‰€€€€‚ÿA switch can be turned off by using the clear command. All Ï«ñÃswitches are initially clear (not set).'string'LITERAL STRINGA string is any combination of literal strings, nl's, and ASCII characters (such as d8 for BACKSPACE). See section 2.1.a Stringsstore(name,name)STORE IN STORAGE AREA nameThis command closes any previously open storage area and sends future output to storage area name. CC can only store into one storage area at a time. Any data previously stored in area name is discarded. It can only be used on the right side of the wedge(>). It can take multiple arguments (repeats the command). Up to 127 storage areas may be used. They are distinguished by using a different name for each. The name that is specified in the store(name) command is the same name that must be specified when its contents are subsequently output. See the append(name), out(name), and outs(name) commands as well as the description of name.wFÏ"1 0€€€ãÝ)?ى㉂‚ÿA storage area is cleared by a store command followed by an endstore, out, or another store command.Note that if multiple stores are requested at once, the effect will be to erase and close each until the last, which will be cleared, but remain open for storage. The following three lines are equivalent to each other:–l«¸* $€Ø€‘€€€‚ÿ'x' > store(1,2,3) 'x' > store(1) store(2) store(3) 'x' > store(1) endstore store(2) endstore store(3)§3"_t ¶€g€€ãCz"O‰€‚€‚€€€€€‚ƒ€€€€€€€€‚€€€€€€€€‚ÿSee section 3.1 Storage Commands.sub(name) 'number'SUBTRACT number FROM STORE nameThis command subtracts the number from the value in the storage area name. The difference is stored in name, replacing name's previous contents. The following example will output the number 3:šn¸ù, (€Ü€‘€€ƒƒ€‚ÿbegin > store(value) '17' endstore c value = 17 sub(value) '14' c value = 3 out(value) ¿›_¸$ €7€€‚ÿIn addition to subtracting literal numeric strings, sub can also subtract the contents of a store. The following example will also output the number 3.É™ù 0 .€3€‘€€ƒƒƒƒ€‚ÿbegin > store(value) '17' endstore c value = 17 store(num) '14' endstorec num = 14 sub(value) cont(num)c value = 3 out(value) .ʸ¯ d –€•€€ãáÕò¬‰‚‚‚€ €‚ƒ€ €‚ãÉ1%‰‚‚€€€€€€‚ƒ€€€€‚ÿWhen the contents of a second store is used, it must be strictly numeric. Any other characters will generate an error message. (See the cont command.)The sub command can only be used on the right side of the wedge(>) and does not take multiple arguments. See section 3.5 for more information about arithmetic commands.tabTABThis command provides a tab, much like nl provides a new lineuse(name,name)USE CHANGES IN GROUP nameqA  0 .€ƒ€€ãf¸j ‰ãf¸j ‰‚ÿThis command specifies which groups of changes are currently for matching. (See the group command.) When a use command is encountered, any previous use command is canceled. If use(x) is specified, then the changes in group(x) are available for matching and the changes in all other groups are ignored. For example:Éš¯ é / ,€5€‘€€€‚ÿgroup(def) c change a to aa following a \d c but not following a \w marker '\w' > dup use(word) 'a' > 'aa' group(word) '\d' > dup use(def)Ç AI `€€€ãf¸j ‰ãf¸j ‰ãf¸j ‰ãf¸j ‰‚€€€€‚ÿThe program will match in group(def), changing a to aa wherever it is encountered, until a \w marker is found. At that point it will switch to group(word), where nothing is changed. The program will continue in group(word) until a \d is found in the text, at which point it will switch back to group(def).Several groups can be made available for searching at the same time. For example use(1,8,4) causes groups 1, 8, and 4 to be searched in that oré AñÃder. Note that use(1,8,4) is not equivalent to use(1) use(8) use(4). Although up to 127 groups can exist in a table, no more than 25 of them can be used at one time. The groups will be searched in the order they are specified in the use command.Øé CA P€±€€€€‚‚€€€€‚ƒ€€‚‚ÿA use command does not take effect until the end of the replacement entry in which it was specified. This command can only be used on the right side of the wedge(>).wd(name)MATCH ONLY IF WORDThis command causes a string to be considered matched only if it is both preceded and followed by any character contained in storage area name. This command is used only on the search side of the table, just before the wedge(>). It does not take multiple arguments.بAöC0 .€Q€€€€ã†"A‰‚ÿNote that the preceding and following characters are not considered part of the match and would not be output by a dup command. For example, the following table:rIChD) "€’€‘€€€‚ÿbegin > store(punct) nl ' .,"()' endstore 'and' wd(punct) > 'also' ‰föCñD# €Ì€€‚ÿwould change only the word "and" to "also", but leave any words containing the letters "and" alone.žshDE+ &€æ€‘€€€‚ÿINPUT and. band and, and" sands (and and) "and OUTPUT also. band also, also" sands (also also) "also†QñDH5 8€£€€‚‚€€‚ƒ€€‚‚ÿWhen storing the word boundary punctuation, diacritics should not be included. Also, there is a small gain in speed if the most frequently used characters are listed first.write 'string'WRITE string TO SCREENThis command writes the following string to the screen. A string is any combination of literal strings, nl commands, and ASCII characters (such as 7 for bell to wake up the operator). This command can only be used on the right side of the wedge(>). The string is terminated by the following command or next search entry. It may contain nl's and multiple lines. For example:VE”H) "€¬€‘€€€‚ÿ'cat' > write nl 'cat found' nl 'bird' > write nl 'feathered friend found' nl dup´H›JS t€i€€ã†"A‰‚‚€€€€€€‚ƒ€ƒ€€€€€‚ÿWhen a cat is matched the program writes the message cat found on the screen. The message is terminated by the next search entry. When a bird is matched the program writes the message feathered friend found on the screen. In this case, the write command is terminated by the dup command. The string bird is written to the current output area and not to the screen.wrstore(name,name)WRITE STORAGE AREA nameTO SCREEN‹O”H&L< F€Ÿ€€€€ãÏJDቀ€€€‚ÿThis command writes the contents of store name to the screen. It can only be used on the right side of the wedge(>) and may take multiple arguments. Combining the example under write with the example under incr(name), if a count of every x was kept in storage area count, the total could be printed to the screen as follows:Ó›J'M. *€§€‘€€‚€‚ÿendfile > write 'There were ' wrstore(count) write " occurrences of x" nl endfileendfile > write 'There were ' wrstore(count) write " occurrences of x" nl endfile^&L…OB R€9€€ €‚ƒ‚€€€€€€ã’\ ‰‚ÿxHEXADECIMAIHexadecimal may be used by placing an "x" or "0x" (either upper or lower case) immediately preceding the number (e.g., x8 is BACKSPACE). If and only if hexadecimal is used, only one x need precede multiple hexadecimal ASCII codes (e.g., X7E08 is ~ BACKSPACE). If you do this, however, be sure that each hexadecimal ASCII code is expressed using 2 digits (e.g., ~ BACKSPACE should be represented by x7E08, not x7E8). The hexadecimal codes 1-FF are legal before or after the wedge(>), but see the note section2.1.C.D'M €* $€4€€‚ã;‰<…‰‚ÿCommand Line Options…O €ñÃE…OQ€1Ð5ÿÿÿÿÿÿÿÿ ÿÿÿÿQ€pDCommand Line Options™` €ê‚9 @€Á€€‚‚‚€€€€‚ÿ2.5 Command Line OptionsCC has two modes of operation. The user can supply all the parameters on the command line at the DOS prompt, as described in section 1.3. The program can also be run in interactive mode. This mode prompts the user for the needed parameters to run CC. Typing "CC," followed by enter at the command prompt, starts interactive mode.ccConsistent Changes 7.5, March 1995, Copyright 1980-1995 SIL Inc.Changes file? convert.cctOutput file? output.txtInput file? input.txtProcessing input file INPUT.TXT; Writing to output file OUTPUT.TXTNext Input file ( if no more)?³‰Q€ƒ* "€€€€€‚ÿTyping "CC ?" followed by ENTER at the command prompt will display a help screen and return to the prompt. This is the help display:lê‚ †M h€?€ €‚‚ãW‰ã¬ð‰ã}‰ã±§‰ã䶉‚ÿConsistent Changes 7.5, March 1995, Copyright 1980-1995 SIL Inc.Usage: CC Switches Input_filesCommand Line Options,-t Table name - this is required-q Quiet - don't ask, just delete and replace output file, if it exists-n Noiseless - don't beep or display processing messages-a Append - append to output file, if it exists-o Output filename - may contain * or ? wildcards-i Input list filename - list of input files taken from file-w Write command output filename - file output for write and wrstore commandsjEƒs†% €Š€ €‚ÿInput_files are input file names that may contain * or ? wildcardsª† †‡$ € €€‚ÿCC will now process groups of files by using the DOS wildcards * or ? in input and/or output file name specifications. For example:N&s†k‡( €L€‘€€€‚ÿcc -t table.cct -o total.out *.txtœx‡‰$ €ñ€€‚ÿThe program will process all files with an extension of .TXT in the current directory, and send all of the output to a single file, total.out. The input files will be processed in alphabetical order. Note however, that files like MAT1.TXT, MAT2.TXT, MAT10.TXT, and MAT20.TXT are not sorted strictly alpha-numerically. If they were, they would sort into the following order:Q,k‡X‰% €X€ €‚ÿMAT1.TXT, MAT10.TXT, MAT2.TXT, MAT20.TXT.¾š‰Š$ €5€€‚ÿInstead, when CC detects the digits 0 through 9 immediately before the file extension, it sorts somewhat differently. It will put them into this order:Q,X‰gŠ% €X€ €‚ÿMAT1.TXT, MAT2.TXT, MAT10.TXT, MAT20.TXT.D!Š«Š# €B€€‚ÿYou can also say, for example:J"gŠõŠ( €D€‘€€€‚ÿcc -t table.cct -o *.out *.txt6«Š+Ž% €#€€‚‚ÿThis will process all files in the current directory with the .TXT extension, and send the output from each file to the corresponding file with an extension of .out.There is an important distinction between the above examples. In each example there may be many input files, but while in the first example there will be only one output file, in the second example there will be as many output files as input files. This distinction makes a difference to CC. If CC has many input files, but only one output file, it will process the input files as though they were all combined in one large input file. Thus CC remembers the current group, and the contents of stores and switches from the first file when it begins to process the second file. To CC, the input files are concatenated.\7õŠ“Á% €o€€‚‚ÿIn contrast, when CC has one output file for each input file, CC will effectively reset itself between input files. It does NOT remember the current group or the contents of stores and switches from one file to the next. This is the equivalent of running CC once for each input file.There is one significant difference between wildcard filename handling in CC versus DOS behavior. DOS wildcard handling copies characters from an i+Ž“Á €nput filename to the corresponding position in its output filename. For example, for the two input files in123456.txt and in12345.txt, the command "copy in*.txt out*.txt" creates output files with filenames out23456.txt and out2345.txt. So, some of the wildcard characters from the input file will not be included if the wildcard output filename is longer than the wildcard input filename.«{+Ž>Ä0 .€÷€€€€€€‚ÿIn contrast, the CC wildcard feature copies all the characters from the wildcard portion of the input filename to the output filename, starting at the position of the wildcard placement within that output filename. This behavior requires that CC perform some filename checking before actual processing begins. It first checks to see if the wildcard output filename is longer than the wildcard input filename, as is the case with out*.txt and in*.txt. In this case, CC would then check the length of the wildcard portion of each input filename against the maximum allowable length of the wildcard portion for the output filename.žz“ÁÜÆ$ €õ€€‚ÿFor example, given a wildcard output filename specification of out*.txt, the maximum possible length that may be copied to the output wildcard is 5 characters. For a wildcard input filename of in*.txt, the initial check would detect a problem if the input files were, for example, in12345.txt and in123456.txt. The problem is that the wildcard input from in123456.txt would get truncated, resulting in the output filename out12345.txt. This is the same output filename as the one generated from the input filename in12345.txt. In this case, CC would generate an error message and abort before any processing occurs, as shown below:L$>Ä(Ç( €H€‘€€€‚ÿcc -t wc.cct -o out*.txt in*.txt­‡ÜÆÕÇ& €€€‚ÿConsistent Changes 7.5, March 1995, Copyright 1980-1995 SIL Inc.Input filename "IN123456.TXT" too long for available characters inZ5(Ç/È% €j€ €‚ÿoutput filename "OUT*.TXT". No processing occurredX3ÕLJÉ% €g€€‚‚ÿSo, no output files are generated if the wildcard portion of ANY of the input filenames is too long to fit within the wildcard portion of the specified wildcard output filename.If all of the input files have filenames within the maximum possible size, then CC will process them normally, as shown below:L$/ÈÓÉ( €H€‘€€€‚ÿcc -t wc.cct -o out*.txt in*.txtiE‡É<Ê$ €Š€€‚ÿConsistent Changes 7.5, March 1995, Copyright 1980-1995 SIL Inc. öÎÓÉ2Ë( €€ €‚‚ÿProcessing input file IN1.TXT; Writing to output file OUT1.TXT Processing input file IN1234.TXT; Writing to output file OUT1234.TXTProcessing input file IN12345.TXT; Writing to output file OUT12345.TXT?<ÊqË, (€&€V°¨‘€s€ €‚ÿ-a - APPENDß2Ë4Ì$ €?€€‚ÿThe -a option means "append" the output to the output file if it exists. In append mode, all switches, stores, etc. are lost when starting a new input file.FqËzÌ, (€4€V°¨‘€s€ €‚ÿ/d - debug for DOS{W4ÌõÍ$ €¯€€‚ÿThis option gives the number of changes and characters in the table, and gives a display of text before and after each of the changes. It displays the content of the current storage area, any switches on, and the numbers of the current groups. This option should be specified immediately following the name of the change table. For example:S+zÌHÎ( €V€‘€€€‚ÿcc -t mytable.cct/d -o file.out file.inAõÍ•) €1€€ €‚‚‚ÿNOTE: This mode will not display properly unless the screen driver, ANSI.SYS is invoked in your CONFIG.SYS file at boot up.When you use the debug option you will see a listing of all the stores, switches, and groups used in your changes table before the request for the output file. You will see both a number and a name for each. The number has only historical significance.After you have enterHΕ €ed your output and input filenames CC will begin running in the debug mode. CC will stop at the first match and show you the following:8HÎÍ8 >€€Ö€ €‚‚‚€ €‚€ €‚ÿStore name and the contents of the current store before the match.One line showing 35 characters before the match and 35 characters after the match, with the matched characters in reverse video.One line showing the data after the entire right side of the match has been performed.Switches name,name,name... Groups name,name,name... names of all switches set, and all groups active after the match has been performed.Store name and the contents of the current store after the match has been performed.]0•*- (€a€€‚‚‚€€‚ÿA store is shown only if it is being stored into. Other stores not shown may also contain data.In the display of the store contents and the match line, a nl character will be displayed as a character that looks like a backwards F. The symbol for end of file will be a solid block. Other control characters in the data can mess up the screen display.If more characters are in a store than will fit on one line of the screen, an automatic line wrap is performed.A null match can be recognized because no characters are in reverse video in the match line.wKÍ¡, &€—€€‚‚€€‚ÿSwitches and groups are shown only once because they cannot change between the end of one entry and the beginning of the next. Store contents are shown twice because they can change between matches.The debugger does not display what happens within a replacement, but you can see the data string before and after the replacement is done.The debug feature of CC starts up in a single-step mode. Simply press a key to go on to the next step. If you want to run the program continuously, press ESC (the escape key). Pressing any key will stop the debugger and resume single-step mode.C*ä, (€.€V°¨‘€s€ €‚ÿ-i - INPUT LISTð¡ø $ €á€€‚ÿWhen more than one input file is to be processed, a list of file names can be placed in a text file instead of the command line. The -i option is included on the command line followed by the name of the file containing the list. CC will read this file just as it would the file names and commands typed on the command line. This is useful when the files to be input do not have common file names or extensions, OR the files should be processed in a particular order, which is not alphabetical.¥uä 0 .€ë€€€€€€‚ÿIf this option is not specified, CC expects the name of the input file to be on the command line. Note that if for some reason there is no input file, NUL may be specified as the input file. If input is to come from the keyboard, CON should be specified. (When input from the keyboard is complete, type CTRL+Z to signal to CC that this is the end of the input file.)?ø Ü , (€&€V°¨‘€s€ €‚ÿ-o - OUTPUTX' 41 0€O€€€ €€ €‚‚ÿThe output can either be a file name (wildcards may be used for multiple output files) or an output device (such as PRN:). Unless you are compiling a change table this option must either be used on the command line or specified in an input file (-i option). CC will only output to disk files or to physical devices such as con: and prn:. It will not accept a PRT table like the Manuscipter program and send data to P321:.When writing the output to a file, if there is already a file by that name in that directory, the CC program will respond:R-Ü †% €Z€ €‚ÿfilename already exists. Replace it [no]?˜P4*@H ^€¡€€€ €€ €€ €€ €€ €€ €‚ÿIf you wish to keep the existing file with that name (or if you aren't sure), respond no ENTER, and CC will prompt for the name of an output file. If you want to overwrite the existing file, answer y ENTER. (CAUTION: If you accidentally typed the name of your input file here, respond no; othe†*@ €rwise it will be destroyed.)>†h@, (€$€V°¨‘€s€ €‚ÿ-q - QUIET~G*@æA7 <€€€€€€€€€‚‚ÿThe -q option, means "quiet." If you specify -q on the command line, and CC finds that the output file you specified already exists, it will not ask you if it is OK to replace the existing file. It will just go ahead and replace the file. If you do not specify -q, CC will ask if it is OK to replace any existing fileEh@+B, (€2€V°¨‘€s€ €‚ÿ-t - CHANGE TABLEùæAHC$ €ó€€‚ÿThe file name following the -t is the name of the change table. The table may be either compiled or uncompiled. Compiled tables load faster. This Command Line Option must either be on the command line or in a text file specified by the -i option.Q%+B™C, (€J€V°¨‘€s€ €‚ÿ-w - WRITE AND WRSTORE OUTPUT׬HCpD+ $€Y€€‚ã|}‰‚ÿThis option causes the WRITE and WRSTORE output, which normally goes to the screen, to be redirected to a file. A file name must follow the -w option.Advance FeaturesN™C¾D1Ø1ÿÿÿÿÿÿÿÿ ÿÿÿÿ¾DACommands by Logical GroupingsŽpDÄFx ¾€€€‚‚ƒãW ‚ƒãmç+v‰‚ƒãäóƒã úƒãU¹9‰‚ƒãÚ»‡p‰‚ƒã™&b]‰‚ƒãϪõ~‰‚ƒã~^ûꉂƒãsøÿ4.3 Commands by Logical GroupingsCommands Using Switches:Commands Using Store Numbers or Related to Storage AreasArithmetic CommandsOrdinary Number CommandsCommands that can Cause a LoopCommands Using Group NumbersCommands Using Defined ProceduresCommands Involving the Screen or KeyboardNested Block CommandsCommands which occur Only on the Search SideY.¾DG+ &€\€€ƒãiü÷‚ÿCommands which may occur on Either SideHÄFeG, (€8€V°¨‘€s€ €‚ÿCommands Using Switches:l#GÑGI#b€F·´ $€€˜ãlp”ð€‰‚ÿ€ €˜‚ÿÿÿclear(name)clear switch namem$eG>HI#b€H·´ $€€˜ã”õ€‰‚ÿ€€˜‚ÿÿÿif(name)if switch name is setr)ÑG°HI#b€R·´ $€€˜ãì¶3€‰‚ÿ€€˜‚ÿÿÿifn(name)if switch name is not seth>HII#b€>·´ $€€˜ã™V<€‰‚ÿ€€˜‚ÿÿÿset(name)set switch name‰^°H¡I+ &€¼€˜¤€€€‚ÿThe following are similar to if(name) in function, but use store names, not switch names:ˆ?I)JI#b€~ä³ $€€˜ã4[¥ß€‰‚ÿ€0€˜‚ÿÿÿifeq(name) 'string'if contents of area name equal string‰@¡I²JI#b€€ä³ $€€˜ãާ߀‰‚ÿ€0€˜‚ÿÿÿifgt(name) 'string'if contents of area name exceed string¤A)JVKc#–€‚ä³ €€˜ÿ4€€ãäî­ß€‰€€€‚ÿ€8€€€‚ÿÿÿiflt(name) 'string'if store name is less than string;²JæKU#z€vä³ €€ÿ$€€˜ãÌÏ’€‰‚ÿ€4€˜‚ÿÿÿifneq(name) 'string'negative of ifeq(name) 'string'°JVK–Lf#œ€”ä³ €€˜ÿ4€€ãR’€‰€€€‚ÿ"€:€€€€‚ÿÿÿifngt(name) 'string'if store name is not greater than stringŸFæK5MY#‚€Œä³ 4€€ã|c–’€‰€€€‚ÿ"€8€€€€‚ÿÿÿifnlt(name) 'string'if store name is not less than string—;–LÌM\#ˆ€vä³ 4€€ãÞÒ^€‰€€€‚ÿ(€<€€€€€‚ÿÿÿifsubset(name)’string’compares name to stringk>5M7N- *€|€V°¨‘€s€ €‚ÿCommands Using Store Numbers or Related to Storage Areas:‰@ÌMÀNI#b€€äí $€€˜ã¬€‰‚ÿ€.€˜‚ÿÿÿadd(name) 'number'add numeric string to storage area name67N?OI#b€läí $€€˜ãoeœ€‰‚ÿ€€˜‚ÿÿÿany(name)match any element of storage area name†=ÀNÅOI#b€zäí $€€˜ãÙpñ€‰‚ÿ€"€˜‚ÿÿÿappend(name)store in area name, keep previous contents€7?OQ€I#b€näí $€€˜ãáÕò¬€‰‚ÿÅOQ€pD€€˜‚ÿÿÿcont(name)match or compare contents of area name-ÅOÒ€T#x€Zäí €€˜ÿ"€€ãïïž³€‰‚ÿ€€‚ÿÿÿdecrdecrements the named store by one™DQ€kU#z€ˆäí €€ÿ$€€˜ãø¾2€‰‚ÿ€0€˜‚ÿÿÿdiv(name) 'number'divide storage area name by numeric stringcÒ€ÎI#b€4äí $€€˜ãÝ)?Ù€‰‚ÿ€€˜‚ÿÿÿendstoreend storing6kM‚I#b€läí $€€˜ã’¢€‰‚ÿ€€˜‚ÿÿÿfol(name)if following character is in area nameˆ?ÎÕ‚I#b€~äí $€€˜ã4[¥ß€‰‚ÿ€0€˜‚ÿÿÿifeq(name) 'string'if contents of area name equal string‰@M‚^ƒI#b€€äí $€€˜ãާ߀‰‚ÿ€0€˜‚ÿÿÿifgt(name) 'string'if contents of area name exceed stringz1Õ‚؃I#b€bäí $€€˜ãÌÏ’€‰‚ÿ€2€˜‚ÿÿÿifneq(name) 'string'negative of ifeq(name)¦=^ƒ~„i#¢€zäí €€˜ÿ4€€ãÞÒ^€‰€€€‚ÿ(€>€€€€€‚ÿÿÿifsubset(name)’string'compares name to string Œ7؃ …U#z€näí €€ÿ$€€˜ãÏJDဉ‚ÿ€ €˜‚ÿÿÿincr(name)increment number in storage area nameŒ,~„–…`#€Xäí €€˜ÿ:€€ãlÏ€‰€ €€ €‚ÿ€&€‚ÿÿÿlen(name)length of a named store¨S …>†U#z€¦äí €€ÿ$€€˜ã¡€‰‚ÿ€0€˜‚ÿÿÿmod(name) 'number'remainder when value in name is divided by numeric stringF–…͆I#b€Œäí $€€˜ãÛ…€‰‚ÿ€.€˜‚ÿÿÿmul(name) 'number'multiply value in area name by numeric stringq(>†>‡I#b€Päí $€€˜ã€‰‚ÿ€€˜‚ÿÿÿout(name)output storage area name~5͆¼‡I#b€jäí $€€˜ã#Y€‰‚ÿ€€˜‚ÿÿÿouts(name)output area name (storing continues)€7>‡<ˆI#b€näí $€€˜ã(m€‰‚ÿ€€˜‚ÿÿÿprec(name)if preceding character is in area name‰@¼‡ňI#b€€äí $€€˜ãœAQÅ€‰‚ÿ€ €˜‚ÿÿÿstore(name)store in area name (discard previous contents)G<ˆU‰I#b€Žäí $€€˜ãÇ=O€‰‚ÿ€.€˜‚ÿÿÿsub(name) 'number'subtract numeric string from storage area name‹Bňà‰I#b€„äí $€€˜ã,ã/€‰‚ÿ€€˜‚ÿÿÿwd(name)if characters before and after in storage area name6U‰_ŠI#b€läí $€€˜ã Úy€‰‚ÿ€$€˜‚ÿÿÿwrstore(name)output storage area name to screenDà‰£Š, (€0€V°¨‘€s€ €‚ÿArithmetic Commands:‰@_Š,‹I#b€€äí $€€˜ã¬€‰‚ÿ€.€˜‚ÿÿÿadd(name) 'number'add numeric string to storage area nameŒC£Š¸‹I#b€†äí $€€˜ãø¾2€‰‚ÿ€.€˜‚ÿÿÿdiv(name) 'number'divide storage area name by numeric string6,‹7ŒI#b€läí $€€˜ãÏJDဉ‚ÿ€€˜‚ÿÿÿincr(name)increment number in storage area nameŒ,¸‹ÃŒ`#€Xäí €€˜ÿ:€€ãlÏ€‰€ €€ €‚ÿ€&€‚ÿÿÿlen(name)length of a named store¨S7ŒkU#z€¦äí €€ÿ$€€˜ã¡€‰‚ÿ€0€˜‚ÿÿÿmod(name) 'number'remainder when value in name is divided by numeric stringFÃŒúI#b€Œäí $€€˜ãÛ…€‰‚ÿ€.€˜‚ÿÿÿmul(name) 'number'multiply value in area name by numeric stringGkŠŽI#b€Žäí $€€˜ãÇ=O€‰‚ÿ€.€˜‚ÿÿÿsub(name) 'number'subtract numeric string from storage area nameIúÓŽ, (€:€V°¨‘€s€ €‚ÿOrdinary Number Commands:‹BŠŽ^I#b€„Éí $€€˜ã&»G¡€‰‚ÿ€"€˜‚ÿÿÿback(number)put last number of chars output back into inputŠAÓŽ ÀI#b€‚Éí $€€˜ãbŽ«€‰‚ÿ€ €˜‚ÿÿÿfwd(number)forward number of characters (does not process)^ ÀpD…<^‘ÀI#b€xÉí $€€˜ãd|ª€‰‚ÿ€"€˜‚ÿÿÿomit(number)omit next number of characters from inputO# ÀàÀ, (€F€V°¨‘€s€ €‚ÿCommands that can Cause a Loop:£Z‘ÀƒÁI#b€´Éí $€€˜ã&»G¡€‰‚ÿ€"€˜‚ÿÿÿback(number)if not sending output to something different or using a different groupq(àÀôÁI#b€PÉí $€€˜ãBÆZÍ€‰‚ÿ€€˜‚ÿÿÿrepeatif no way to stop repeating8ƒÁuÂI#b€pÉí $€€˜ã"Œ€‰‚ÿ€(€˜‚ÿÿÿ'' (null match)if not used with fwd, omit, or usey0ôÁîÂI#b€`Éí $€€˜ã²–¾¢€‰‚ÿ€€˜‚ÿÿÿendfileif matched and not output on right8uÂoÃI#b€pÉí $€€˜ãî-{o€‰‚ÿ€"€˜‚ÿÿÿdefine(name)defines a set of commands called nameM!î¼Ã, (€B€V°¨‘€s€ €‚ÿCommands Using Group Numbers:|3oÃ8ÄI#b€fÉ¢ $€€˜ãwAÀ€‰‚ÿ€€˜‚ÿÿÿexcl(name)exclude (make inactive) group namex/¼Ã°ÄI#b€^É¢ $€€˜ãf¸j €‰‚ÿ€ €˜‚ÿÿÿgroup(name)specifies a group called namew.8Ä'ÅI#b€\É¢ $€€˜ãyDဉ‚ÿ€€˜‚ÿÿÿincl(name)include (activate) group namen%°Ä•ÅI#b€JÉ¢ $€€˜ã®;µ€‰‚ÿ€€˜‚ÿÿÿuse(name)use group called nameR&'ÅçÅ, (€L€V°¨‘€s€ €‚ÿCommands Using Defined Procedures:…0•ÅlÆU#z€`Éí $€€˜ã\OÌ€‰‚ÿ€€˜ÿ€€‚ÿÿÿbinaryhandle input data as a binary fileŽ9çÅúÆU#z€rÉí €€ÿ$€€˜ãî-{o€‰‚ÿ€$€˜‚ÿÿÿdefine(name)defines a set of commands called name{2lÆuÇI#b€dÉí $€€˜ã¶%€‰‚ÿ€€˜‚ÿÿÿdo(name)execute set of commands called name LúÆÈT#x€˜Éí €€˜ÿ"€€ãÈpi€‰‚ÿ€"€‚ÿÿÿdoublebyte treat qualifying pairs of bytes as one doublebyte element‚-uÇ—ÈU#z€ZÉí €€ÿ$€€˜ã˜f‡€‰‚ÿ€€˜‚ÿÿÿcaselessprocess data in caseless modew.ÈÉI#b€\Éí $€€˜ã¾-X €‰‚ÿ€€˜‚ÿÿÿnextdo next set of replacement commandsZ.—ÈhÉ, (€\€V°¨‘€s€ €‚ÿCommands Involving the Screen or Keyboard:l#ÉÔÉI#b€F·´ $€€˜ãåH.€‰‚ÿ€€˜‚ÿÿÿreadread input from keyboard6hÉSÊI#b€l·´ $€€˜ãʸµ•€‰‚ÿ€&€˜‚ÿÿÿwrite 'string'output following string to screen6ÔÉÒÊI#b€l·´ $€€˜ã Úy€‰‚ÿ€$€˜‚ÿÿÿwrstore(name)output storage area name to screenFSÊË, (€4€V°¨‘€s€ €‚ÿNested Block Commands:n%ÒʆËI#b€J·´ $€€˜ãüÒç:€‰‚ÿ€€˜‚ÿÿÿbeginbeginning of nested blockXËÞËI#b€·´ $€€˜ãÌQâ½€‰‚ÿ€€˜‚ÿÿÿelseelsef†ËDÌI#b€:·´ $€€˜ã†xl€‰‚ÿ€€˜‚ÿÿÿendend of nested blockw.ÞË»ÌI#b€\·´ $€€˜ã變󀉂ÿ€€˜‚ÿÿÿendifend of conditional set of commandsm$DÌ(ÍI#b€H·´ $€€˜ã”õ€‰‚ÿ€€˜‚ÿÿÿif(name)if switch name is setˆ?»Ì°ÍI#b€~·´ $€€˜ã4[¥ß€‰‚ÿ€0€˜‚ÿÿÿifeq(name) 'string'if contents of area name equal string‰@(Í9ÎI#b€€·´ $€€˜ãާ߀‰‚ÿ€0€˜‚ÿÿÿifgt(name) 'string'if contents of area name exceed stringr)°Í«ÎI#b€R·´ $€€˜ãì¶3€‰‚ÿ€€˜‚ÿÿÿifn(name)if switch name is not setƒ:9Î.ÏI#b€t·´ $€€˜ãÌÏ’€‰‚ÿ€2€˜‚ÿÿÿifneq(name) 'string'negative of ifeq(name) 'string'p'«ÎžÏI#b€N·´ $€€˜ãBÆZÍ€‰‚ÿ€€˜‚ÿÿÿrepeatrepeat from previous begin]1.Ï , (€b€V°¨‘€s€ €‚ÿCommands which occur Only on the Search Side:žÏ pD6žÏ‹I#b€l·´ $€€˜ãoeœ€‰‚ÿ€€˜‚ÿÿÿany(name)match any element of storage area name8  I#b€p·´ $€€˜ãî-{o€‰‚ÿ€"€˜‚ÿÿÿdefine(name)defines a set of commands called name6‹‹I#b€l·´ $€€˜ã’¢€‰‚ÿ€€˜‚ÿÿÿfol(name)if following character is in area name€7  I#b€n·´ $€€˜ã(m€‰‚ÿ€€˜‚ÿÿÿprec(name)if preceding character is in area name~5‹‰I#b€j·´ $€€˜ã,ã/€‰‚ÿ€€˜‚ÿÿÿwd(name)if chars before and after in area nameW+ à, (€V€V°¨‘€s€ €‚ÿCommands which may occur on Either Sideb?‰B# €~€€‚ÿNote that the meaning is often different on different sides:w.à¹I#b€\·´ $€€˜ãüÒç:€‰‚ÿ€€˜‚ÿÿÿbeginbeginning of table or nested block€7B9I#b€n·´ $€€˜ãáÕò¬€‰‚ÿ€€˜‚ÿÿÿcont(name)match or compare contents of area namew.¹°I#b€\·´ $€€˜ã²–¾¢€‰‚ÿ€€˜‚ÿÿÿendfilematch or output end of file charj!9I#b€B·´ $€€˜ãÉ1%€‰‚ÿ€€˜‚ÿÿÿnlmatch or output new linen%°ˆI#b€J·´ $€€˜ã"Œ€‰‚ÿ€€˜‚ÿÿÿ''null match; null replacements0ûC#V€`·´ €€˜€‚ÿ€ €˜‚ÿÿÿtabprovides a tab like nl provides new lineFˆA0 0€,€€‚ãÔ0B€ ‰€‚ÿASCII Codes 90Oû1Dÿÿÿÿÿÿÿÿÿÿÿÿ…Consistent Changes DescriptionõªA…K d€U€€‚‚ãâ¶M¯‰‚ãf¬[»‰‚ã$Á‰‚ãÝŸÛh‰‚ã;‰<…‰€‚ÿ2. Consistent Changes Description2.1 Form of Changes2.2 How Changes are Processed2.3 Order of Changes2.4 Command Descriptions 2.5 Command Line Options9¾1hÿÿÿÿÿÿÿÿÿÿÿÿ¾ùLContents»o…yL h€Þ€ã^=¸€ ‰€‚€ ‚€ãŠUô%€ ‰€âŠUô%€ ‰€‚ÿManualCommands click the for full command description or the word for short definition‰N¾ ;#F‚œ … # … $ … # … # … "€€ã¬€ ‰‚ÿ(€ €â9~€ ‰€‚ÿ(€€ãø¾2€ ‰€‚ÿ(€,€âÍ”€ ‰€‚ÿ(€>€ã”õ€ ‰€‚ÿ(€L€âI€ ‰€‚ÿ(€\€ãÛ…€ ‰€‚ÿ(€j€âÈ×€ ‰€‚ÿ(€|€ãü$k€ ‰€‚ÿ (€Š€âñ€ ‰€‚ÿÿÿadddivifmultab‹Py ;#F‚  … # … $ … # … # … "€€ãoeœ€ ‰‚ÿ(€ €âü€ ‰€‚ÿ(€€ã¶%€ ‰€‚ÿ(€,€â{€ ‰€‚ÿ(€<€ã4[¥ß€ ‰€‚ÿ(€J€âéö€ ‰€‚ÿ(€^€ã¾-X € ‰€‚ÿ(€l€âÃ%€ ‰€‚ÿ(€€€ã®;µ€ ‰€‚ÿ (€Ž€â3€ ‰€‚ÿÿÿanydoifeqnextuse“X  ;#F‚° … # … $ … # … # … "€€ãÙpñ€ ‰‚ÿ(€ €â¶¬¢›€ ‰€‚ÿ(€$€ãÈpi€ ‰€‚ÿ(€2€â…¼Ø€ ‰€‚ÿ(€R€ãާ߀ ‰€‚ÿ(€`€âB÷€ ‰€‚ÿ(€t€ãÉ1%€ ‰€‚ÿ(€‚€â&€ ‰€‚ÿ(€’€ã,ã/€ ‰€‚ÿ (€ €â¡€ ‰€‚ÿÿÿappenddoublebyteifgtnlwdR ­;#F‚¤ … # … $ … # … # … "€€ã&»G¡€ ‰‚ÿ(€ €âkT€ ‰€‚ÿ(€ €ã†"A€ ‰€‚ÿ(€.€âË–€ ‰€‚ÿ(€@€ãäî­ß€ ‰€‚ÿ(€N€âø€ ‰€‚ÿ(€b€ã"Œ€ ‰€‚ÿ(€p€â<€ ‰€‚ÿ(€€€ãʸµ•€ ‰€‚ÿ (€Ž€â/{€ ‰€‚ÿÿÿbackdupiflt''write’W K@;#F‚® … # … $ … # … # … "€€ãüÒç:€ ‰‚ÿ(€ €âñ$Å€ ‰€‚ÿ(€"€ãÌQâ½€ ‰€‚ÿ(€0€âAJ€ ‰€‚ÿ(€D€ãì¶3€ ‰€‚ÿ(€R€âa¸€ ‰€‚ÿ(€d€ãd|ª€ ‰€‚ÿ(€r€â™q&€ ‰€‚ÿ(€†€ã Úy€ ‰€‚ÿ (€”€âf¯¿—€ ‰€‚ÿÿÿbegin­K@…elseifnomitwrstoreR­ØA;#F‚¤ … # … $ … # … # … "€€ã\OÌ€ ‰‚ÿ(€ €âQ$ö¢€ ‰€‚ÿ(€$€ã†xl€ ‰€‚ÿ(€2€âËœ€ ‰€‚ÿ(€D€ãÌÏ’€ ‰€‚ÿ(€R€âA¸3€ ‰€‚ÿ(€h€ã€ ‰€‚ÿ(€v€âBæ€ ‰€‚ÿ(€ˆ€ã;#€ ‰€‚ÿ (€–€â(€ ‰€‚ÿÿÿbinaryendifneqoutxŽSK@fC;#F‚¦ … # … $ … # … # … "€€ãŽ‹€ ‰‚ÿ(€ €â€ ‰€‚ÿ(€€ã²–¾¢€ ‰€‚ÿ(€(€âW }ó€ ‰€‚ÿ(€B€ãR’€ ‰€‚ÿ(€P€âš¸3€ ‰€‚ÿ(€f€ã#Y€ ‰€‚ÿ(€t€â9­&€ ‰€‚ÿ(€ˆ€ãÇ’€ ‰€‚ÿ (€–€âC€ ‰€‚ÿÿÿcendfileifngtouts/d—\ØAýD;#F‚¸ … # … $ … # … # … "€€ã˜f‡€ ‰‚ÿ(€ €âíɳ€ ‰€‚ÿ(€(€ãï«€ó€ ‰€‚ÿ(€6€â|zl€ ‰€‚ÿ(€L€ã|c–’€ ‰€‚ÿ(€Z€âq¹3€ ‰€‚ÿ(€p€ã(m€ ‰€‚ÿ(€~€âŒË'€ ‰€‚ÿ(€’€ãR¾y € ‰€‚ÿ (€ €â ®x€‰€‚ÿÿÿcaselessendififnltprec(name)œafC™F;#F‚ … # … $ … # … # … "€€ãlp”ð€ ‰‚ÿ(€ €âá½€ ‰€‚ÿ(€"€ãÝ)?Ù€ ‰€‚ÿ(€0€âÚ ¸è€ ‰€‚ÿ(€L€ãÞÒ^€ ‰€‚ÿ(€Z€âãÖÒÌ€ ‰€‚ÿ(€v€ãåH.€ ‰€‚ÿ(€„€â"Ú)€ ‰€‚ÿ(€˜€ãÜ®c€ ‰€‚ÿ (€¦€âo(/€ ‰€‚ÿÿÿclearendstoreifsubsetread'number'•ZýD.H;#F‚´ … # … $ … # … # … "€€ãáÕò¬€ ‰‚ÿ(€ €âþñ€ ‰€‚ÿ(€ €ãwAÀ€ ‰€‚ÿ(€.€âDž€ ‰€‚ÿ(€B€ãyDဠ‰€‚ÿ(€P€âV0€ ‰€‚ÿ(€d€ãBÆZÍ€ ‰€‚ÿ(€r€âg¼Z.€ ‰€‚ÿ(€Š€ã‰_Ç€ ‰€‚ÿ (€˜€â“:v € ‰€‚ÿÿÿcontexclinclrepeat(number)ŽS™F¼I;#F‚¦ … # … $ … # … # … "€€ãq[-€ ‰‚ÿ(€ €âÀ$€ ‰€‚ÿ(€€ã’¢€ ‰€‚ÿ(€(€â7¤€ ‰€‚ÿ(€:€ãÏJDဠ‰€‚ÿ(€H€â\0€ ‰€‚ÿ(€\€ã™V<€ ‰€‚ÿ(€j€âv€ ‰€‚ÿ(€|€ãØ7%=€ ‰€‚ÿ (€Š€â­ô.:€ ‰€‚ÿÿÿdfolincrset'string'ŠU.HFK5#:‚ª … # … $ … # … # … "€€ãïïž³€ ‰‚ÿ(€ €â|Þ€ ‰€‚ÿ(€ €ãbŽ«€ ‰€‚ÿ(€.€â‡¥€ ‰€‚ÿ(€@€ãlÏ€ ‰€‚ÿ(€N€âáÍ€ ‰€‚ÿ(€`€ãœAQÅ€ ‰€‚ÿ(€n€â‘hN€ ‰€‚ÿ€„€€ €‚ÿ (€Ž€ãºQÖê€ ‰€‚ÿÿÿdecrfwdlenstoreGlossaryX¼IÓL5#:‚° … # … $ … # … # … "€€ãî-{o€ ‰‚ÿ(€ €âsU¢³€ ‰€‚ÿ(€$€ãf¸j € ‰€‚ÿ(€2€â«ûÙ€ ‰€‚ÿ(€H€ã¡€ ‰€‚ÿ(€V€â¾Ö€ ‰€‚ÿ(€h€ãÇ=O€ ‰€‚ÿ(€v€â€ ‰€‚ÿ€ˆ€€ €‚ÿ (€’€ãÿ-‡€ ‰€‚ÿÿÿdefinegroupmodsubError msg&FKùL# €€€‚ÿIÓLBM1Ì ÿÿÿÿÿÿÿÿÿÿÿÿBM)…Creating a Changes TableŽdùLÐO* "€É€€‚€‚‚‚ÿ1.2 Creating a Changes TableIn order to use the Consistent Changes program, you must have a text file that describes the changes you want made. This file is called a "changes table." You may use an existing changes table, modify an existing table or create your own table. A table can be executed by running the Consistent Changes program as described in section 2.2.A changes table can be created or modified using almost any word processor. Be sure that you save your document as an text file (text only with line breaks in MS-Word). The filename extension ".CCT" is commonly used when naming CC tables. ÝBMé0 .€»€€€€€€‚ÿÐOéùLThe simplest changes table instruction will have a searched-for item (search string) in a pair of quotes (double or single). This will be followed on the same line by a space, a right wedge(>), and another space. Next will be the desired replacement (replacement string), again in quotes. The right wedge is an integral part of the CC command and is not enclosed within quote marks. The right wedge separates the search side of the table entry from the replacement side.¸“ÐO¡ƒ% €'€€‚‚ÿFor example, suppose you wanted to change all occurrences of "house" to "home." In a small text file, you would probably make the changes yourself in your word processor. However, making the changes to a large file, or a whole series of files, could take a long time, and typing errors might occur in the process.The following CC table could be used to accomplish this change quickly and accurately:ê¢é‹„H ^€E€‘€€€€€!€"€€!€ €€‚ÿ"house" > "home" Input: Our house is a very fine house. We like our house. Output: Our home is a very fine home. We like our home.žn¡ƒ)…0 0€Ü€€‚ãQÝ€ ‰€‚ÿSee section 2.1 for a more detailed description of the format of a changes table.Using a Changes Table< ‹„e…1Yÿÿÿÿÿÿÿÿÿÿÿÿe…eÂDouble_byte?)…¤‡8 >€€€‚‚ã`O‰ãâþ‰ãÎ`*N‰‚ÿ3.6 Doublebyte Based on the arguments that are the criteria of the new doublebyte command CC will internally treat qualifying pairs of bytes as one doublebyte element. The syntax of the command is doublebyte(dn1,dn2) where n1 and n2 are decimal numbers, or doublebyte(xn1,xn2) where n1 and n2 are a hexadecimal number, or doublebyte(n1,n2) where n1 and n2 are octal numbers. Note that octal is the default, to be consistent with other commands. The doublebyte command must be in the begin section. ¢{e…F' €÷ €€‚‚‚‚ÿBoth n1 and n2 must be at least 1 if specified, but will default to zero if not specified. E.g. "doublebyte" (no arguments) makes every pair of bytes a doublebyte, and "doublebyte(d252)" makes every pair doublebyte where the first one is >= 252 (regardless of the value of the next one).The doublebyte command must be in the begin section. There is no corresponding "singlebyte" command, that is the default. You cannot toggle between the two modes. Things are treated internally as short signed integer (the high bit of n1 is of course preserved though). This will handle doublebytes as part of the input stream and/or as quoted strings in the cc tables. (See note below though on limitation of using hex notation for doublebytes). Upon output doublebytes are converted back to single bytes as Dan details below. If at output time a doublebyte element no longer translates to a valid doublebyte pair according to the doublebyte criteria (due to operations on it) then it is still converted back, and a warning message is issued. E.g. if you have doublebyte(d250,d20) and if you have a pair of characters that are exactly 250 and 20 that are made into a doublebyte pair, and then you operate on that integer and decrement it by one before outputting it, then cc will output a byte of 250 followed by a byte of 19, with a warning message since it no longer meets the doublebyte criteria.eÂ% €Ý €€‚‚ÿNote that for replacements to be treated as doublebyte elements they must be specified as hex doublebytes (this was only implemented in hex to prevent unintentional "doublebyting"). For example, note that character 'a' is x'61' and 'b' is x'62'. The following all still operate essentially as single bytes, as before (they look for one element containing 'a' followed by another element containing 'b'):" 'ab' > 'cd'" and " x61 x62 > x63 x64 " and 'a' 'b' > 'c' 'd' ". Those all operate as before. To do doublebyte matching you need to specify xnnnn where nnnn is the two byte hex value. In order to change a doublebyte value of 'a' and 'b' stored in FeÂ)…the same byte to 'c' and 'd' stored in the same byte that must be specified as " x6162 > x6364 " (and of course these must meet the specified doublebyte criteria).This makes it obvious when we are talking about doublebyte values in our change tables since they must be in the form xnnnn. There are no warnings if doublebyte is in effect and the user specifies " 'a' > 'c' ", it will just only match the case where an element is not doublebyted and just contains 'a'. In doublebyte mode if you have a doublebyted element there is no way to change only half of it (only one byte of the doublebyte).?F¤Â1«Lÿÿÿÿÿÿÿÿ¤ÂXÃÝÎ Error Messages´aeÂXÃS v€Â€€ €‚€ƒãÿ-‡‰ã/Ò#‰ãˆÄ(‰ã¢šù‰ã:©2‰ã ‰‚€‚ÿError MessagesA to D, D to I, I to M, M to S, S to U, U through W€¤ÂÇB R€€€‚€‚€€‚€€€ €€ €‚ÿ4.1 Error MessagesThis section lists error messages that result from some problem in your table. It does not list error messages that may result from misspelling input file names or table names when starting CC from the DOS prompt.CC error messages are sent to stdout, and may be redirected to a file. All error messages from the CC program are preceded by?CC-E, ?CC-F-, ?CC-W-, or CC-Warning-. If an error is found in the table, the line containing the error may be displayed, with an arrow pointing at the place at which CC realized the error. Then the error message will be given. Error messages will specify particular stores, groups, switches, and defines by number rather than name. You may have called a store junk, but any error associated with it will display a number instead. You can find out which store is referenced by what number by running CC with the debug option.. XÃHÈ% €€€‚‚ÿSome errors can be caused by others. For example, an error in a group name will cause all references to that group to also appear to the CC program to be errors.If there are errors in your table, the following will be printed after the table has been processed:oIÇ·È& €’€ €‚ÿThere were errors in the changes table. Correct the errors and rerun.iFHÈ É# €Œ€€‚ÿThe rest of this section is a list of the errors that CC generates:]-·È}É0 0€Z€^°¨°‘€s€ €€‚ÿArithmetic: divide by zero in group nameá« É^Ê6 :€W€€€€€€€€‚ÿThe div(name) 'number' command has been used and the 'number' had a value of 0. To resolve this error, you should change 'number' to be something other than zero.Y)}É·Ê0 0€R€^°¨°‘€s€ €€‚ÿArithmetic: non-number in group nameå—^ÊœÌN j€/€€€€€€€€€€€€€ €€ €‚ÿOne of the arithmetic commands (add(name) 'number', div(name) 'number', mod(name) 'number', mul(name) 'number', or sub(name) 'number') has been used, and the contents of the specified storage area does not have a number in it. To resolve this error, you should be sure that the storage area contains only the characters 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9, preceded by an optional - or + sign.xC·ÊÍ5 :€†€^°¨°‘€s‚ü€ ƒƒ€€‚ÿArithmetic: number greater than 2,000,000,000 in group name…7œÌ™ÎN j€o€€€€€€€€€€€€€ €€ €‚ÿOne of the arithmetic commands (add(name) 'number', div(name) 'number', mod(name) 'number', mul(name) 'number', or sub(name) 'number') has been used, and either the contents of the specified storage area or the 'number' is outside the range -1,999,999,999 to +1,999,999,999 (do not use commas).W'ÍðÎ0 0€N€^°¨°‘€s€ €€‚ÿArithmetic: overflow in group nameY ™ÎU N j€€€€€€€€€€€€€€ €€ €‚ÿOne of the arithmetic commands (add(name) 'number', div(name) 'number', mod(name) 'number', mul(name) 'number', or sub(name) 'number') has been used, and has resulted in a number outsðÎU eÂide the range -1,999,999,999 to +1,999,999,999 (do not use commas).GðÎœ - *€4€^°¨°‘€s€ €‚ÿBacked too far storingºU V * "€!€€€€‚ÿThe number of characters backed into the input with the back(number) command exceeded the number of characters in the current storage area.Bœ ˜ - *€*€^°¨°‘€s€ €‚ÿBacked up too farsJV  ) "€”€€€€‚ÿMore than 999 characters were backed using the back(number) command. ;˜ F - *€€^°¨°‘€s€ €‚ÿBad numberÞ¢  $ < F€E€€€€€€€€€€‚ÿThe number, is not a valid number or is missing altogether. Commands which expect a numerical argument are back(number), fwd(number), and omit(number).Q$F u - *€H€^°¨°‘€s€ €‚ÿBegin command not first in tableŒi$  # €Ò€€‚ÿA begin command was found on the search side of an entry, but it was not the first entry in the table.V)u W - *€R€^°¨°‘€s€ €‚ÿCaseless command not in begin section–s í # €æ€€‚ÿThis error occurs when the caseless command is used in your table other than in the begin section of your table._2W L - *€d€^°¨°‘€s€ €‚ÿDecimal number too big, must be less than 256.‡dí Ó # €È€€‚ÿSince decimal numbers are used for the 256 ASCII codes, they should be within the range 0 to 255.S#L & 0 0€F€^°¨°‘€s€ €€‚ÿDefaulting to empty group name°ŒÓ Ö $ €€€‚ÿThis error occurs when there are no change entries! To resolve this error, add either a change entry or an endfile section to your table.I&  - *€8€^°¨°‘€s€ €‚ÿDo nested deeper than 10Ë•Ö ê 6 :€+€€€€€€€€‚ÿNesting of defined sets of commands is allowed, that is, define(name) commands are allowed to call other define(name) commands using a do(name), and those can call yet other such commands. However, there is a limit to how deep such nesting can go. That limit is 10. Check that there is not a loop, or that a define command does not call itself. Both these error conditions are illustrated below: ¼’ ¦ * "€%€ €‚ÿLoop: define(1) ... do(2) ... define(2) ... do(3) ... define(3) ... do(1) ... Calling Itself: define(1) ... do(1) ..`'ê  9 B€N€^°¨°‘€s€ €€€€ €‚ÿDo(name) used but never definedµ…¦ » 0 .€ €€€€€€‚ÿThis error results when a do(name) statement is encountered but there is no corresponding define(name) statement in the table.ŒM G ? N€š€^°¨°‘€s‚W€ ƒ€€€€ ƒ€‚ÿFATAL ERROR! excl command in group(name) removes all active groupsç·» . 0 .€o€€€€€€‚ÿAn excl(name) should only be used if you have previously made more than one group active with multiple use(name) commands, and only then if you leave at least one group active.W*G … - *€T€^°¨°‘€s€ €‚ÿFont section of table is ignored in CCP&. Õ * "€M€€€€‚ÿYou may get this error if you try to run a table that has no changes listed in it! More commonly, it is because the table you are trying to run contains a font(name) command, which is no longer a valid CC command. The font section needs to be removed before the table will run as expected.=…  - *€ €^°¨°‘€s€ €‚ÿFwd too many¯…Õ Á * "€ €€€€‚ÿA maximum of 300 characters may be forwarded with the fwd(number) command, even if they were only moved one character at a time.T!  3 6€B€^°¨°‘€s€ €€ €‚ÿGroup name multiply defined!ÞÁ BA C T€½€€€€€€€€‚€€€ €‚ÿThis error means that two or more identical group(name) commands exist in your table in more than one place. If you have several group(name) commands in your table BA eÂ, you must have a different number or name in place of name in each one.Keep in mind that entries which appear before the first group(name) command are considered to form a default group(1). If a subsequent explicit group(1) appears in the table, CC will abort with a Group 1 multiply defined message.[( A 3 6€P€^°¨°‘€s€ €€ €‚ÿGroup name excluded but not activeöºBA “B < F€u€€€€€€€€€€‚ÿAn excl(name) command was used to exclude a group that was not active. The command excl(name) can only be used on groups that have been activated with use(name) or incl(name).U(A èB - *€P€^°¨°‘€s€ €‚ÿGroup command not in front of changeÍ“B ÷C B R€›€€€€€ €€ €€ €€ €‚ÿA group(name) command has been encountered, but the next line does not contain a wedge. Comments may follow a group command, but check that they are preceded by ENTER c SPACE or SPACE c SPACE.^1èB UD - *€b€^°¨°‘€s€ €‚ÿIllegal command following arithmetic operatorÐ÷C gE B R€¡€€€€€€€€€€€€‚ÿA command that performs an arithmetic operation (such as add(name) 'number', div(name) 'number', mod(name) 'number', mul(name) 'number', or sub(name) 'number') has been used without the 'number'.^1UD ÅE - *€b€^°¨°‘€s€ €‚ÿIllegal command following comparison operatorݧgE ¢F 6 :€O€€€€€€€€‚ÿA command that performs a comparison operation (such as ifeq(name) 'string', ifgt(name) 'string', or ifneq(name) 'string') has been used without the 'string'.?ÅE áF - *€$€^°¨°‘€s€ €‚ÿIllegal number8¢F H $ €)€€‚ÿAn octal ASCII code was specified, but contains some character other than 0, 1, 2, 3, 4, 5, 6, or 7. In other words, some string of characters has been encountered which is not enclosed in quotation marks that is neither a recognized command nor a valid octal ASCII number.DáF ]H - *€.€^°¨°‘€s€ €‚ÿIllegal parenthesis>H ›I $ €5€€‚ÿA parenthesis was encountered where no parenthesis is legal. This could be an extra parenthesis, such as set(1)) or ifeq(1)(3), or a parenthesis for a command which does not take an argument in parentheses. The following are commands which do not take an argument in parentheses:Ê ]H eJ * "€A€ €‚ÿbegin end nl c endif '' caseless endfile read dup endstore repeat else next writeO"›I ´J - *€D€^°¨°‘€s€ €‚ÿIllegal use of command after >pMeJ $K # €š€€‚ÿThe following commands cannot be used on the replacement side of an entry:}W´J ¡K & €®€ €‚ÿany(name) define(name) fol(name) group(name) prec(name) wd(nameP#$K ñK - *€F€^°¨°‘€s€ €‚ÿIllegal use of command before >kH¡K \L # €€€‚ÿOnly the following commands are legal on the search side of an entry:®†ñK M ( € € €‚ÿany(name) cont(name) endfile nl prec(name) begin define(name) fol(name) '' wd(name)P\L ‰M / .€ €€€€€€‚ÿThe group(name) command must not be followed by a wedge on the same line.F M ÏM - *€2€^°¨°‘€s€ €‚ÿInvalid decimal digit뻉M ºN 0 .€w€€€€€€‚ÿA decimal ASCII code was specified, but contains some character other than 0, 1, 2, 3, 4, 5, 6, 7, 8, or 9. Decimal codes are specified by preceding them with the character d or D.JÏM O - *€:€^°¨°‘€s€ €‚ÿInvalid hexadecimal digitÕºN € 0 .€«€€€€€€‚ÿA hexadecimal ASCII code was specified, but contains some character other than 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, or F. Hexadecimal codes are specified by preceding them with the character x O € eÂor X.N!O c€ - *€B€^°¨°‘€s€ €‚ÿInvalid number for arithmetic±c€ ‚ N j€Ç€€€€€€€€€€€€€ €€ €‚ÿOne of the arithmetic commands (add(name) 'number', div(name) 'number', mod(name) 'number', mul(name) 'number', or sub(name) 'number') has been used, and 'number' is not a number. To resolve this error, you should be sure that the 'number' contains only the characters 0, 1, 2, 3, 4, 5, 6, 7, 8, or 9, preceded by an optional - or + sign.Kc€ _‚ - *€<€^°¨°‘€s€ €‚ÿLine too long, end cut offR/‚ ±‚ # €^€€‚ÿA line in the table exceeded 125 characters.D_‚ õ‚ - *€.€^°¨°‘€s€ €‚ÿMissing parenthesis™p±‚ Žƒ ) "€à€€€€‚ÿThe opening parenthesis is missing from a command which expects an argument in parentheses, such as (name).T'õ‚ ⃠- *€N€^°¨°‘€s€ €‚ÿMore than 10 prec( )s in successiong>Žƒ I„ ) "€|€€€€‚ÿNo more than 10 prec(name) commands can be used together.E⃠Ž„ - *€0€^°¨°‘€s€ €‚ÿNo close parenthesisº–I„ H… $ €-€€‚ÿEither the closing parenthesis is missing from a command which expects an argument in parentheses or there is an invalid character in the argument.GŽ„ … - *€4€^°¨°‘€s€ €‚ÿNo wedge on begin linepMH… ÿ… # €š€€‚ÿThere is a begin command that is not followed by a wedge on the same line.E… D† - *€0€^°¨°‘€s€ €‚ÿNo definition for do’cÿ… Ö† / .€Æ€€€€€€‚ÿA do(name) command has been used, but the corresponding define(name) command was never made.FD† ‡ - *€2€^°¨°‘€s€ €‚ÿNumber cannot be zerovSÖ† ’‡ # €¦€€‚ÿZero was used as the numerical argument of a command. Zero is not a legal value.?‡ ч - *€$€^°¨°‘€s€ €‚ÿNumber too big—[’‡ h‰ < F€·€€€€€€€€€€‚ÿA number given as the numerical argument for either a back(number), fwd(number), or omit(number) command exceeds 127. The maximum value allowed for number is 127. A maximum of 999 characters may be backed, and 300 forwarded or omitted, by using more than one command in a row. (back(120) back(30) causes 150 characters to be backed up.)`3ч ȉ - *€f€^°¨°‘€s€ €‚ÿNumber too big, must be less than 2,000,000,000…7h‰ M‹ N j€o€€€€€€€€€€€€€ €€ €‚ÿOne of the arithmetic commands (add(name) 'number', div(name) 'number', mod(name) 'number', mul(name) 'number', or sub(name) 'number') has been used, and either the contents of the specified storage area or the 'number' is outside the range -1,999,999,999 to +1,999,999,999 (do not use commas).Aȉ Ž‹ - *€(€^°¨°‘€s€ €‚ÿNumber too largeN+M‹ Ü‹ # €V€€‚ÿAn octal ASCII number exceeds 377 octal.>Ž‹ Œ - *€"€^°¨°‘€s€ €‚ÿOmit too manyT1Ü‹ nŒ # €b€€‚ÿMore than 300 omit characters were done in CC.S#Œ ÁŒ 0 0€F€^°¨°‘€s€ €€‚ÿStorage overflow of store name‹gnŒ LŽ $ €Ï€€‚ÿSo many characters have been stored that the storage area is overflowing. When CC is running, there is room in memory for approximately 64,000 characters to be stored. This room is shared between all the storage areas. It is also used by other things in your table. This error occurs when storage is being done but there is no room for any more characters.^+ÁŒ ªŽ 3 6€V€^°¨°‘€s€ €€ €‚ÿStore name used but never stored into¦}LŽ P ) "€ú€€€€‚ÿOne of the following commands has been used on a storage area that has not first been opened with a store(name) command:tNªŽ Ä & €œ€ €‚ÿifeq(name) ifneq(name) outs(name) ifgt(name) out(name) wrstore(name)d1P 4À 3 6€b€^°¨°‘€s€ €€ €‚ÿSwitch Ä 4À eÂname tested but never set or clearedä¨Ä Á < F€Q€€€€€€€€€€‚ÿEither an if(name) or ifn(name) command has been used on a switch that has not first been set with a set(name) command or cleared with a clear(name) command.@4À XÁ - *€&€^°¨°‘€s€ €‚ÿTable too largeD Á œÂ $ €A€€‚ÿThe total volume of the table exceeds the capacity of the program to store it. (This does not include comments, which are discarded during the compilation process.) The maximum size table that CC can handle is a compiled 64K table. See section 2.5 for information on compiling a table.AXÁ Ý - *€(€^°¨°‘€s€ €‚ÿToo many changesZ7œÂ 7à # €n€€‚ÿNo more than 5000 changes can be made in a CC table.AÝ xà - *€(€^°¨°‘€s€ €‚ÿToo many definespG7à èà ) "€Ž€€€€‚ÿA table cannot have more than 127 different define(name) commands.@xà (Ä - *€&€^°¨°‘€s€ €‚ÿToo many groupsoFèà —Ä ) "€Œ€€€€‚ÿA table cannot have more than 127 different group(name) commands.@(Ä ×Ä - *€&€^°¨°‘€s€ €‚ÿToo many storesÁ‘—Ä ˜Å 0 .€#€€€€€€‚ÿA table cannot have more than 127 different storage areas. These storage areas are created with the store(name) and append(name) commands.B×Ä ÚÅ - *€*€^°¨°‘€s€ €‚ÿToo many switches´„˜Å ŽÆ 0 .€ €€€€€€‚ÿA table cannot have more than 127 different switches. These switches are created with the set(name) and clear(name) commands.@ÚÅ ÎÆ - *€&€^°¨°‘€s€ €‚ÿUnmatched quoteU%ŽÆ #È 0 .€K€€€ €€ €‚ÿA ' or " has been found in a entry without a corresponding ' or " before the end of the line. If several quoted strings occur in the line, any one of them may be missing the quotation mark. The program will not notice that something is missing until the last quotation mark is unpaired.EÎÆ hÈ - *€0€^°¨°‘€s€ €‚ÿUnrecognized keywordײ#È ?Ê % €e€€‚‚ÿA string of characters has been encountered which is not enclosed in quotation marks but which also is not a legal command or a legal ASCII octal number. Various control codes will produce this message, since they are not considered legal characters. Only TAB and ENTER are legal control codes in a table.Commands which are valid only on one side of the wedge will cause this error if they are used on the other side of the wedge.KhÈ ŠÊ - *€<€^°¨°‘€s€ €‚ÿUse of more than 25 groupsé¹?Ê sË 0 .€s€€€€€€‚ÿMore than 25 groups cannot be in active use at once in CC. Although up to 127 groups may exist in a table, only 25 may be made active using the use(name) and incl(name) commands.IŠÊ ¼Ë - *€8€^°¨°‘€s€ €‚ÿUse of nonexistent group—hsË SÌ / .€Ð€€€€€€‚ÿA use(name) command was specified in the table, but the corresponding group(name) does not occur.o6¼Ë ÂÌ 9 B€l€^°¨°‘€s€ €€€€ €‚ÿUse(name) encountered, but group never defined¤oSÌ fÍ 5 :€Þ€€€€€€€€‚ÿA use(name), incl(name), or excl(name) command has specified a group that does not exist in the table.8 ÂÌ žÍ - *€€^°¨°‘€s€ €‚ÿWARNING?fÍ ÝÎ 1 0€€€‚ãƒÕ¹€#‰€‚ÿError messages which begin with this word are bring something to your attention of which you might not be aware. CC will probably be able to use your table anyway. The message following the WARNING can be lookedup in this section.Alphabetical Summary of Commands@žÍ Ï 1WÿÿÿÿÿÿÿÿÿÿÿÿÏ 1A Form of ChangesèÂÝÎ  & €…€€‚‚‚ÿ2.1 Form of ChangesA changes file must be created before CC is run. A changes file is a text file which consists of one or more change entries. All change entries are in the following foÏ  ÝÎ rm:>Ï O % €2€ €‚ÿsearch > replacementY( ¨ 1 0€Q€€€€€€‚‚ÿThe search must fit on a single line, no more than 128 characters. The right wedge (>) must be on the same line as the search. The replacement may be any number of lines. Blank lines are allowed.Both the search and the replacement are made up of any combination of the following elements::O â , (€€V°¨‘€s€ €‚ÿA. StringsÀœ¨ ¢ $ €9€€‚ÿStrings are a sequence of one or more printable characters. Strings of characters are enclosed within matching sets of single or double quotes. If the replacement is on more than one line, each line must be enclosed in its own set of quotes. Any string containing a single quote mark must be enclosed in double quote marks, and any string containing a double quote mark must be enclosed in single quote marks.c=â  & €z€ €‚ÿ'apples' > 'oranges' "Tom and Bill's" > "Tom's"G¢ L , (€6€V°¨‘€s€ €‚ÿB. Commands or keywordsð f * "€á€€€€‚ÿCommands are short or abbreviated words which instruct the CC program to perform certain functions. Commands are not enclosed in quotes. Commands must be surrounded by spaces, new lines, or tabs. The commands are listed in Section 3.4.EL « , (€2€V°¨‘€s€ €‚ÿC. ASCII number codeso&f  I `€M€€ãÔ0B‰€€‚ãÔ0B‰ã`O‰ãâþ‰ãÎ`*N‰‚ÿIt is sometimes necessary to use non-printing ASCII number codes in a CC table. Both printing and non-printing characters can be represented with ASCII number codes; however, it is usually best to simply enclose a printing character in quotation marks rather than use its corresponding ASCII number code. For example, it is easier to type and understand 'A' than its decimal value d65.A complete chart of ASCII number codes has been included in section 4.4. The following describes decimal, hexadecimal, and octal codes, respectively.݈« ÷ U x€€€€€€€€€ã’\ ‰‚€€€€€€ã’\ ‰‚ÿThe decimal value of the character may be used, without quotes, if it is immediately preceded by a d (either upper or lower case) or 0d (e.g., d8 is BACKSPACE, d9 is TAB). The d and the numbers must be surrounded by spaces or tabs. ASCII control codes are listed in Section 4.4 of this manual. The decimal codes 1 to 255 are legal before or after the wedge, but see the note below.Hexadecimal may be used by placing an "x" or "0x" (either upper or lower case) immediately preceding the number (e.g., x8 is BACKSPACE). If and only if hexadecimal is used, only one x need precede multiple hexadecimal ASCII codes (e.g., X7E08 is ~ BACKSPACE). If you do this, however, be sure that each hexadecimal ASCII code is expressed using 2 digits (e.g., ~ BACKSPACE should be represented by x7E08, not x7E8). The hexadecimal codes 1-FF are legal before or after the wedge, but see the note below.Ö  > J€­€€€€‚€ €‚€ €€€‚ÿOctal may be used by not preceding the actual ASCII code with anything (e.g., 10 is BACKSPACE). The octal (base 8) codes 1-377 are legal before and after the wedge.NOTE,linefeed (d10, x0A, 12), carriage return (d13, x0D, 15), and end of file (d26, x1A, 32) should not be used.NOTE: Although use of octal numbers greater than 377 are not allowed and will result in an error message, use of octal numbers greater than 100000 will not produce an error message.>÷ I , (€$€V°¨‘€s€ €‚ÿD. White SpaceP,  ™ $ €Y€€‚ÿSpaces and tabs separate the strings, commands, and ASCII number codes from one another and from the wedge. Carriage returns may also be used as a separator on the right side of the wedge. Although the search entry must be on one line, the replacement may contain several lines. See example below.ŸrI D@ - *€ä€‘€€€‚‚ÿ'apple' > if(orange) 'orange' ™ D@ ÝÎ else 'watermelon' endifí™ 1A + $€…€€‚ãf¬[»‰‚ÿIn the above example, the replacement could have been all on one line. The white space is ignored by CC during processing, but at least one separator is required.How Changes are Processed@D@ qA 1ÝÿÿÿÿÿÿÿÿÿÿÿÿqA B Getting Startedd1A B 9 B€È€€‚‚ã‚¡™‰‚ã†w°‰‚ãQ݉‚ÿ1. Getting Started1.1 Introduction1.2 Creating a Changes Table1.3 Using a Changes Table9qA GB 1¡ ÿÿÿÿÿÿÿÿGB ÛB ß Glossary”HB ÛB L h€€€ €‚€ƒã‰ãk‹‰ã‰ã"‰ã'‰€‚ÿGlossary A to C, C to D, D to R, R to W, W.GB C & €€€ €‚ÿANSIvQÛB C % €¢€‘€€‚ÿAmerican National Standards Institute The The coding method used by Windows.8 C ·C * $€€€‚€ €‚ÿANSI.SYSôÇC «D - (€€‘€€ãÇ’‰‚‚ÿDOS configuration file needed by the CONFIG.SYS file to properly display debug output for the DOS version. The windows version does not need this. See /d ( debug for DOS) command description.5·C àD & €€€ €‚ÿASCII codes»«D ›E , &€€‘€€ãÔ0B‰‚ÿAmerican Standard Codes for Information Interchange. The coding method used to represent characters in DOS. See section 4.4 ASCII Codes.(àD ÃE % €€˜Œ€‚ÿ0 ›E óE & €€€ €‚ÿBinary¥tÃE ˜F 1 2€è€‘€€ã`O‰ãâþ‰‚ÿA reprentation of the internal coding used by a computer consisting of ones and zeros. See decimal and hex .5 óE ÍF * $€€€‚€ €‚ÿBlockl;˜F 9G 1 2€v€‘€€ãüÒç:‰ã†xl‰‚ÿThe CC commands grouped between a begin and an end.(ÍF aG % €€˜Œ€‚ÿ.9G G & €€€ €‚ÿCase]8aG ìG % €p€‘€€‚ÿDescribes whether a character is upper or lower case.>G *H * $€(€€‚€ €‚ÿCase-sensitivexSìG ¢H % €¦€‘€€‚ÿA selection on a search determined by whether a character is upper or lower case,*H ÎH & € €€ €‚ÿCCB¢H I % €:€‘€€‚ÿConsistent Changes program6 ÎH FI * $€€€‚€ €‚ÿCC.EXEX3I žI % €f€‘€€‚ÿFilename used for the Consistent Changes program4 FI ÒI * $€€€‚€ €‚ÿ.CCT_:žI 1J % €t€‘€€‚ÿFilename extension commonly used when naming CC tables.8ÒI iJ * $€€€‚€ €‚ÿCC Table`:1J ÉJ & €t€‘€€‚‚ÿA text file that contains the changes to be made by CC7iJ K & €"€€ €‚ÿChanges Table^9ÉJ ^K % €r€‘€€‚ÿA text file that contains the changes to be made by CC<K šK * $€$€€‚€ €‚ÿChange entryܨ^K vL 4 6€Q€‘€€‚€€$€‚€‚ÿEntry in the change table that determines the search and replacement criterion. All change entries are in the following form: search > replacement6šK ¬L & € €€ €‚ÿCommand lineÔ¡vL €M 3 4€C€‘€€‚€€€€‚ÿThe line of instruction, switches and files to the computer to start the DOS CC in the following form: cc -t table.cct -o out.txt in.txt 8¬L ¸M & €$€€ €‚ÿCompiled tableÌ¥€M „N ' €K€‘€€‚‚ÿA changes table which has been processed into a compact form. It loads faster than non-compiled table but is a binary file that can't be read via a text editor.4¸M ¸N & €€€ €‚ÿCONFIG.SYS湄N žO - (€s€‘€€ãÇ’‰‚‚ÿConfiguration file containing the command "device = ANSI.SYS" needed to properly display debug information for the DOS version output. See /d (debug for DOS) command description./ ¸N ÍO & €€€ €‚ÿDebugÖžO Û€ , &€­€‘€€ãÇ’‰‚ÿThe prÍO Û€ B ocess of finding and changing errors in the Changes Table. See /d debug for DOS) command description. The Windows version of CC has a separate debug program which only runs on Windows 95 or Windows NT.7 ÍO  * $€€€‚€ €‚ÿDecimalÚ¡Û€ ì 9 @€C€‘€€ãÔ0B‰ã‰ãâþ‰‚‚ÿThe common base 10 numbering system. Decimal codes must be preceded by a d, i.e. d9 for tab. See section 4.4 ASCII Codes..See binary and Hexadecimal./  ‚ & €€€ €‚ÿGroupaì ¨‚ , (€Â€‘€€ãÜEЉ‚‚ÿA set of commands(changes) named so they may be processed seperately. See sec. 3.3 Groups 5‚ Ý‚ & €€€ €‚ÿHexadecimalS¨‚ 0„ 9 @€5€‘€€ã`O‰ãÎ`*N‰ãÔ0B‰‚‚ÿA base 16 numbering system used to represent characters in computer memory using A - F for the digits 10 - 15. Hexadecimal numbers must be preceded by x. A - F may be upper or lower case, for example: x09 or x0D0A or xff See Decimal and Octal. See section ASCII Codes.2 Ý‚ b„ & €€€ €‚ÿKeywordsŽh0„ ð„ & €Ð€‘€€‚‚ÿShort or abbreviated words which instruct the CC program to perform certain functions: CC commands./ b„ … & €€€ €‚ÿMatchŒfð„ «… & €Ì€‘€€‚‚ÿAll of the CC commands and strings to the leftf of the wedge(>). Also called the search argument./ … Ú… & €€€ €‚ÿOctal$ë«… þ† 9 @€×€‘€€ã`O‰ãâþ‰ãÔ0B‰‚‚ÿA base 8 numbering system used to represent characters in computer memory. Octal codes are specified with out quote marks. For example, tab in octal is 11. See Decimal and Hexadecimal. See section 4.4 ASCII Codes 90./ Ú… -‡ & €€€ €‚ÿQuiet¦zþ† Ó‡ , (€ô€‘€€ã¬ð‰‚‚ÿStop CC from asking if you want to replace the existing file. See -q (QUIET) command description. DOS version only.5-‡ ˆ & €€€ €‚ÿReplacementºÓ‡ ˆ - (€€‘€€€%€‚‚ÿAll of the CC commands and strings to the right of the wedge(>). Usually used in the phrase "replacement side": search > replacement.0 ˆ òˆ & €€€ €‚ÿSearch¥zˆ —‰ + &€ô€‘€€€%€‚ÿAll of the CC commands and strings to the left of the wedge(>). Also called the "match" side. search > replacement..<òˆ Ó‰ * $€$€€‚€ €‚ÿStorage area5—‰ R‹ J b€k€‘€€ãœAQʼnãÝ)?Ù‰ã‰ãmç+v‰ãZ=ÒZ‰ãCz"O‰‚ÿAn internal location set aside for collecting data which has been processed through the CC table. Storage areas have names. See the commands store endstore, out, (etc.) for more information. Also see section 4.3 Commands using stores , section 3.4 Switches, and section 3.1 Storage Commands.6 Ó‰ ˆ‹ * $€€€‚€ €‚ÿStringÞR‹ ŒŒ & €½€‘€€‚ÿA string is any combination of literal strings, nl's, and characters (such as d9 for TAB). Literal strings must be enclosed in straight quotation marks (not Word's smart quotes) or straight apostrophes, i.e. "string".8ˆ‹ ÄŒ * $€€€‚€ €‚ÿSwitchesΊŒŒ ’Ž D V€€‘€€ã”õ‰ãì¶3‰ã⿲‰ãZ=ÒZ‰ã;‰<…‰‚ÿ1). Named variables used to specify a "true"/"false" or "on"/"off" type of condition. These are used with the if and ifn commands to indicate conditions for executing blocks of commands. See sec. 4.3 Commands Using Switches and sec. 3.4 Switches. 2). Command line switches are used to control the execution of a DOS program such as CC. See section 2.5 Command Line Options.4 ÄŒ ÆŽ * $€€€‚€ €‚ÿ.txtõÃ’Ž » 2 2€‡€‘€€ãQ݉ã;‰<…‰‚ÿFilename extension sonetimes used for text files used as input and or output to the Consistent Changes program. See section 1.3 Using a Changes Table and section 2.5 Command Line Options.(ÆŽ À % €€˜Œ€‚ÿ» À B / » ;À & €€€ €‚ÿWedgeX2 À “À & €d€‘€€‚‚ÿThe ‘greater than’ symbol (>). A right wedge.5;À ÈÀ & €€€ €‚ÿWhite space齓À ±Á , &€{€‘€€ã}©E„‰‚ÿSpaces, tabs and line breaksused to separate the parts of a change entry. White space is required between commands, before and after literal strings, etc. See section 2.1 White Space&ÈÀ ×Á # €€€‚ÿ¹ƒ±Á  6 :€€V°¨‘€s€&€ã:≀‚ÿWildcard Used in the -o Command Line as an option to instruct CC to process all files matching a specified pattern.(×Á ¸Â % €€˜Œ€‚ÿ' ß # €€€‚ÿ 7¸Â à 14ÿÿÿÿÿÿÿÿÿÿÿÿà  Groups Õß #Ä 8 >€«€€‚€‚ãf¸j ‰‚€€‚‚ÿ3.3 GroupsThere are two commands associated with the group function. They are:group(name) use(name)These commands allow certain entries in the table to be available to be matched while others are not.Uà xÄ 8 @€:€V°¨‘€s€ €€€€ €‚ÿWhat group(name) Does‡Q#Ä ÿÅ 6 :€£€€€€€€€€‚ÿThis command is not used as part of a search  > replace entry. Rather, it is used on a line all by itself to mark the beginning of a group of changes. The changes in this group can be executed as if they were the only changes in the table. The end of the group is marked by either the end of the table, or another group command.VxÄ UÆ 8 @€<€V°¨‘€s€ €€€€ €‚ÿWhat use(name) DoesrBÿÅ ÇÈ 0 .€…€€€€€€‚ÿWhenever more than one group is used, each must be appropriately designated by a group command. The first group does not require a name, however. If it is unnamed, CC will call it group 1, and will give an error message if another group 1 is found in the table. Unless specified otherwise, the program will start in group(1), or in the first group whose name begins with a '1'. If numbers are not being used for group names, the program will start in the first group in the table. To begin in some other place, the use command must appear in the begin entry. For example:;UÆ É ( €&€‘€€€‚ÿbegin > use(2) ¯fÇÈ ±Ë I `€Í€€‚€€€€€€€€€€€€‚ÿAlthough the above example specified group(2) as the place to start, any group in the table could have been specified.The use(name) command can also be used to make a different group or set of groups active during processing. The name argument tells CC which group or groups of changes to use from that point on, unless it finds another use command. You should put use(name) only on the right side of the wedge. Note that when CC encounters a use command, it finishes the entry which contains it; use(name) does not jump immediately to the specified group, but takes effect at the end of the entry.U)É Ì , (€R€V°¨‘€s€ €‚ÿExample of the group and use commandsÅ¡±Ë ËÍ $ €C€€‚ÿIn a bilingual dictionary, one might wish to make certain changes in the orthography of one language without doing anything to the other language. Let's suppose that you had a huge text file that was a bilingual dictionary, one that a Spanish speaker would use to find the meaning of English words. A text file for such a dictionary might be keyed in with each line preceded by a Standard Format Marker as follows:òÄÌ ½Î . *€‰€‘€€€‚ÿ\w word in English \p part of speech in Spanish \d definition in Spanish \q qualifying comment in Spanish \i illustrative sentence in English \t translation of illust. sentence in SpanishrMËÍ ; % €›€€‚‚ÿAnd suppose the orthography change is to be in the English language. Such a change would affect the \w and \i parts of the entry, but not the \p, \d, \q, or \t parts.There are at least two ways to approach this problem. One way is to use switches. (See section 3.4.) Another option is½Î ; ß to use groups. Consider the following table:Š½Î ý 8 >€€‘€€€‚ÿc Orthography change for the \w and \i fields begin > caseless group(1) '\w ' > dup use(2) c Go to group two, where '\i ' > dup use(2) c the change occurs group(2) 'kw' > 'qu' c Change kw to qu for \w and \i c Don't change these fields, go back to c group one, where nothing happens to kw. '\p ' > dup use(1) '\d ' > dup use(1) '\q ' > dup use(1) '\t ' > dup use(1)O,; L # €X€€‚ÿWhat does this table say? First the line:4 ý € ( €€‘€€€‚ÿgroup(1)íL — * "€Û€€€€‚ÿidentifies the beginning of a group. It tells the program that the following changes belong to a group called (1). Unless it is told otherwise, the program will always use the changes in group one when the program begins. The lines:†]€  ) "€º€‘€€€‚ÿ'\w ' > dup use(2) c Go to group two, where '\i ' > dup use(2) c the change occursóÉ—  * "€“€€€€‚ÿtell the program that whenever it sees \w or \i while it is inside group(1), that it should duplicate what it has matched (dup command) and go use the changes that are in group two. The next line:4  D ( €€‘€€€‚ÿgroup(2)œy à # €ò€€‚ÿidentifies the beginning of the second group of changes. The changes for this group follow the group command, such as:Z2D : ( €d€‘€€€‚ÿ'kw' > 'qu' c Change kw to qu for \w and \i ìÈà & $ €‘€€‚ÿThese are the orthography changes that we want performed on the data in the \w and \i fields. That is why those markers requested group(2). They are not all that is in group(2), however. The lines:Õ§: û . *€O€‘€€€‚ÿc Don't change these fields, go back to c group one, where nothing happens to kw. '\p ' > dup use(1) '\d ' > dup use(1) '\q ' > dup use(1) '\t ' > dup use(1) !ð&  1 0€á€€‚ãZ=ÒZ€#‰€‚ÿcatch all the other markers in the dictionary. They send them back to the first group. There, the data following them passes to the output file without any change in kw or Kw, if that combination of letters happens to occur.SwitchesJû f 1Qÿÿÿÿÿÿÿÿÿÿÿÿf m How Changes are ProcessedýÌ c 1 0€™ €€‚€‚‚€€‚‚ÿ2.2 How Changes are ProcessedOnce an input text string matches a search entry, the program does whatever is on the replacement side of the wedge. The matched string is not sent to the output unless the replacement side contains a dup command or explicitly puts it into the output. The program then moves on to the next piece of input data. Data is only processed once, unless it is brought back into the input from the output with the back(number) command.As you write your changes table, it is very important to remember how the CC program works: CC "reads" your text file one character at a time. As the program reads a character, it tries to match it and following characters to a search string on the left side of the changes table. If it matches the search entry, the program obeys the commands on the right side of the table and the replacement text is sent to the output. The characters that matched do not go to the output. Remember that CC is a search and replace program. Once it finds what it is searching for, it replaces it with something else. If an input character in the text doesn’t match any search entry, that character goes straight to the output and the CC program reads the next character.;f ž # €0€€‚ÿThus, given the tableJc è 0 0€4€‘€€ƒƒƒ‚ƒƒƒƒ€‚ÿ‘x’>‘y’‘y’>‘z’…Už m 0 0€ª€€‚ã$Á€ ‰€‚ÿthe input word xylophone will become yzlophone not zzlophone.Order of Changes= è ª 1œÿÿÿÿÿÿÿÿÿÿÿÿª ¦D Introductionæm ÈA , &€Í€€‚€‚‚‚‚‚ÿ1.1 IntroductionThe purpose of the manª ÈA m ual is to fully describe the CC program (CC.EXE).The prerequisites for understanding this manual are:1. Familiarity with the computer to be used and a working knowledge of DOS, including how to change directories and start programs from the DOS prompt.2. Ability to use Notepad, WinWord or some other word processor to produce unformatted text files. (See the manual for your word processing program if you are unsure of how to do this.). ”oª \D % €ß€€‚‚ÿThe CC program is useful for finding all occurrences of specified characters, words, or phrases in a text file or series of text files, and making some type of change to this data in a consistent way. The change may be done in every occurrence found or only when certain conditions are met. CC is like the "search and replace" feature in a text editor, except much more powerful because it allows you to make changes which take context into consideration. Beyond the search and replace feature, CC can also be used to count items (characters, words, or phrases), insert or remove text, or reorder parts of a text file.JÈA ¦D , (€<€ã†w°€ ‰€‚ÿCreating a Changes Table7\D ÝD 1ÿÿÿÿÿÿÿÿÿÿÿÿÝD «E Manual΃¦D «E K d€€€‚‚ãÜhú‰‚ãSú䉂ã|}‰‚〠ñ‰‚ãºQÖꉀ‚ÿManual1 .Getting Started2. Consistent Changes Description3. Advanced Features4. Quick Reference5. GlossaryAÝD ìE 1¤ÿÿÿÿÿÿÿÿÿÿÿÿìE Š Order of Changes¡x«E G ) €ñ€€‚€‚‚ÿ2.3 Order of ChangesChange entries are checked for a match according to the number of characters in the search entry, longest first. In the following example, if the word sentimental was in the input file, it would be changed to emotional, not sentipeopletal in the output file, because CC checks the longest search string first for a match. In this case, it was line 2.{RìE H ) "€¤€‘€€€‚ÿ"men" > "people" c line 1 "sentimental" > "emotional" c line 2BõG JL M h€ë€€€€€€‚ãœAQÅ€‰€€‚€€€€‚ÿIf more than one group is being used, the changes are not mixed. Groups will be searched in the order requested, regardless of the length of search entries in any of the other groups. Within the groups, however, changes will begin testing with the longest search entry first.The commands any(name) and cont(name) are counted as single characters regardless of the number of characters in the store name.The commands fol(name), and prec(name) each have the weight of 1/10th of a character. This guarantees that entries with fol(name) or prec(name) will take precedence over similar entries without the fol(name) or prec(name), but entries with any(name) will take precedence over similar entries with fol(name). The reason for this is that fol(name) and prec(name) are conditions for the match, not part of the match, as opposed to any(name) and cont(name) which are actually part of the match. See section 2.4 for more detailed information on fol(name), prec(name), any(name), and cont(name).rOH ¼L # €ž€€‚ÿIn the following example, line 2 would be checked for a match before line 1:¡vJL ]M + &€ì€‘€€€‚ÿbegin > store(affix) "abc" endstore "test" > "x" c line 1 "test" fol(affix) > "y" c line 2 Í”¼L *N 9 @€)€‚—€€€€€€€‚ÿAlso, any(name) takes precedence over fol(name) or prec(name). In the following example, line 2 would be checked for a match before line 1:ªx]M ÔN 2 4€ð€‘€€ƒƒ€€€‚ÿbegin > store(affix) "abc" endstore "test" fol(affix) > "fol" c line 1 "test" any(affix) > "any" c line 2°Œ*N „O $ €€€‚ÿNote that the length of string in the store does not matter to the cont command. In the following table, line 2 is sorted before line 1.W'ÔN ÛO 0 0€N€‘€€ƒƒƒƒƒƒƒ€‚ÿ‘cat’>‘dog’‘catalog’>‘book’Ÿ|„O †€ # €ø€€‚ÿHÛO †€ «E owever, even though the following table is in many ways equivalent to the preceding, line 1 is not sorted before line 2.|NÛO  . ,€œ€‘€€ƒƒƒƒ€‚ÿbegin > store(list) ‘catalog’ endstore‘cat’> ‘dog’cont(list)> ‘book’”q†€ – # €â€€‚ÿThe only time search entries are not sorted by length is when they have the same relative length. For example:vI ‚ - *€’€‘€€ƒƒƒ€‚ÿbegin > store(1) 'aeiou' endstore 'xa' > 'ksa' 'x' any(1) > dupÑ– „ 7 <€£€€€€€€€€‚‚ÿIn this case CC will process the lines in order. When the string xa is encountered ksa will be output. Even though the next entry would also match the input and appears longer, CC equates both lines as having the same length. Thus, the xa entry remains first and is checked for a match first.Sometimes people confuse the order of checking changes with the order of performing changes. (See section 2.2 How Changes are Processed.) In the following table,r5 ‚ †„ = J€j€‘€€ƒƒƒƒ€€ƒƒƒƒ€€€‚ÿ‘(c’>‘(k’c line 1‘cat’>‘dog’c line 2}@„ ‡ = H€€€€€€€€€€€‚‚ÿthe word (cat) will become (kat) not (dog). The (c occurs first in the input, so it will be found first, even though line 2 is checked before line 1. This is because CC process changes in the order of the text, not in the order of the changes. The text, not the CC table, controls the processing order.Just to cover all the other cases where ordering of table entries might cause problems, CC has an "unsorted" option so that you can completely suppress CC's sorting. To use this option, place the keyword unsorted on the begin line as in the following example:X.†„ [‡ * $€\€‘€€€‚ÿbegin > unsorted "a" > "x" "ab" > "y"p?‡ ˉ 1 0€€€‚€ €€€‚ÿWhen CC is processing this table, it will always search the entries in the order they physically appear in the table, thus for input file containing the letters "abc" the output would be "xbc" rather than the output of "yc" which would be expected if the unsorted option was omitted.NOTE: We strongly discourage use of the unsorted option because it violates the "longest search entry first" principle. This can make a table very confusing for a human reader to understand or predict what will happen to his data because it changes the very nature of how CC operates.F[‡ Š , (€4€ãÝŸÛh€ ‰€‚ÿCommand DescriptionsEˉ VŠ 1»ÿÿÿÿÿÿÿÿÿÿÿÿVŠ Ì Predefined ConstantsÅŠ [Œ @ N€‹€€‚‚‚‚㉂ã#Y‰‚㉂‚‚‚‚ÿPredefined Constants NEW PREDEFINED CONSTANTS: There are 4 new predefined stores that can be used with the out() or outs() commands. For example now if a cc table contains out(cccurrentdate) then the output file gets 03/27/1996 put into it. The predefined stores are: cccurrentdate Put out date in mm/dd/yyyy format cccurrenttime Put out time in hh:mm:ss format (hh from 00 to 23) qFVŠ Ì + $€€€‚‚‚‚€‚ÿ ccversionmajor Put out CC major version number, e.g. 8 ccversionminor Put out CC minor version number e.g. 0 or "0 (beta)" or "0b" or whatever. Note if you want the major/minor version together as seen in the DOS command line the user needs to put in the '.' between major and minor.A[Œ Ž 1Uÿÿÿÿÿÿÿÿÿÿÿÿ Ž ! Quick References¼Ì ! X ~€y€€‚‚ãÍ šI‰€‚€ãƒÕ¹‰‚ã⿲‰‚ãÔ0B‰‚㼘Ì߉‚ã¸V¸T‰€‚ÿ4. Quick Reference4.1 Error Messages4.2 Alphabetical Summary of Commands4.3 Commands by Logical Groupings4.4 ASCII Codes 904 5.All Commands4.6 Predefined Constants> Ž _ 12€ÿÿÿÿÿÿÿÿÿÿÿÿ_ £ˆ Store Command7! – # €(€€‚ÿTHE STORE COMMAND1 _ ÓÁ & €€˜€‚‚ÿThe store command in CC is extremely powerful. Storing is the capab– ÓÁ ! ility of holding the output data in a named storage area or buffer and thus being able to manipulate it in a variety of ways. Stored data can be output, discarded, compared, or used as a match string.This chapter discusses half a dozen of the more common uses of the store command. There are more. In particular, this chapter does not discuss using stores for conditions. For a discussion of this functionality, see "Switches and Conditional Commands".C–  ( €6€°Œ€€‚ÿWhat does storing mean?qLÓÁ ‡Å % €™€˜€‚ÿWhen the store command is encountered in a CC table, the data continues to be processed through the table. However on its way to being output, the data is redirected to whichever storage area was named by the store command. (You can think of it like a switch on a railroad track. Depending on the way the switch is set, the train goes one direction or the other.) The data continues to be held in the storage area until another store command is encountered for that storage area. If an out command is encountered, a copy of the data is sent to the output, but it also remains in the store area. Note that the table itself it not aware of storing, and only in rare and odd situations is the performance different than if storing were not taking place. This is discussed at the end of the chapter, after you are more familiar with the command.A ÈÈ & €7€˜€‚‚ÿStoring is done into only one store at any one time. When a second store command is encountered, storing to the first storage area is stopped, and the data which would be output is redirected into the just-named store.Immediately following is a reference-type description of some of the commands related to storage. Then there are sections which deal with various uses of the store command. These uses are dealt with largely in isolation from other complexities for the sake of simplicity. Often a real situation will require combining them, either with other store uses or with other capabilities of the CC program. Bear in mind, however, that such combinations can sometimes be done by separate, simple tables run in separate passes through the data rather than one massive, complex table.<‡Å É ( €(€°Œ€ €‚ÿStorage Commands}YÈÈ É $ €²€˜€‚ÿThere are five commands directly connected with the storage feature of the CC program:GÉ Ê H `€Ž€ °ãœAQÅ€‰ãÙpñ‰ãÝ)?Ù‰ã‰ã#Y‰‚ÿstore(name) append(name) endstore out(name) outs(name)‰eÉ ™Ê $ €Ê€˜€‚ÿSome secondary commands which use storage areas, but which are not described in this section, are:mÐÊ Ì ¡€ °ã¬€‰ƒƒƒƒãާ߉ãoeœ‰ƒƒƒƒãÏJDá‰ãáÕò¬‰ƒƒƒƒãÛ…‰ãø¾2‰ƒƒƒƒã(m‰ã’¢‰ƒƒƒƒãÇ=O‰ã4[¥ß‰ƒƒƒƒã,ã/‰ãÌÏ’‰ƒƒƒƒã Úy‰‚ÿadd(name)ifgt(name) any(name)incr(name) cont(name) mul(name) div(name)prec(name) fol(name)sub(name) ifeq(name)wd(name) ifneq(name)wrstore(name)“[™Ê ™Î 8 >€·€˜€ãÝŸÛh‰‚€€€€‚ÿMore information on these can be found in section 2.4 Command Description.The expression (name) represents any logical name you choose. In versions of CC prior to Version 7.2B, only numbers could be used to identify stores, groups, etc. A name can consist of alphabetic characters or numbers, and cannot include spaces, commas, or a right parenthesis. The names can be any length. The names are case sensitive, so store(cat) and store(Cat) would refer to different stores. There is a program limit of 127 different stores. These rules also apply to the names for groups, switches, and defines.YÌ òÎ : D€>€°Œ€ãœAQʼn€ €€ €€‚ÿWhat store(name) DoesV™Î T 7 <€?€˜€€€€€€€‚ÿWhen the store(name) command is encountered, the storage area assigned to that name is first cleaned out. Any data stored there previous to encountering the store(name) is discarded without warning. Before usinòÎ T ! g the store(name) command, be sure you do not need anything that may be in the storage area. Now rather than send data to the normal output, the data is sent to the temporary storage area. Data will continue to be stored in this area until the program encounters another command that effects storage (append, endstore, out). åòÎ ^ % €Ë€˜€‚ÿIf storage had been requested to one area (name1), but it is now requested to a different area (name2), the output is diverted to the second area and no longer goes into the first. Only one storage area at a time accepts data.Z T ¸ : D€@€°Œ€ãÙpñ‰€ €€ €€‚ÿWhat append(name) Does‰L^ A = H€™€˜€€€€€€€€€‚ÿThe append(name) command is quite similar to the store(name) command, except the append(name) command does not discard the previous contents of the storage area. The append(name) command retains the previous contents and inserts the new data into the storage area following any data that already was in that storage area.I¸ Š . ,€6€°Œ€ãÝ)?Ù‰€‚ÿWhat endstore DoesCA Í , &€/€˜€‚€€‚ÿWhen an endstore command is encountered, any storage that was going on is stopped and output is directed to the actual output, as it does when storage is not requested. Data that is currently in storage will remain there until the program encounters a store command naming that area. Note that no name is required for the endstore command.By the way, if you want to deliberately clear out the contents of a storage area, the combination of commands store(name) endstore will clear it out, then direct output to the actual output.WŠ $ : D€:€°Œ€ã‰€ €€ €€‚ÿWhat out(name) Does>Í ¥ C T€}€˜€€€€€€€€€€€‚ÿWhen out(name) is encountered, two things happen. First, if storage is being done, it is stopped as if an endstore had been encountered. Second, the contents of storage area (name) are sent to the output file. Note that no matches are performed; the contents of the storage area do not pass through the changes table. Also note that storage area (name) is not cleared out; it still contains what it contained before the out(name) was encountered. Storage area (name) may be output any number of times. If there is nothing in the storage area, nothing is output.X$ ý : D€<€°Œ€ã#Y‰€ €€ €€‚ÿWhat outs(name) Does;÷¥ 8 D V€ï€˜€€€€€€€€€€€‚‚ÿThe outs(name) command is very similar to the out(name) command except the outs(name) command does not stop storing. This provides a way to transfer data from one storage area to another. This applies whether storing is being done with the store(name) command or with the append(name) command. For example, to move the content of store(first) to store(second) do: store(second) outs(first) endstore.To put the contents of storage areas first, second, and third all together into area four:mCý ¥ * $€†€‘€€€‚ÿstore(four) outs(first) outs(second) outs(third) endstore)8 Î $ € €˜€‚ÿorc9¥ 1 * $€r€‘€€€‚ÿstore(four) outs(first,second,third) endstore3 Î d ( €€°Œ€ €‚ÿSummarywR1 Û % €¤€˜€‚‚ÿThe following chart attempts to summarize much of the information given above. d õ z#€A Š   Ž Ž €€˜€‚ÿ€€˜‚ÿ€H€˜‚ÿ€¤€˜‚ÿ€ø€˜‚ÿÿÿcloses any currently open storeredirects output data to the specified storeredirects output data to the output fileerases contents of the named storeš!Û  y#€B Š   Ž Ž €€˜€‚ÿ€€˜‚ÿ€&€˜‚ÿ€0€˜‚ÿ€8€˜‚ÿÿÿstore(name)yesyesnoyesš!õ 5@ y#€B Š   Ž Ž €€˜€‚ÿ€€˜‚ÿ€(€˜‚ÿ€2€˜‚ÿ€:€ 5@ ! ˜‚ÿÿÿappend(name)yesyesnono– Ë@ y#€: Š   Ž Ž €€˜€‚ÿ€€˜‚ÿ€ €˜‚ÿ€(€˜‚ÿ€2€˜‚ÿÿÿendstoreyesnoyesno—5@ bA y#€< Š   Ž Ž €€˜€‚ÿ€€˜‚ÿ€"€˜‚ÿ€*€˜‚ÿ€4€˜‚ÿÿÿout(name)yesnoyesno®5Ë@ B y#€j Š   Ž Ž €€˜€‚ÿ€€˜‚ÿ€"€˜‚ÿ€B€˜‚ÿ€b€˜‚ÿÿÿouts(name)nono (no change)no (no change)no'bA 7B $ €€˜€‚ÿ4 B kB ( €€°Œ€€‚ÿDeletionlG7B ×D % €€˜€‚ÿPerhaps the simplest capability to describe is deletion. It is a matter of capturing something and not ever letting it go to the output. There are other ways to delete things in CC: if something is matched and not explicitly output, it is deleted; also the omit command can be used to delete the next character in the data. However, matching assumes that the exact string is known, and omit is slow for any quantity of data. Storing is most ideal for deleting quantities of data that follow some type of signal in the text. This need not be a backslash marker, though it often is.yTkB PF % €©€˜€‚ÿConsider the following address list as a sample of the input data. Besides having names and addresses, the list also contains a Miscellaneous field, marked with a \misc. In addition, some records contain a \let field, indicating dates of correspondence. Now, however, the owner of the list wishes all \misc and \let fields to be removed.2 ×D ‚F ( €€°Œ€ €‚ÿInput: ÙPF ŽG 3 4€³€‘€€€‚ÿ\name Joe Smith\misc x, y, z\addr 1 Nice St.\csz Smithville, NC 28173\let 8/19/87, Xmas 87, 6/15/88\name John and Betty Jones\addr 1995 Goodyear Rd.\csz Johnston, NC 28174\misc a, b\let Xmas 87, Xmas 88;‚F ÉG ( €&€°Œ€ €‚ÿDesired Output:º‹ŽG ƒH / ,€€‘€€€‚ÿ\name Joe Smith\addr 1 Nice St.\csz Smithville, NC 28173\name John and Betty Jones\addr 1995 Goodyear Rd.\csz Johnston, NC 281742 ÉG µH ( €€°Œ€ €‚ÿTable:a=ƒH I $ €z€˜€‚ÿThe following table will remove the \misc and \let fields.wLµH I + &€˜€‘€€€‚ÿ'\misc ' > store(discard)'\let ' > store(discard)'\' > endstore dup êI œJ % €Õ€˜€‚ÿThis says "When a \misc is found, redirect all output to a store area named discard. When a \let is found, redirect all output to a store area named discard. When any other backslash is found, stop storing and output the backslash.<I ØJ ( €(€°Œ€ €‚ÿThe gory detailsðÉœJ ÈN ' €“€˜€‚‚‚ÿThe data is processed as follows:The \name enters the table (one character at a time). It fails to match at '\misc' and '\let'. Its backslash matches at the '\' entry. Any store that might be open is closed. No store is open yet, so this command has no real effect this time. The 'dup' command causes the backslash to be sent to the output.Since only the backslash was matched, the rest of the marker, and the data following it, are processed through the table. Nothing matches, so it all goes to the output. Next, the '\misc' marker enters the table (one character at a time). It is matched at the '\misc ' entry. The store(discard) command causes the table to open a storage area named discard. The entry being completed, the data following the marker is now processed, one character at a time, through the table. Nothing matches, so it all goes to the output; however, since a store is open, it is redirected to the open store, which the user has named discard.)ØJ ý€ & €€˜€‚‚ÿNext, the '\addr' marker enters the table (one character at a time). It fails to match at '\misc' and '\let'. Itsbackslash matches at the '\' entry. The store named discard is open, and the 'endstore' command causes it to be closed. Note that the data in the store remains ÈN ý€ ! intact. The dup command causes the backslash to be sent to the output.Since only the backslash was matched, the rest of the marker, and the data following it, are processed through the table. Nothing matches, so it all goes to the output.¡{ÈN žƒ & €÷€˜€‚‚ÿNext, the '\csz' marker enters the table (one character at a time). It fails to match at '\misc' and '\let'. Itsbackslash matches at the '\' entry. Any store that might be open is closed. No store is open, so this command has no real effect this time. The 'dup' command causes the backslash to be sent to the output.Next, the '\let' marker enters the table (one character at a time). It is matched at the '\let ' entry. Thestore(discard) command causes the table to open the storage area named discard. At this point, the previous contents of the store are erased. (Note: They are completely gone, they are not sent to the output.)iý€ -† & €Ó€˜€‚‚ÿThe entry being completed, the data following the marker is now processed, one character at a time, through the table. Nothing matches, so it all goes to the output; however, since the store named discard is open, the output is redirected to the open store.The \name (for John and Betty Jones) enters the table (one character at a time). It fails to match at '\misc' and '\let'. Its backslash matches at the '\' entry. The store named discard is open, and the 'endstore' command causes it to be closed. Note that the data in the store remains intact. The dup command causes the backslash to be sent to the output.˦žƒ ø† % €M€˜€‚ÿThe process continues until the end of the input. Note that the process is not affected by the order of the markers in the record, nor by the markers being absent.J"-† B‡ ( €D€°Œ€ €‚ÿFurther discussion of Deletionº•ø† ü‡ % €+€˜€‚ÿA table for deletion can be written either of two ways. Often it is simplest to name the specific marked fields to be deleted, as in this example.Ì B‡ Ȉ , &€A€‘€€€‚ÿ'\misc ' > store(discard) c get rid of \misc'\let ' > store(discard) c get rid of \let'\' > endstore dup c keep everything elserNü‡ :‰ $ €œ€˜€‚ÿSometimes it is simplest to name the specific marked fields to be retained.ÙȈ @Š - (€³€‘€€€‚ÿ'\' > store(discard) c get rid of everything else'\name ' > endstore dup c keep \name field'\addr ' > endstore dup c keep \addr field'\csz ' > endstore dup c keep \csz field†_:‰ Æ‹ ' €¿€˜€‚‚‚ÿThis says, delete everything but the markers \name, \addr, \csz, and their contents. All other markers and their contents are deleted.Note that in both the tables, the items to be deleted have the store(discard) command; the items to be retained have the endstore dup commands.For the data given, both the above tables would have the same effect.@@Š Œ ( €0€°Œ€€‚ÿSelection of recordsòÍÆ‹ øŒ % €›€˜€‚ÿConsider the following address list as a sample of the input data. Suppose that you wanted to select out all the records that contained some particular feature, such as everyone who lives in Smithville.2 Œ * ( €€°Œ€ €‚ÿInput:j1øŒ ”Ž 9 @€c€‘€€€‚ÿ\name Joe Smith\misc x, y, z\addr 1 Nice St.\csz Smithville, NC 28173\let 8/19/87, Xmas 87, 6/15/88\name John and Betty Jones\addr 1995 Goodyear Rd.\csz Johnston, NC 28174\misc a, b\let Xmas 87, Xmas 89\name George Doe\addr 15 Deer Ln\csz Smithville, NC 28173\misc x, a, z\let (none);* ÏŽ ( €&€°Œ€ €‚ÿDesired Output:÷Ä”Ž Æ 3 4€‰€‘€€€‚ÿ\name Joe Smith\misc x, y, z\addr 1 Nice St.\csz Smithville, NC 28173\let 8/19/87, Xmas 87, 6/15/88\name George Doe\addr 15 Deer Ln\csz Smithville, NC 28173\misc x, a, z\let (none)2 ÏŽ À ( €€°Œ€ €‚ÿTable:Æ À ! sOÆ À $ €ž€˜€‚ÿThe following table will extract all records containing the word Smithville:“i À Á * $€Ò€‘€€€‚ÿ'\name ' > store(record) dup'Smithville' > out(record) dup store(record) endstore‘lÀ £Â % €Ù€˜€‚ÿThis says "When a \name is found, redirect all output to a storage area named record. If the word Smithville is found, output the contents of the store record. (This would be the first part of the record.) Then output the matched string, Smithville. Clear the store, in case the word is found again. Stop storing so the rest of the record can go to the output.<Á ß ( €(€°Œ€€‚ÿThe gory detailsÈ¢£Â §Å & €E€˜€‚‚ÿThe \name of \name Joe Smith enters the table (one character at a time). It fails to match at Smithville (remember, the longest string is tried first), but it does match at the \name entry. Any store that might be opened is closed, and the store named record is opened, erasing an previous contents. The match string, \name, is output. Since the output is being redirected to the store record, \name will go there.Other elements of the data will pass through the table, one character at a time. Each one will try to match at either of the two entries, but nothing of note happens for several lines. Since the store record is open, all data will fall into the store.4ß ÛÉ % €€˜€‚ÿAfter the \csz marker has passed through the table (one character at a time) and failed to match anything, the S from Smithville enters the table. This is a potential match at "Smithville", and the characters immediately following it are checked. They succeed in matching the Smithville entry. The out command causes any open store to be closed, and a copy of the contents of the storage area record is sent to the output. (Recall that this contains everything from the beginning of the record up to but not including the word "Smithville". Then the dup command sends a copy of the match string (Smithville) to the output. The store(record) command opens the storage area record, causing its contents to be erased. Then the store is closed. (These two commands have the effect of erasing the contents of the store -- which cannot be accomplished any other way.) This is necessary in case the word Smithville exists elsewhere in the record. (For example, John and Betty Jones live in Johnston. "Johnston" is also a common last name.ß¹§Å ºÌ & €s€˜€‚‚ÿThe data following the word Smithville now begins to pass through the table (one character at a time). Nothing matches, so each character will be sent to the output. Since there is no open store, the data will go to the actual output file.The \name of \name John and Betty Jones enters the table (one character at a time). It fails to match at Smithville (remember, the longest string is tried first), but it does match at the \name entry. Any store that might be opened is closed, and the store named record is opened, erasing an previous contents. (The store was empty.) The match string, \name, is output. Since the output is being redirected to the store record, \name will go there.óÍÛÉ ­Ï & €›€˜€‚‚ÿOther elements of the data will pass through the table, one character at a time. Each one will try to match at either of the two entries, but nothing matches, so each character will be sent to the output. Since the store record is open, all data output will fall into the store.The \name of \name George Doe enters the table (one character at a time). It fails to match at Smithville but it does match at the \name entry. Any store that might be opened is closed, and the store named record is opened, erasing an previous contents. (The store contained the entire John and Betty Jones record.) The match string, \name, is output. Since the output is being redirected to the store record, \name will go there.T.ºÌ  & €]€˜€‚‚ÿOther elements of the data will pass through­Ï  ! the table, one character at a time. Each one will try to match at either of the two entries, but nothing of note happens for several lines. Since the store record is open, all data will fall into the store.After the \csz marker has passed through the table (one character at a time) and failed to match anything, the S from Smithville enters the table. This, and the characters immediately following it succeed in matching the Smithville entry. The out command causes any open store to be closed, and a copy of the contents of the storage area record is sent to the output. Then the dup command sends a copy of the match string to the output. The store(record) command opens the storage area record, causing its contents to be erased. Then the store is closed.ô­Ï & % €é€˜€‚ÿThe data following the word Smithville now begins to pass through the table (one character at a time). Nothing matches, so each character will be sent to the output. Since there is no open store, the data will go to the actual output file.K#  q ( €F€°Œ€ €‚ÿFurther discussion of Selectionx&  % €ñ€˜€‚ÿNote that in the Smithville entry the dup command can occur anywhere except between the store and endstore commands. If it's before the out(record), the string will land in the store, but then it will be output by the out(record) command. If it's after the store is erased, that has no effect on the match string. The order of all other commands is significant, however.•q Ð - (€+€‘€€€‚ÿ'\name ' > store(record) dupc find Smithville anywhere in the record 'Smithville' > out(record) dup store(record) endstorezO J + $€Ÿ€˜€ãZ=ÒZ‰‚ÿYou can select records using multiple criteria which are in an OR relationship. So, you could select all records containing Smithville and records containing have Xmas 87. Note however, that you cannot select only those records which have both elements. That will require a group or a switch. (See section 3.4 for an example.)ë¿Ð 5 , &€€‘€€€‚ÿ'\name ' > store(record) dup'Xmas 87' > next c find Xmas 87 anywhere'Smithville' > out(record) dup c find Smithville anywhere store(record) endstoreʤJ ÿ & €I€˜€‚‚ÿThe command next is a short way of saying 'Do the same thing that's done in the following entry'.If you wish to require that the criterion for selection (the word Smithville in this example) occur in a specific field, you will probably need to use a group or a switch. If, as in this case, the word to be selected immediately follows its marker, you can include the marker as part of the match string. For example,¶‹5 µ + $€€‘€€€‚ÿ'\name ' > store(record) dup'\csz Smithville' > out(record) dup c Smithville in \csz store(record) endstore/þÿ ä 1 0€ý€˜€ãÜEЉãZ=ÒZ‰‚ÿHowever, if you wanted to select by the last name Smith, or something that might have other words preceding and following, you would need a different approach. This is described in the sections on groups(section 3.3) and on switches(section. 3.4)9µ  ( €"€°Œ€€‚ÿRearrangement¾˜ä Û & €1€˜€‚‚ÿRearrangement cannot be done without using a store. Rearrangement is the reordering of parts. The approach is to store each part when its marker is recognized. Then, at an appropriate point, output the various parts in the correct order.For example, consider the following data. It has \fn for the first name, and \ln for the last name. Suppose the user wished to have the \ln field before the \fn field.2   ( €€°Œ€ €‚ÿInput:âÛ 0@ 5 8€Å€‘€€€‚ÿ\fn Joe\ln Smith\misc x, y, z\addr 1 Nice St.\csz Smithville, NC 28173\let 8/19/87, Xmas 87, 6/15/88\fn John and Betty\ln Jones\addr 1995 Goodyear Rd.\csz Johnston City, NC 28174  0@ ! \misc a, b\let Xmas 87, Xmas 88:  j@ ( €$€°Œ€ €‚ÿDesired outputâ0@ A 5 8€Å€‘€€€‚ÿ\ln Smith\fn Joe\misc x, y, z\addr 1 Nice St.\csz Smithville, NC 28173\let 8/19/87, Xmas 87, 6/15/88\ln Jones\fn John and Betty\addr 1995 Goodyear Rd.\csz Johnston City, NC 28174\misc a, b\let Xmas 87, Xmas 886 j@ ·A + &€€°Œ€ €€‚ÿTable:eAA B $ €‚€˜€‚ÿOne possible table to acccomplish this would be the following:§z·A ÃB - *€ô€‘€€€‚ÿ'\ln ' > store(ln) dup'\fn ' > store(fn) dup'\' > out(ln,fn) store(fn,ln) endstore dupU0B E % €a€˜€‚ÿThis says, when a '\ln ' is found, redirect all output to a storage area named ln. Duplicate the marker to the output. When a '\fn' if found, redirect all output to a storage area named fn. Duplicate the marker to the output. When any other backslash is encountered, copy the contents of the storage area fn to the output, closing any open store. Also do that with the storage area ln. Then open the store fn. (This causes the contents of the store to be deleted.) Also do that with the store ln. Close any open store. Duplicate the backslash to the output.<ÃB TE ( €(€°Œ€€‚ÿThe gory details2 E †G & €€˜€‚‚ÿThe \fn of \fn Joe enters the table (one character at a time). It fails to match at the \ln entry, but it does match at the \fn entry. A store named fn is opened, and output is redirected to the store. The matched string is duplicated to the output, and since the store fn is open, it is held there.Next the contents of the \fn field come (one character at a time). They do not match anything so they also are directed to the output. However, since the store fn is open, they land in the store rather than going on out.@TE ÆI & €5€˜€‚‚ÿNext, the \ln of \ln Smith enters the table. It successfully matches at the \ln entry. The store named fn is opened. This causes the store named fn to be closed. Note that the contents of the fn store remain intact. The matched string is duplicated to the output, and since the store ln is open, it is held there.Next the contents of the \ln field come (one character at a time). They do not match anything so they also are directed to the output. However, since the store ln is open, they land in the store rather than going on out.uO†G ;L & €Ÿ€˜€‚‚ÿWhen the \misc enters the table, it fails to match at the \ln or \fn entries. However, the backslash matches at the \ entry. The contents of the stores ln and fn are output, in that order. The out command causes any open store to first be closed, so the contents of these stores goes to the output.Then the command to open the store fn is given, followed immediately by the command to open the store ln. Opening the ln store causes the fn store to be closed. The effect of these two store commands is to delete the contents of both these stores. The endstore command closes the ln store.f?ÆI ¡N ' €€˜€‚‚‚ÿThe matched string, the \, is then duplicated to the output. Since no store is open at this time, the contents are truly output.After this, the contents of the \misc field comes through the table, one character at a time. None of the characters matches anywhere, so they proceed on to the output.Then the \addr field enters the table. It fails to match at the \ln and \fn entries, but the backslash matches at the \ entry. The contents of the stores ln and fn are output, in that order. However, since both these stores are empty, the command has essentially no effect./ ;L Ü€ & €€˜€‚‚ÿThen the command to open the store fn is given, followed immediately by the command to open the store ln. Opening the ln store causes the fn store to be closed. The effect of these two store commands is to delete the contents of both these stores. The endstore command closes the ln store. Again, since both stor¡N Ü€ ! es were already empty and closed, these commands have essentially no effect.The matched string, the \, is then duplicated to the output. Since no store is open at this time, the contents are truly output.ìÆ¡N È‚ & €€˜€‚‚ÿThis procedure continues for the rest of the fields in the record. They are output with no change being made.At the beginning of the next record, the \fn field is again matched and the marker and its contents are stored in the fn store. Then the marker and contents of the \ln field are captured and held in the ln field. When the next field (backslash) is encountered, these two fields are output in the opposite order. No other fields are affected.O'Ü€ ƒ ( €N€°Œ€ €‚ÿFurther discussion of RearrangementjÈ‚ §„ & €Õ€˜€‚‚ÿThe table above only works because the \ln field immediately follows the \fn. A more general appoach would be to store each field in a separate store, and output the entire record at once. This has the problem of losing data if there are ever duplicate field markers. (Using append would resolve that problem.)The following is another variation on the table. sƒ G… - *€æ€‘€€€‚ÿ'\ln ' > endstore dup'\fn ' > store(fn) dup'\' > out(fn) store(ln) endstore dupA§„ ˆ† + $€-€˜€€€‚ÿThis captures the \fn field and holds it. When the \ln is encountered, it goes to the output, but the \fn is still held until the next field is encountered. This table also depends on knowing that \ln always follows \fn to successfully accomplish the desired rearrangement.:G… † ( €$€°Œ€€‚ÿA common errorgCˆ† )‡ $ €†€˜€‚ÿPeople sometimes try to capture something in a store as follows:M%† v‡ ( €J€‘€€€‚ÿ'\x ' > store(x) dup endstore ...-)‡ £ˆ % €€˜€‚ÿThey (erroneously) believe that the whole contents of the \x field have been captured in store(x). In fact, only the \x marker has been captured. The contents of the \x field will not be processed and sent to the output until after the '\x ' entry is completed.9v‡ ܈ 1k0ÿÿÿÿÿÿÿÿÿÿÿÿ܈ ¬GSwitchesÍ££ˆ ©‰ * "€G€€‚‚€‚‚ÿ3. 4 Switches3.4.1 ConceptThe concept behind using switches is one that is familiar to everyone. The problem is that the concept is not usually formalized.½“܈ f‹ * "€'€Ö€‚‚‚‚‚‚ÿConsider the following statements:If it doesn't rain this morning, I'll water the lawn this evening.If we have hamburgers this noon, I'll make pork chops for supper; otherwise I'll fix hamburgers.If the gate is left open, the dog will run away.If we don't get some gas now, we'll run out.If George forgets to pick up the groceries on his way home from work, we'll have pork and beans for supper.{X©‰ á‹ # €°€€‚ÿEach of these embodies the concept of a switch. If something has or has not happened:žvf‹ Œ ( €ì€Ö€‚‚‚‚‚ÿ - it rains - we eat hamburgers - the gate is left open - we buy gas - George remembers the groceriesS0á‹ ÒŒ # €`€€‚ÿcertain consequences follow or do not follow:¡yŒ s ( €ò€Ö€‚‚‚‚‚ÿ - I water the lawn - we have pork chops - the dog runs away - we run out of gas - we eat pork and beans°€ÒŒ #Ž 0 .€€€€€€€‚ÿThe something that leads to the consequences is the condition. Sometimes the consequences follow if the condition occurs:jFs Ž $ €Œ€Ö€‚ÿIf we have hamburgers this noon, I'll make pork chops for supper...pG#Ž ýŽ ) "€Ž€€€€‚ÿSometimes the consequences follow if the condition does not occur:iEŽ f $ €Š€Ö€‚ÿIf it doesn't rain this morning, I'll water the lawn this evening.ŸvýŽ À ) "€ì€€€€‚ÿOf course, something happens whether the condition is met or not. If nothing else the consequences fail to occf À £ˆ ur:Yf À & €²€Ö€‚‚‚ÿ - I don't water the lawn - The dog doesn't run away - We don't run out of gasQ.À áÀ # €\€€‚ÿSometimes there are alternate consequences:mHÀ NÁ % €€Ö€‚‚ÿ - I fix hamburgers - We eat something other than pork and beansb?áÀ °Á # €~€€‚ÿThe five statements above can be semi-formalized as follows.’hNÁ Bà * "€Ñ€Ö€‚‚‚‚‚‚ÿIf not (rain in the morning) I will water the lawn this evening.If (we have hamburgers at noon) we will have pork chops for supperelse we will have hamburgers for supper.If (the gate is left open) the dog will run away.If not (fill the car with gas) we will run out of gas.If not (George remembers the groceries) we will have pork and beans for supper.Ár°Á Æ O l€å€€€€€€€€€€€€€€€€‚‚ÿIn each case, the parenthesized condition can be regarded as a switch. Switches have only two states: these are called on and off; (true and false; or set and clear).A switch by itself doesn't necessarily do anything. The lack of morning rain does not always result in the lawn being watered. I have to decide that circumstances warrant the lawn being watered. Once that decision is made, then I look about for any conditions that would affect my decision: If it rains, I won't need to water the lawn. Later, I check that condition (or switch). Did it happen? (Is the switch set?) Then I proceed accordingly./Bà 2È ) € €€‚‚‚‚‚‚ÿThe nature of a switch, and its particular value, is that it allows something that happened (or didn't happen) in the past to be taken into account for a decision in the present.For people, remembering the past is no amazing feat; for a computer, remembering the past must be done deliberately. Hence, computers use formal switches3.4.2 What the Commands DoWhat types of switches are available in the CC program? How are they used?There are several commands connected with the switch feature of the CC program:«hÆ ÝÊ C T€Ñ€€€‚€€‚€€‚€€‚ÿset(name) clear(name) if(name) ifn(name) endif else The (name) represents the name of the switch. There can be up to 127 of these in a single table. Other commands may use the same names, but there is no relationship between the names for switches and any other names. Note that the following commands:ifeq(name) 'string' ifneq(name) 'string' ifgt(name) 'string'base their decision on the contents of the named storage area, not the state of a switch. These commands are not described here, but in section 3.4. Do not confuse them with the first list of commands, some of which look very similar.öº2È ÓË < F€u€€€€€€€€€€‚ÿKeep in mind as you read, that the terms set, on, and true are used synonymously with one another. The terms clear, off, and false are also used synonymously with one another.TÝÊ 'Ì 9 B€6€^°¨°‘€s€ €€€€ €‚ÿWhat set(name) doesÕÓË üÍ H ^€€€€€€€€€€€€€€€‚ÿThe command set(name) causes switch (name) to be in the on or true state. Switch (name) will remain set until explicitly cleared. Hence it can be used for reference later as a reminder or signal of what has gone before. The switch is canceled by the clear(name) command. When the CC program is started, and before any table entries are executed, all switches are clear (turned off).V'Ì RÎ 9 B€:€^°¨°‘€s€ €€€€ €‚ÿWhat clear(name) doesHüÍ šÏ H ^€€€€€€€€€€€€€€€‚ÿThe command clear(name) causes switch (name) to be in the off or false state. Switch (name) will remain off until explicitly set. When the CC program is started, and before any table entries are executed, all switches are clear (turned off).WRÎ 9 B€<€^°¨°‘€s€ €€€€ €‚ÿWhat if(name) doesšÏ £ˆ DšÏ P0 .€)€€€€€€‚ÿThe command if(name) checks to see if switch (name) is set. If it is set, the commands following the if are executed. If it is not set, the commands following the if are not executed (are skipped). This allows commands to be executed only if a certain condition exists.X ¨9 B€>€^°¨°‘€s€ €€€€ €‚ÿWhat ifn(name) doesBP8N j€…€€€€€€€€€€€€€€€€‚ÿThe command ifn(name), which is read "if not (name)," checks to see if switch (name) is not set. If it is not set, the commands following the ifn are executed. If the switch is set, the commands following the ifn are skipped. This allows commands to be executed only if a certain condition does not exist.D¨|- *€.€^°¨°‘€s€ €‚ÿWhat endif doesê8* "€Õ€€€€‚ÿThe command endif puts a boundary on the if or ifn command. If the switch was such that the commands following the if or ifn were being skipped, execution of commands will begin again at the endif regardless of the setting of any previous switches. (Of course, another if or ifn may be encountered immediately after the endif which would again take into account switch settings.) If the commands following the if or ifn are being executed, the endif has no effect; execution continues.?|Ï- *€$€^°¨°‘€s€ €‚ÿWhat else doeskF:% €€€‚‚ÿIf switch conditions are such that commands following the most recent if or ifn are being executed, the else command causes the commands following itself to be skipped. If the commands following the if or ifn are being skipped, the else command causes the commands following itself to be executed.In the following example:M%χ( €J€‘€€€‚ÿ"a" > if(test) "a" else "b" endif¿›:F$ €7€€‚ÿIf switch (test) is set, "a" will go to the output. If switch (test) is not set, "b" will go to the output. The same result could have been achieved by:a8‡§) "€p€‘€€€‚ÿ"a" > if(test) "a" endif ifn(test) "b" endifJFñ- *€:€^°¨°‘€s€ €‚ÿAn Example Using SwitchesÍ©§¾ $ €S€€‚ÿFor example, in a bilingual dictionary, one might wish to make certain changes in the orthography of one language without doing anything to the other language. Let's suppose that you had a huge text file that was a bilingual dictionary that a Spanish speaker would use to find the meaning of English words. A text file for such a dictionary might be keyed in with each line preceded by a Standard Format Marker as follows:í¿ñ« . *€€‘€€€‚ÿ\w word in English \p part of speech in Spanish \d definition in Spanish \q qualifying comment in Spanish \i illustrative sentence in English \t trans. of illust. sentence in SpanishrM¾  % €›€€‚‚ÿAnd suppose the orthography change is to be in the English language. Such a change would affect the \w and \i parts of the entry, but not the \p, \d, \q, or \t parts.There are two ways, at least, to approach this problem. One way is to use switches. Another option is to use groups. See section 3.3. Consider the following table:Í”« ê9 @€)€‘€€€‚ÿc Do orthography change begin > caseless c Set switch (qu) to change kw to qu '\w ' > dup set(qu) '\i ' > dup set(qu) c Don't change these fields. c Clear switch (qu) so nothing happens to kw. '\p ' > dup clear(qu) '\d ' > dup clear(qu) '\q ' > dup clear(qu) '\t ' > dup clear(qu) c Change kw to qu for \w and \i 'kw' > if(qu) 'qu' else dup endifO, 9# €X€€‚ÿWhat does this table say? First the line:=êv( €*€‘€€€‚ÿbegin > caseless à9‡@% €Á€€‚‚ÿtells the program to ignore case when it matches. For this table, it means that kw and Kw will be chv‡@£ˆ anged with the same match. Unless it is told otherwise, the program will always consider case when it matches.The lines:}SvA* $€¦€‘€€€‚ÿc Set switch (qu) to change kw to qu '\w ' > dup set(qu) '\i ' > dup set(qu) Ç¢‡@ËA% €E€€‚‚ÿtell the program that whenever it sees \w or \i, it should duplicate what it has matched (dup command) and that it should set switch (qu).The following lines:Ú¬A¥B. *€Y€‘€€€‚ÿc Don't change these fields. c Clear switch (qu) so nothing happens to kw. '\p ' > dup clear(qu) '\d ' > dup clear(qu) '\q ' > dup clear(qu) '\t ' > dup clear(qu) îÉËA“C% €“€€‚‚ÿtell the program that whenever it sees any of the other markers, it should duplicate what it has matched and clear switch (qu), so that switch (qu) will be inactive, in a sense.The following lines:‚W¥BD+ &€®€‘€€€‚ÿc Change kw to qu for \w and \i 'kw' > if(qu) 'qu' else dup endif a<“CvE% €y€€‚‚ÿcontain the orthography change we want performed on the data in the \w and \i fields. They say, whenever a kw is encountered anywhere in the data, check to see if switch (qu) has been set. If it has, change it to qu. Otherwise, duplicate what was matched.Note that this is identical in function to the following:“gD F, (€Î€‘€€€‚ÿc Change kw to qu for \w and \i 'kw' > if(qu) 'qu' endif ifn(qu) dup endif£qvE¬G2 2€ã€€‚‚ã§×þ€#‰€‚ÿThe else command says look at the condition which preceded it and execute the following commands if the condition was not true. The endif command says to do the commands that follow without prejudice.So a switch in itself is something that can be used to allow the changes table to affect data or not affect data, depending on its condition.Arithmetic CommandsF FòG1ZÿÿÿÿÿÿÿÿÿÿÿÿòGNUsing a Changes TableÛ«¬GÍI0 .€W€€‚€‚‚€ €‚ÿ1.3 Using a Changes TableThis section assumes that you have copied the file CC.EXE from the program diskette into your current directory or into a directory that has been included in your DOS path.To run CC, type CC followed by ENTER and the program will prompt you for the changes table file name and the names of the output and input files. The parameters for CC may all be included on the command line. For example:^0òG+J. ,€`€‘€€€€€‚ÿ cc -t table.cct -o out.txt in.txt 2 ÍI]L& €€€‚‚‚ÿIn the example above, the changes file (TABLE.CCT0 is marked by the -t command line parameter. The output file (OUT.TXT) marked by -o is the file CC will create as it applies the changes to the input file. The input file (IN.TXT) contains the text you want changed.The CC program doesn't change the input text file. It creates a new text file like your original input file, except the changes specified in the changes table have been made to it. So, in the end you will have a "before" and "after" version of your file.©k+JN> J€×€€€€ €€‚‚ãSúä€ ‰€‚ÿIf for any reason you need to stop the program after it has started, press CTRL+C. If you are sending the output to a printer, a few more lines may continue to print because the printer holds some of the information internally before printing it.See section 2.5 for a description of other command line options available.Consistent Changes Description4]L:N1™ÿÿÿÿÿÿÿÿ ÿÿÿÿ:NŸNadde?NŸN& €~€€€‚ÿadd(name) 'number' add numeric string to area name4:NÓN1—ÿÿÿÿÿÿÿÿ!ÿÿÿÿÓN6Oanyc=ŸN6O& €z€€€‚ÿany(name) match any element of storage area name7ÓNmO1¡ÿÿÿÿÿÿÿÿ"ÿÿÿÿmO €appendjD6O €& €ˆ€€€‚ÿappend(name) store in area name, keep previous contentsmO €6O5mOA€1àÿÿÿÿÿÿÿÿ#ÿÿÿÿA€°€backoI €°€& €’€€€‚ÿback(number) put last number of chars output back into input6A€æ€1’ÿÿÿÿÿÿÿÿ$ÿÿÿÿæ€Bbegin\6°€B& €l€€€‚ÿbegin beginning of table or nested block7æ€y1“ÿÿÿÿÿÿÿÿ%ÿÿÿÿyÕbinary\6BÕ& €l€€€‚ÿbinary handle input data as a binary file2y‚1nÿÿÿÿÿÿÿÿ&ÿÿÿÿ‚C‚c<ÕC‚& €,€€€‚ÿc comment9‚|‚1œÿÿÿÿÿÿÿÿ'ÿÿÿÿ|‚ß‚caselessc=C‚ß‚& €z€€€‚ÿcaseless ignore case of first character of match6|‚ƒ1†ÿÿÿÿÿÿÿÿ(ÿÿÿÿƒeƒclearP*ß‚eƒ& €T€€€‚ÿclear(name) clear switch name5ƒšƒ1™ÿÿÿÿÿÿÿÿ)ÿÿÿÿšƒþƒcontd>eƒþƒ& €|€€€‚ÿcont(name) match or compare contents of area name2šƒ0„1‚ÿÿÿÿÿÿÿÿ*ÿÿÿÿ0„€„dP*þƒ€„& €T€€€‚ÿd treat as decimal ASCII code50„µ„1ÿÿÿÿÿÿÿÿ+ÿÿÿÿµ„…decrZ4€„…& €h€€€‚ÿdecr Decrements the named store by one.7µ„F…1œÿÿÿÿÿÿÿÿ,ÿÿÿÿF…«…definee?…«…& €~€€€‚ÿdefine(name) defines a set of commands called name4F…ß…1—ÿÿÿÿÿÿÿÿ-ÿÿÿÿß…B†divc=«…B†& €z€€€‚ÿdiv(name) divide value in name by numeric string3ß…u†1’ÿÿÿÿÿÿÿÿ.ÿÿÿÿu†Ô†do_9B†Ô†& €r€€€‚ÿdo(name) execute set of commands called name; u†‡1Åÿÿÿÿÿÿÿÿ/ÿÿÿÿ‡™‡doublebyteŠ^Ô†™‡, (€¼€€€€€‚ÿdoublebyte(num1,num2) treat qualifying pairs of bytes as one doublebyte element4‡͇1ÿÿÿÿÿÿÿÿ0ÿÿÿÿ͇ˆdupM'™‡ˆ& €N€€€‚ÿdup duplicate match string5͇Oˆ1qÿÿÿÿÿÿÿÿ1ÿÿÿÿOˆ‹ˆelse<ˆ‹ˆ& €,€€€‚ÿelse else4Oˆ¿ˆ1{ÿÿÿÿÿÿÿÿ2ÿÿÿÿ¿ˆ‰endG!‹ˆ‰& €B€€€‚ÿend end nested block8¿ˆ>‰1“ÿÿÿÿÿÿÿÿ3ÿÿÿÿ>‰™‰endfile[5‰™‰& €j€€€‚ÿendfile match or output end of file char6>‰ω1Šÿÿÿÿÿÿÿÿ4ÿÿÿÿω#ŠendifT.™‰#Š& €\€€€‚ÿendif end of conditional commands9ω\Š1€ÿÿÿÿÿÿÿÿ5ÿÿÿÿ\Š£ŠendstoreG!#Š£Š& €B€€€‚ÿendstore end storing5\ŠØŠ1•ÿÿÿÿÿÿÿÿ6ÿÿÿÿØŠ8‹excl`:£Š8‹& €t€€€‚ÿexcl(name) exclude (make inactive) group name 4ØŠl‹1—ÿÿÿÿÿÿÿÿ7ÿÿÿÿl‹Ï‹folc=8‹Ï‹& €z€€€‚ÿfol(name) if following character is in area name4l‹Œ1¢ÿÿÿÿÿÿÿÿ8ÿÿÿÿŒqŒfwdnHÏ‹qŒ& €€€€‚ÿfwd(number) forward number of characters (does not process)6Œ§Œ1’ÿÿÿÿÿÿÿÿ9ÿÿÿÿ§Œgroup\6qŒ& €l€€€‚ÿgroup(name) specifies a group called name3§Œ61„ÿÿÿÿÿÿÿÿ:ÿÿÿÿ6‡ifQ+‡& €V€€€‚ÿif(name) if switch name is set56¼1 ÿÿÿÿÿÿÿÿ;ÿÿÿÿ¼'ŽifeqkE‡'Ž& €Š€€€‚ÿifeq(name)’string’ if contents of area name equal string5¼\Ž1¡ÿÿÿÿÿÿÿÿ<ÿÿÿÿ\ŽÈŽifgtlF'ŽÈŽ& €Œ€€€‚ÿifgt(name)'string' if contents of area name exceed string5\ŽýŽ1¶ÿÿÿÿÿÿÿÿ=ÿÿÿÿýŽ~ifltIÈŽ~8 @€’€€€€€€€€€‚ÿiflt(name) 'string' IF STORE name IS LESS THAN string.4ýŽ²1Šÿÿÿÿÿÿÿÿ>ÿÿÿÿ²ÀifnV0~À& €`€€€‚ÿifn(name) if switch name is no²À~t set6²JÀ1Äÿÿÿÿÿÿÿÿ?ÿÿÿÿJÀÁÀifneqwEÀÁÀ2 4€Š€€€€€€€‚ÿifneq(name) 'string' negative of ifeq(name) 'string'6JÀ÷À1¿ÿÿÿÿÿÿÿÿ@ÿÿÿÿ÷À€Áifngt‰QÁÀ€Á8 @€¢€€€€€€€€€‚ÿifngt(name) 'string' IF STORE name IS NOT GREATER THAN string.6÷À¶Á1¼ÿÿÿÿÿÿÿÿAÿÿÿÿ¶Á<Âifnlt†N€Á<Â8 @€œ€€€€€€€€€‚ÿifnlt(name) 'string' IF STORE name IS NOT LESS THAN string.9¶ÁuÂ1àÿÿÿÿÿÿÿÿBÿÿÿÿuÂÃifsubset§o<ÂÃ8 @€Þ€€€€€€€€€‚ÿifsubset(name) 'string' compares a named store to see if it is a subset of the given string5uÂQÃ1ÿÿÿÿÿÿÿÿCÿÿÿÿQìÃincl[5ìÃ& €j€€€‚ÿincl(name) include (activate) group name5QÃáÃ1›ÿÿÿÿÿÿÿÿDÿÿÿÿáÃGÄincrf@¬ÃGÄ& €€€€€‚ÿincr(name) add one to contents of storage area name4áÃ{Ä1žÿÿÿÿÿÿÿÿEÿÿÿÿ{ÄåÄlenj>GÄåÄ, (€|€€€€€‚ÿlen(name) provides the length of a named store4{ÄÅ1²ÿÿÿÿÿÿÿÿFÿÿÿÿÅ—Åmod~XåÄ—Å& €°€€€‚ÿmod(name)'number' remainder when value in name is divided by numeric string4ÅËÅ1®ÿÿÿÿÿÿÿÿGÿÿÿÿËÅEÆmulzT—ÅEÆ& €¨€€€‚ÿmul(name)'number' product of value in name multiplied by numeric string 5ËÅzÆ1‹ÿÿÿÿÿÿÿÿHÿÿÿÿzÆÐÆnextV0EÆÐÆ& €`€€€‚ÿnext perform commands in next entry3zÆÇ1ÿÿÿÿÿÿÿÿIÿÿÿÿÇQÇnlN(ÐÆQÇ& €P€€€‚ÿnl match or output new line5džÇ1žÿÿÿÿÿÿÿÿJÿÿÿÿ†ÇïÇomitiCQÇïÇ& €†€€€‚ÿomit(number) omit next number of characters from input8†Ç'È1¤ÿÿÿÿÿÿÿÿKÿÿÿÿ'È“ÈoptionslFïÇ“È& €Œ€€€‚ÿoptions command line switches to turn on run time options4'ÈÇÈ1‰ÿÿÿÿÿÿÿÿLÿÿÿÿÇÈÉoutU/“ÈÉ& €^€€€‚ÿout(name) output storage area name5ÇÈQÉ1—ÿÿÿÿÿÿÿÿMÿÿÿÿQɳÉoutsb<ɳÉ& €x€€€‚ÿouts(name) output area name (storing continues)5QÉèÉ1™ÿÿÿÿÿÿÿÿNÿÿÿÿèÉLÊprecd>³ÉLÊ& €|€€€‚ÿprec(name) if preceding character is in area name5èÉÊ1…ÿÿÿÿÿÿÿÿOÿÿÿÿÊÑÊreadP*LÊÑÊ& €T€€€‚ÿread read input from keyboard7ÊË1ŒÿÿÿÿÿÿÿÿPÿÿÿÿË]ËrepeatU/ÑÊ]Ë& €^€€€‚ÿrepeat repeat from preceding begin4Ë‘Ë1€ÿÿÿÿÿÿÿÿQÿÿÿÿ‘ËÝËsetL&]ËÝË& €L€€€‚ÿset(name) set switch name6‘ËÌ1¢ÿÿÿÿÿÿÿÿRÿÿÿÿÌÌstorelFÝËÌ& €Œ€€€‚ÿstore(name) store in area name (discard previous contents)7̶Ì1¹ÿÿÿÿÿÿÿÿSÿÿÿÿ¶Ì8Ístring‚VÌ8Í, (€¬€€€€€‚ÿ'string' literal string of: literal strings, nl's, and ASCII characters4¶ÌlÍ1¢ÿÿÿÿÿÿÿÿTÿÿÿÿlÍÚÍsubnH8ÍÚÍ& €€€€‚ÿsub(name)'number' subtract numeric string from value in name4lÍÎ1œÿÿÿÿÿÿÿÿUÿÿÿÿÎvÎtabhBÚÍvÎ& €„€€€‚ÿtab provides a tab, much like nl provides a new line4ΪÎ1†ÿÿÿÿÿÿÿÿVÿÿÿÿªÎüÎuseR,vÎüÎ& €X€€€‚ÿuse(name) use group called name3ªÎ/Ï1¢ÿÿÿÿÿÿÿÿWÿÿÿÿ/ÏžÏwdoIüΞÏ& €’€€€‚ÿwd(name) if characters before and after in storage area name 6/ÏÔÏ1ŽÿÿÿÿÿÿÿÿXÿÿÿÿÔÏ8writeX2žÏ8& €d€€€‚ÿwriteÔÏ8žÏ'string' output string to screen8ÔÏp1›ÿÿÿÿÿÿÿÿYÿÿÿÿpÓwrstorec=8Ó& €z€€€‚ÿwrstore(name) output storage area name to screen2p1†ÿÿÿÿÿÿÿÿZÿÿÿÿYxT.ÓY& €\€€€‚ÿx treat as hexadecimal ASCII code1ÿÿÿÿ1ÿÿÿÿÿÿÿÿ[ÿÿÿÿÿÿÿÿÿÿÿÿ2 ) y'| HelvSystemMS SerifMS Sans SerifCourierSymbolMarlettArialCourier NewTimes New RomanWingdingsTahomaHaettenschweilerArial NarrowArial BlackBookman Old StyleMonotype SortsMap SymbolsGaramondImpactMS OutlookComic Sans MSBookshelf Symbol 3Albertus MediumAlbertus Extra BoldAntique OliveCG OmegaCG TimesClarendon CondensedCoronetLetter GothicMarigoldUniversUnivers CondensedVerdanaSILDoulos IPA93SILDoulosIPASILManuscript IPA93SILManuscriptIPASILSophia IPA93SILSophiaIPAASAP SILDoulosASAP SILManuscriptASAP SILSophiaPitchContoursIPA HelpTimesHelveticaGenevaTms RmnNew YorkFencesCG Times (W1)Univers (W1)Albertus (W1)Albertus Xb (W1)Antique Olv (W1)CG Omega (W1)Clarendon Cd (W1)Coronet (W1)Courier (W1)Garmond (W1)Letter Gothic (W1)LinePrinterMarigold (W1)Univers Cd (W1)Tahoma CETahoma CyrTahoma GreekTahoma TurTahoma BalticArial Narrow CEArial Narrow CyrArial Narrow GreekArial Narrow TurArial Narrow BalticArial Black CEArial Black CyrArial Black GreekArial Black TurArial Black BalticBookman Old Style CBookman Old Style GBookman Old Style TBookman Old Style BGaramond CEGaramond CyrGaramond GreekGaramond TurGaramond BalticImpact CEImpact CyrImpact GreekImpact TurImpact BalticAlbertus Medium CEAlbertus Medium TurAlbertus Medium BalAntique Olive CEAntique Olive TurAntique Olive BaltiCG Omega CECG Omega TurCG Omega BalticCG Times CECG Times TurCG Times BalticCoronet CECoronet TurLetter Gothic CELetter Gothic TurLetter Gothic BaltiMarigold CEMarigold TurUnivers CEUnivers TurUnivers BalticUnivers Condensed CUnivers Condensed TUnivers Condensed BArial Rounded MT Box   $x xxÿÿxxÿ  ÿxÿÿ  ÿ ”,a  É'‹@ ƒf‹£‹k€äã‡IµËÖ‚ <ƒ™ƒ2¿‚pšÎ J£ƒá?t¢€Ãƒý2Š:€&‚”ë¸ã(n·€E€–€ä€Sˆ> È‚‚^‚²‚â‚ ƒMƒƒ“ƒƒƒþƒÕà <„f„•„ƒ»„œ …W…bŸ…ƒá…Õ… †V†=/&;)i24t_t 1 ifsubsÿÿ`‡`ÿÿÿÿ'''number'(name)(number_charc) -a-i-o-q-t -w$/d(add,Advance Features0Alphabetic Summary of Commands4any8append@Arithmetic CommandsDASCII Codes 90HbackLBack CommandPbeginTbinaryXc\caseless`cleardCommand DescriptionshCommand Line OptionslCommands by Logical GroupingspConsistent Changes DescriptiontcontxCreating a Changes Table€d„decrˆdefineŒdivdo”Double_byte˜doublebyteœdup else¤end¨endfile¬endif°endstore´Error Messages¸excl¼folÀForm of ChangesÈfwdÌGetting StartedÐglossaryÔgroupØGroupsÜHow Changes Are Processedàifäifeqèifgtìifltðifnôifneqøifngtüifnltifsubsetinclincr IntroductionlenManualmodmul next$nl(omit,options0Order of Changes4out8outs<prec@Predefined ConstantsHQuick ReferencesLreadPrepeatTsetXstore\Store CommanddstringhsublSwitchesptabtunsortedxuse|Using a Changes Table€wd„writeˆwrstoreŒxble_byte 0 Double_byte jsm_cc31.RTF 18 24F1F1160 decimal_t 1 decimal_t jsm_cc31.RTF 18 * 4FE9DE2 hex_t 1 hex_t jsm_cc31.RTF 18 .4E2A60CE octal_t 1 octal_t jsm_cc31.RTF 18 <499A0ACD Error_Messages 0 Error_Messages jsm_cc31.RTF 19 * 3872DFF a_d_t 1 a_d_t jsm_cc31.RTF 19 * 423D22F d_i_t 1 d_i_t jsm_cc31.RTF 19 * 528C488 i_m_t 1 i_m_t jsm_cc31.RTF 19 * 5F99AA2 m_s_t 1 m_s_t jsm_cc31.RTF 19 * 732A93A s_u_t 1 s_u_t jsm_cc31.RTF 19 & 10D90 u_t 1 u_t jsm_cc31.RTF 19 * 3872DFF a_d_t 0 a_d_t jsm_cc31.RTF 19 * 423D22F d_i_t 0 d_i_t jsm_cc31.RTF 19 * 528C488 i_m_t 0 i_m_t jsm_cc31.RTF 19 * 5F99AA2 m_s_t 0 m_s_t jsm_cc31.R/&;)Lzÿÿ\[\ÿÿÿÿ'','number'a(name) (number_charc)É/däASCII Codes 90@Advance Features‹All Commands Alphabetic Summary of Commandsk€Arithmetic Commandsã‡Back CommandÖ‚Command Descriptions Command Line Options<ƒCommands by Logical Groupings™Consistent Changes DescriptionCContents¿‚Creating a Changes Table£Double_byte€Error Messages2ŠForm of Changes€Getting Started&Glossary”GroupsëHow Changes are Processed> Introduction‚ManualƒOrder of ChangesÕPredefined Constantsà Quick Referencesœ Store CommandbSwitchesÕ…Using a Changes Table'‹addf‹any£‹appendbackIbeginbinaryµcËcaselessclear2contpdšdecrÎdefine divJdoƒdoublebyteádupelseend?endfiletendif¢endstoreÃexclýfol:fwd‚group¸ifãifeq(ifgtniflt·ifn€ifneqE€ifngt–€ifnltä€ifsubsetSinclˆincrÈlen‚mod^‚mul²‚nextâ‚nl ƒomitMƒoptions“ƒoutƒoutsþƒprec<„readf„repeat•„set»„store…stringW…subŸ…tabá…use †wdV†writewrstore=xk/&;)L4ÿÿÓ`Óÿÿÿÿ}©E„Ð ;‰<… ˜f‡@‡§×þk€Ìϒ㇠R’ш |c–’µ‰ ʸµ•Q„ f¯¿—‚¡™> ¶¬¢›£‹1(œ·Ü(œÆN$(œË€ÝV(œ„Oe(œ)…¥(œ |}@&»G¡“²–¾¢ Q$ö¢;`q¥g áÕò¬ñŒâ¶M¯2Š†w°¿‚⿲<ƒïïž³ sU¢³ÎíɳËf¬[»ëÌQ⽨‹jfÀMƒwAÀ€$ÁƒœAQÅ1Ž [àËrãÖÒÌä€BÆZÍ~† ÜEД…¼ØƒÝ)?ÙÏ QÝÕ…ƒÅíÞƒ4[¥ß Þ§ßv‚ äî­ß½… ¼˜Ìß‹yDáP‹ ÏJDáp Súä™ÝÃÑäã‡Ú ¸è¢ç?¹éQºQÖê&~^ûê|„äóî=iü÷î úïsøïB†W ïø„lp”ðÞ‹W }ó?ï«€óÜhú€ªÿÉüÆŠn=ƒµ̈"›'€(=<CÉ{JI¸&â‚¡ †}?ˆ 9~'‹üf‹k‹„Ž‹•…Ç’ñˆ Í” Ë–áËœ7¤ý‡¥:ä¶{a¸·áÍȾւÈ×^‚:â@ B擃¬ð€v•„W…WVñŸ… „3á…;#Š ¯%X‡ ±§÷ kTþñ2|Þš¶%¹€AJDžÃ”õË éöãB÷(ønV0S\0ˆÃ%²‚É1%Ü… ™q& ƒ9­&ƒŒË'þƒ"Ú)<„,ã/ª€ ^=¸‚ÿ-‡Q†¬ljoeœIaÙ¡œ‚ñ$ÅI\OÌÑ„þµJ á½/Ò#âÀ$pq[-‚ø¾2¿†"A:Š†xl|zlt’¢ ‚bŽ«œ‡«ûÙ‚âþˆÄ(×ì¶3c† A¸3€š¸3E€q¹3–€lÏ ¢šùÑ¡i Û…2 ˆ :©2™V<V‹ ‘hN»„Ç=OÚ ü$kÍ Úyº‡ ®;µ /{V†f¸j rŠ"lx 7†R¾y ÷€ ¾-X ¡ƒ “:v  ’\ ¢ "ŒX‡ Ô0Bä‰_Çx 0R@‚†$3d|ª¨ #YÜ Ü®c] € ñà Ùpñ—ƒÕ¹ (m§ ŠUô%CåH.àƒ g¼Z.f„o(/,U¹9<€­ô.:…üÒç: ¥Òï