Annotation of researchv10dc/cmd/icon/docs/tr86-13.roff, revision 1.1

1.1     ! root        1: .ds l] /usr/lib/bmac
        !             2: 'so \*(l]/bmac.std
        !             3: .de s[   \" start reference
        !             4: .nh
        !             5: .IP \\*([F. 5n
        !             6: ..
        !             7: .\"    RT -  reset everything to normal state
        !             8: .de RT
        !             9: .if !\\n(1T .BG
        !            10: .if !\\n(IK .if !\\n(IF .if !\\n(IX .di
        !            11: .ce 0
        !            12: .ul 0
        !            13: .if \\n(NX=0 .if \\n(AJ=0 .ll \\n(LLu
        !            14: .ps \\n(PS
        !            15: .if \\n(VS>=40 .vs \\n(VSu
        !            16: .if \\n(VS<=39 .vs \\n(VSp
        !            17: .if \\n(IP .in -\\n(IQu
        !            18: .if !\\n(IP .nr IQ \\n(PIu
        !            19: .if \\n(IP .nr IP -1
        !            20: .ft 1
        !            21: .bd 1
        !            22: .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n
        !            23: .fi
        !            24: ..
        !            25: .      \"IZ - initialization
        !            26: .de IZ
        !            27: .if \\n(FM=0 .nr FM 1i
        !            28: .nr YY -\\n(FMu
        !            29: .nr XX 0 1
        !            30: .nr IP 0
        !            31: .nr PI 3n
        !            32: .nr IQ \\n(PIu
        !            33: .nr PS 10
        !            34: .nr VS 12
        !            35: .if !\\n(PD .if n .nr PD 1v
        !            36: .if !\\n(PD .if t .nr PD 0.3v
        !            37: .nr ML 3v
        !            38: .ps \\n(PS
        !            39: .if \\n(VS>40 .vs \\n(VSu
        !            40: .if \\n(VS<=39 .vs \\n(VSp
        !            41: .if \\n(IR=0 .nr IR 5n
        !            42: .nr TB 0
        !            43: .nr SJ \\n(.j
        !            44: .nr LL 6.5i
        !            45: .ll \\n(LLu
        !            46: .nr LT \\n(.l
        !            47: .lt \\n(LTu
        !            48: .ev 1
        !            49: .nr FL \\n(LLu*11u/12u
        !            50: .ll \\n(FLu
        !            51: .ps 8
        !            52: .vs 10p
        !            53: .ev
        !            54: .if \\*(CF .ds CF "\(hy \\\\n(PN \(hy
        !            55: .wh 0 NP
        !            56: .wh -\\n(FMu FO
        !            57: .ch FO 16i
        !            58: .wh -\\n(FMu FX
        !            59: .ch FO -\\n(FMu
        !            60: .wh -\\n(FMu/2u BT
        !            61: ..
        !            62: .de TR \" Tech Report
        !            63: .nr ST 2
        !            64: .pn 0
        !            65: .ds MN \\$1
        !            66: .rm SG
        !            67: .br
        !            68: ..
        !            69: .de GR \" Grant - full
        !            70: .ds GS *
        !            71: .de GX
        !            72: *This work was supported by the National Science Foundation under
        !            73: .if \\n(.$=1 Grant \\$1.
        !            74: .if \\n(.$=2 Grants \\$1 and \\$2.
        !            75: .if \\n(.$=3 Grants \\$1, \\$2, and \\$3.
        !            76: .if \\n(.$=4 Grants \\$1, \\$2, \\$3, and \\$4.
        !            77: \\..
        !            78: ..
        !            79: .de GP \" Grant - part
        !            80: .ds GS *
        !            81: .de GX
        !            82: *This work was supported in part by the National Science Foundation under
        !            83: .if \\n(.$=1 Grant \\$1.
        !            84: .if \\n(.$=2 Grants \\$1 and \\$2.
        !            85: .if \\n(.$=3 Grants \\$1, \\$2, and \\$3.
        !            86: .if \\n(.$=4 Grants \\$1, \\$2, \\$3, and \\$4.
        !            87: \\..
        !            88: ..
        !            89: .      \"TL - title and initialization
        !            90: .de TL
        !            91: .br
        !            92: .nr TV 1
        !            93: .ME
        !            94: .rm ME
        !            95: .di WT
        !            96: .nr SJ \\n(.j
        !            97: .na
        !            98: .fi
        !            99: .ll 3.75i
        !           100: .ft 3
        !           101: .ps 10
        !           102: .hy 0
        !           103: ..
        !           104: .de TX
        !           105: .rs
        !           106: .sp .5i
        !           107: .ce 1000
        !           108: .ps 12
        !           109: .ft 3
        !           110: .vs 15p
        !           111: .if n .vs 1P
        !           112: .ne 4
        !           113: .hy 0
        !           114: .WT
        !           115: .hy 14
        !           116: .ce 0
        !           117: ..
        !           118: .de TY
        !           119: .di XT
        !           120: .ll 3.75i
        !           121: .fi
        !           122: .hy 0
        !           123: .WT
        !           124: \h'-\w' 'u'\\*(GS
        !           125: .hy 14
        !           126: .nf
        !           127: .di
        !           128: .ll \\n(LLu
        !           129: .ce 1000
        !           130: .ps 12
        !           131: .ft 3
        !           132: .if t .vs 15p
        !           133: .if n .vs 1P
        !           134: .ne 4
        !           135: .XT
        !           136: .ce 0
        !           137: ..
        !           138: .      \"      AU - author(s)
        !           139: .de AU
        !           140: .nr AV 1
        !           141: .ad \\n(SJ
        !           142: .br
        !           143: .di
        !           144: .br
        !           145: .nf
        !           146: .nr NA +1
        !           147: .ds R\\n(NA \\$1
        !           148: .ds E\\n(NA \\$2
        !           149: .di A\\n(NA
        !           150: .ll \\n(LLu
        !           151: .if t .ft 2
        !           152: .if n .ft 1
        !           153: .ps 10
        !           154: ..
        !           155: .de AX
        !           156: .ft 1
        !           157: .rs
        !           158: .ce 1000
        !           159: .ps 10
        !           160: .vs 12p
        !           161: .if n .sp 2
        !           162: .if t .sp
        !           163: .A1
        !           164: .if n .sp
        !           165: .if t .sp 0.5
        !           166: .ns
        !           167: .I1
        !           168: .if \\n(NA-1 .if n .sp 2
        !           169: .if \\n(NA-1 .if t .sp
        !           170: .A2
        !           171: .if \\n(NA-1 .if n .sp
        !           172: .if \\n(NA-1 .if t .sp 0.5
        !           173: .ns
        !           174: .I2
        !           175: .if \\n(NA-2 .if t .sp
        !           176: .if \\n(NA-2 .if n .sp 2
        !           177: .A3
        !           178: .if \\n(NA-2 .if t .sp 0.5
        !           179: .if \\n(NA-2 .if n .sp
        !           180: .ns
        !           181: .I3
        !           182: .if \\n(NA-3 .if t .sp
        !           183: .if \\n(NA-3 .if n .sp 2
        !           184: .A4
        !           185: .if \\n(NA-3 .if t .sp 0.5
        !           186: .if \\n(NA-3 .if n .sp
        !           187: .ns
        !           188: .I4
        !           189: .if \\n(NA-4 .if t .sp
        !           190: .if \\n(NA-4 .if n .sp 2
        !           191: .A5
        !           192: .if \\n(NA-4 .if n .sp
        !           193: .if \\n(NA-4 .if t .sp 0.5
        !           194: .ns
        !           195: .I5
        !           196: .if \\n(NA-5 .if t .sp
        !           197: .if \\n(NA-5 .if n .sp 2
        !           198: .A6
        !           199: .if \\n(NA-5 .if n .sp
        !           200: .if \\n(NA-5 .if t .sp 0.5
        !           201: .ns
        !           202: .I6
        !           203: .if \\n(NA-6 .if t .sp
        !           204: .if \\n(NA-6 .if n .sp 2
        !           205: .A7
        !           206: .if \\n(NA-6 .if n .sp
        !           207: .if \\n(NA-6 .if t .sp 0.5
        !           208: .ns
        !           209: .I7
        !           210: .if \\n(NA-7 .if t .sp
        !           211: .if \\n(NA-7 .if n .sp 2
        !           212: .A8
        !           213: .if \\n(NA-7 .if n .sp
        !           214: .if \\n(NA-7 .if t .sp 0.5
        !           215: .ns
        !           216: .I8
        !           217: .if \\n(NA-8 .if t .sp
        !           218: .if \\n(NA-8 .if n .sp 2
        !           219: .A9
        !           220: .if \\n(NA-8 .if n .sp
        !           221: .if \\n(NA-8 .if t .sp 0.5
        !           222: .ns
        !           223: .I9
        !           224: ..
        !           225: .      \"AI - authors institution
        !           226: .de AI
        !           227: .br
        !           228: .ft 1
        !           229: .di
        !           230: .di I\\n(NA
        !           231: .nf
        !           232: ..
        !           233: .      \"AB - begin an abstract
        !           234: .de AB
        !           235: .br
        !           236: .di
        !           237: .ul 0
        !           238: .ce 0
        !           239: .nr 1T 1
        !           240: .nr IK 1
        !           241: .nr KI 1
        !           242: .di WB
        !           243: .rs
        !           244: .nr AJ 1
        !           245: .ce 1
        !           246: .ft 2
        !           247: .if n .ul
        !           248: .ll \\n(LLu
        !           249: .if \\n(.$=0 ABSTRACT
        !           250: .if \\n(.$>0 .if !"\\$1"-" .if !"\\$1"no"  \\$1
        !           251: .if \\n(.$=0 .sp
        !           252: .if \\n(.$>0 .if !"\\$1"-" .if !"\\$1"no" .sp
        !           253: .hy 14
        !           254: .ul 0
        !           255: .ce 0
        !           256: .fi
        !           257: .ft 1
        !           258: .nr OJ \\n(.i
        !           259: .in +\\n(.lu/12u
        !           260: .ll -\\n(.lu/12u
        !           261: .br
        !           262: .ps \\n(PS
        !           263: .if \\n(VS>40 .vs \\n(VSu
        !           264: .if \\n(VS<=39 .vs \\n(VSp
        !           265: .ti +\\n(PIu
        !           266: ..
        !           267: .      \"AE - end of an abstract
        !           268: .de AE
        !           269: .br
        !           270: .di
        !           271: .ll \\n(LLu
        !           272: .ps \\n(PS
        !           273: .if \\n(VS>40 .vs \\n(VSu
        !           274: .if \\n(VS<=39 .vs \\n(VSp
        !           275: .nr 1T 0
        !           276: .nr IK 0
        !           277: .in \\n(OJu
        !           278: .nr AJ 0
        !           279: .di
        !           280: .ce 0
        !           281: .if \\n(ST=2 .SY
        !           282: .if \\n(ST<3 .rm SY
        !           283: ..
        !           284: .      \"S2 - tech report style
        !           285: .      \"SY - cover sheet of released paper
        !           286: .de SY
        !           287: .ch FO 16i
        !           288: .ch FX 16i
        !           289: .ll \\n(LLu
        !           290: .rs
        !           291: .sp |13P
        !           292: .ns
        !           293: .if \\n(TV .TY
        !           294: .if \\n(AV .AX
        !           295: .rs
        !           296: .sp |22P
        !           297: .if !'\\*(MN'' TR \\*(MN
        !           298: .ce 0
        !           299: .nf
        !           300: .sp |28P
        !           301: .ls 1
        !           302: .ll -\\n(.lu/12u
        !           303: .WB
        !           304: .ll \\n(LLu
        !           305: .ls
        !           306: .ce 1000
        !           307: .sp |8i
        !           308: \\*(DY
        !           309: .sp 2
        !           310: Department of Computer Science
        !           311: .sp 1
        !           312: The University of Arizona
        !           313: .sp 1
        !           314: Tucson, Arizona 85721
        !           315: .ce 0
        !           316: .sp |10i
        !           317: .na
        !           318: .fi
        !           319: .GX
        !           320: .br
        !           321: ..
        !           322: .      \"S2 - first text page, released paper format
        !           323: .de S2
        !           324: .ce 0
        !           325: .br
        !           326: .SY
        !           327: .rm SY
        !           328: .bp 1
        !           329: .if \\n(TV .TX
        !           330: .rs
        !           331: .ce 0
        !           332: .ft 1
        !           333: .ad \\n(SJ
        !           334: ..
        !           335: .      \"S0- mike lesk conserve paper style
        !           336: .de S0
        !           337: .ce 0
        !           338: .br
        !           339: .ll \\n(LLu
        !           340: .if \\n(TV+\\n(AV>0 .ns
        !           341: .if \\n(TV .TX
        !           342: .if \\n(AV .AX
        !           343: .if \\n(TV+\\n(AV>0 .rs
        !           344: .ce 0
        !           345: .nf
        !           346: .if \\n(TV>0 .sp 2
        !           347: .ls 1
        !           348: .WB
        !           349: .ls
        !           350: .fi
        !           351: .ad \\n(SJ
        !           352: ..
        !           353: .      \"SG - signature
        !           354: .de SG
        !           355: .br
        !           356: .KS
        !           357: .in +2u*\\n(.lu/3u
        !           358: .sp 2
        !           359: .A1
        !           360: .if \\n(NA-1 .sp 2
        !           361: .A2
        !           362: .if \\n(NA-2 .sp 2
        !           363: .A3
        !           364: .if \\n(NA-3 .sp 2
        !           365: .A4
        !           366: .if \\n(NA-4 .sp 2
        !           367: .A5
        !           368: .if \\n(NA>5 .sp 2
        !           369: .A6
        !           370: .if \\n(NA>6 .sp 2
        !           371: .A7
        !           372: .if \\n(NA>7 .sp 2
        !           373: .A8
        !           374: .if \\n(NA>8 .sp 2
        !           375: .A9
        !           376: .in
        !           377: .nf
        !           378: .sp -1
        !           379: .if \\n(.$>=1 \\$1
        !           380: .if \\n(.$>=2 \\$2
        !           381: .if \\n(.$>=3 \\$3
        !           382: .if \\n(.$>=4 \\$4
        !           383: .if \\n(.$>=5 \\$5
        !           384: .if \\n(.$>=6 \\$6
        !           385: .if \\n(.$>=7 \\$7
        !           386: .if \\n(.$>=8 \\$8
        !           387: .if \\n(.$>=9 \\$9
        !           388: .fi
        !           389: .br
        !           390: .KE
        !           391: ..
        !           392: .      \"Tables.  TS - table start, TE - table end
        !           393: .de TS
        !           394: .br
        !           395: .if !\\n(1T .RT
        !           396: .ul 0
        !           397: .ti \\n(.iu
        !           398: .if t .sp 0.5
        !           399: .if n .sp
        !           400: .if \\$1H .TQ
        !           401: .nr IX 1
        !           402: ..
        !           403: .de TQ
        !           404: .di TT
        !           405: .nr IT 1
        !           406: ..
        !           407: .de TH
        !           408: .if \\n(.d>0.5v .nr T. 0
        !           409: .if \\n(.d>0.5v .T# 0
        !           410: .di
        !           411: .nr TQ \\n(.i
        !           412: .nr HT 1
        !           413: .in 0
        !           414: .TT
        !           415: .in \\n(TQu
        !           416: .mk #T
        !           417: ..
        !           418: .de TE
        !           419: .nr IX 0
        !           420: .if \\n(IT>0 .if \\n(HT=0 .di
        !           421: .if \\n(IT>0 .if \\n(HT=0 .nr EF \\n(.u
        !           422: .if \\n(IT>0 .if \\n(HT=0 .nf
        !           423: .if \\n(IT>0 .if \\n(HT=0 .TT
        !           424: .if \\n(IT>0 .if \\n(HT=0 .if \\n(EF>0 .fi
        !           425: .nr IT 0
        !           426: .nr HT 0
        !           427: .if n .sp 1
        !           428: .if t .sp 0.5
        !           429: ..
        !           430: .      \"DS - display.  If .DS C, center; L, left-adjust; I, indent.
        !           431: .de DS
        !           432: .KS
        !           433: .\\$1D \\$2 \\$1
        !           434: ..
        !           435: .de D
        !           436: .ID \\$1
        !           437: ..
        !           438: .de CD
        !           439: .ce 1000
        !           440: .XD
        !           441: ..
        !           442: .de ID
        !           443: .XD
        !           444: .if t .in +0.5i
        !           445: .if n .in +8
        !           446: .if \\n(.$ .if !"\\$1"I" .in \\n(OIu
        !           447: .if \\n(.$ .if !"\\$1"I" .in +\\$1n
        !           448: ..
        !           449: .de LD
        !           450: .XD
        !           451: ..
        !           452: .de XD
        !           453: .nf
        !           454: .nr OI \\n(.i
        !           455: .if t .sp 0.5
        !           456: .if n .sp 1
        !           457: ..
        !           458: .de BD \" block display: save everything, then center it.
        !           459: .XD
        !           460: .nr BD 1
        !           461: .nr RD 2
        !           462: .di DD
        !           463: ..
        !           464: .de RD \" right block display: save everything, then right adjust it.
        !           465: .XD
        !           466: .nr BD 1
        !           467: .nr RD 1
        !           468: .di DD
        !           469: ..
        !           470: .      \"DE - display end
        !           471: .de DE
        !           472: .ce 0
        !           473: .in \\n(OIu
        !           474: .if t .sp 0.5
        !           475: .if n .sp 1
        !           476: .if \\n(BD>0 .DF
        !           477: .nr BD 0
        !           478: .KE
        !           479: .fi
        !           480: ..
        !           481: .de DF \" finish a block display to be recentered.
        !           482: .di
        !           483: .if \\n(dl>\\n(BD .nr BD \\n(dl
        !           484: .if \\n(BD<\\n(.l .in (\\n(.lu-\\n(BDu)/\\n(RDu
        !           485: .ta \\n(.luR
        !           486: .DD
        !           487: .in \\n(OIu
        !           488: ..
        !           489: .      \"KS keep - for keep release features. As in IFM
        !           490: .de KS
        !           491: .if \\n(IK=0 .if \\n(IF=0 .KQ
        !           492: .nr IK +1
        !           493: ..
        !           494: .      \"KQ - real keep processor
        !           495: .de KQ
        !           496: .br
        !           497: .nr KI \\n(.i
        !           498: .ev 2
        !           499: .br
        !           500: .in \\n(KIu
        !           501: .ps \\n(PS
        !           502: .if \\n(VS>40 .vs \\n(VSu
        !           503: .if \\n(VS<=39 .vs \\n(VSp
        !           504: .ll \\n(LLu
        !           505: .lt \\n(LTu
        !           506: .if \\n(NX>0 .ll \\n(CWu
        !           507: .if \\n(NX>0 .lt \\n(CWu
        !           508: .di KK
        !           509: .nr TB 0
        !           510: ..
        !           511: .      \"KF - floating keep
        !           512: .de KF
        !           513: .if !\\n(IK .FQ
        !           514: .nr IK +1
        !           515: ..
        !           516: .      \"FQ real floating keep processor
        !           517: .de FQ
        !           518: .nr KI \\n(.i
        !           519: .ev 2
        !           520: .br
        !           521: .in \\n(KIu
        !           522: .ps \\n(PS
        !           523: .if \\n(VS>40 .vs \\n(VSu
        !           524: .if \\n(VS<=39 .vs \\n(VSp
        !           525: .ll \\n(LLu
        !           526: .lt \\n(LTu
        !           527: .if \\n(NX>0 .ll \\n(CWu
        !           528: .if \\n(NX>0 .lt \\n(CWu
        !           529: .di KK
        !           530: .nr TB 1
        !           531: ..
        !           532: .      \"KE release - everything between keep and release is together
        !           533: .de KE
        !           534: .if \\n(IK .if !\\n(IK-1 .if \\n(IF=0 .RQ
        !           535: .if \\n(IK .nr IK -1
        !           536: ..
        !           537: .      \"RQ real release
        !           538: .de RQ
        !           539: .br
        !           540: .di
        !           541: .nr NF 0
        !           542: .if \\n(dn-\\n(.t .nr NF 1
        !           543: .if \\n(TC .nr NF 1
        !           544: .if \\n(NF .if !\\n(TB .sp 200
        !           545: .if !\\n(NF .if \\n(TB .nr TB 0
        !           546: .nf
        !           547: .\".rs
        !           548: .nr TC 5
        !           549: .in 0
        !           550: .ls 1
        !           551: .if \\n(TB=0 .ev
        !           552: .if \\n(TB=0 .br
        !           553: .if \\n(TB=0 .ev 2
        !           554: .if \\n(TB=0 .KK
        !           555: .ls
        !           556: .ce 0
        !           557: .if \\n(TB=0 .rm KK
        !           558: .if \\n(TB .da KJ
        !           559: .if \\n(TB \!.KD \\n(dn
        !           560: .if \\n(TB .KK
        !           561: .if \\n(TB .di
        !           562: .nr TC \\n(TB
        !           563: .fi
        !           564: .in
        !           565: .ev
        !           566: ..
        !           567: .de EQ \"equation, breakout and display
        !           568: .nr EF \\n(.u
        !           569: .rm EE
        !           570: .nr LE 1       \" 1 is center
        !           571: .ds EL \\$1
        !           572: .if "\\$1"L" .ds EL \\$2
        !           573: .if "\\$1"L" .nr LE 0
        !           574: .if "\\$1"C" .ds EL \\$2
        !           575: .if "\\$1"I" .nr LE 0
        !           576: .if "\\$1"I" .ds EE \\h'|10n'
        !           577: .if "\\$1"I" .if !"\\$3"" .ds EE \\h'\\$3'
        !           578: .if "\\$1"I" .ds EL \\$2
        !           579: .if \\n(YE>0 .nf
        !           580: .di EZ
        !           581: ..
        !           582: .de EN \" end of a displayed equation
        !           583: .br
        !           584: .di
        !           585: .rm EZ
        !           586: .nr ZN \\n(dn
        !           587: .if \\n(ZN>0 .if \\n(YE=0 .LP
        !           588: .if \\n(ZN=0 .if !"\\*(EL"" .nr ZN 1
        !           589: .if "\\n(.z"" .if \\n(ZN>0 .if !\\n(nl=\\n(PE .if t .sp .5
        !           590: .if "\\n(.z"" .if \\n(ZN>0 .if !\\n(nl=\\n(PE .if n .sp 1
        !           591: .if !"\\n(.z"" .if \\n(ZN>0 .if !\\n(.d=\\n(PE .if t .sp .5
        !           592: .if !"\\n(.z"" .if \\n(ZN>0 .if !\\n(.d=\\n(PE .if n .sp 1
        !           593: .pc
        !           594: .if \\n(BD>0 .nr LE 0 \" can't mean centering in this case.
        !           595: .lt \\n(.lu
        !           596: .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE>0 .tl \(ts\(ts\\*(10\(ts\\*(EL\(ts
        !           597: .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD=0 .tl \(ts\\*(EE\\*(10\(ts\(ts\\*(EL\(ts
        !           598: .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 .if \\n(BD<\\w\(ts\\*(10\(ts .nr BD \\w\(ts\\*(10\(ts
        !           599: .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 \!\\*(10\\\\t\\*(EL
        !           600: .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE>0 .tl \(ts\\*(EL\(ts\\*(10\(ts\(ts
        !           601: .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD=0 .tl \(ts\\*(EL\\*(EE\\*(10\(ts\(ts\(ts
        !           602: .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 .if \\n(BD<\\w\(ts\\*(10\(ts .nr BD \\w\(ts\\*(10\(ts
        !           603: .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 \!\\h'-\\\\n(.iu'\\*(EL\\h'|0'\\*(10
        !           604: .\".di EZ \" GCOS patch
        !           605: .\"\\*(10 \" GCOS patch
        !           606: .\".br \" GCOS patch
        !           607: .\".di \" GCOS patch
        !           608: .\".rm EZ \" GCOS patch
        !           609: .lt \\n(LLu
        !           610: .pc %
        !           611: .if \\n(YE>0 .if \\n(EF>0 .fi
        !           612: .rm EL
        !           613: .rm 10
        !           614: .rm 11
        !           615: .rm 12
        !           616: .rm 13
        !           617: .rm 14
        !           618: .rm 15
        !           619: .rm 16
        !           620: .rm 17
        !           621: .rm 18
        !           622: .rm 19
        !           623: .rm 20
        !           624: .rm 21
        !           625: .rm 22
        !           626: .rm 23
        !           627: .if \\n(ZN>0 .if t .sp .5
        !           628: .if \\n(ZN>0 .if n .sp
        !           629: .if "\\n(.z"" .nr PE \\n(nl
        !           630: .if !"\\n(.z"" .nr PE \\n(.d
        !           631: ..
        !           632: .de ME
        !           633: .nr SJ \\n(.j
        !           634: .if \\n(LL>0 .nr LT \\n(LL
        !           635: .nr YE 1
        !           636: .if \\n(PO=0 .nr PO \\n(.o
        !           637: ..
        !           638: .      \"EM end up macro - process left over keep-release
        !           639: .de EM
        !           640: .br
        !           641: .if \\n(TB=0 .if t .if \\nd=0 .wh -1p CM
        !           642: .if \\n(TB \&\c
        !           643: .if \\n(TB 'bp
        !           644: .if \\n(TB .NP
        !           645: .if \\n(TB .ch CM 160
        !           646: ..
        !           647: .      \"NP new page
        !           648: .de NP
        !           649: .if \\n(FM+\\n(HM>=\\n(.p .tm Margins bigger than page length.
        !           650: .if \\n(FM+\\n(HM>=\\n(.p .ab
        !           651: .if \\n(FM+\\n(HM>=\\n(.p .ex
        !           652: .nr PX \\n(.s
        !           653: .nr PF \\n(.f
        !           654: .if t .if \\nd=0 .CM
        !           655: .if \\n(HM=0 .nr HM 1i
        !           656: 'sp \\n(HMu/2u
        !           657: .lt \\n(LTu
        !           658: .ps \\n(PS
        !           659: .ft 1
        !           660: .PT
        !           661: .ps \\n(PX
        !           662: .ft \\n(PF
        !           663: 'sp |\\n(HMu
        !           664: .nr XX 0 1
        !           665: .nr YY 0-\\n(FMu
        !           666: .ch FO 16i
        !           667: .ch FX 17i
        !           668: .ch FO -\\n(FMu
        !           669: .ch FX -\\n(FMu
        !           670: .if \\n(MF .FV
        !           671: .nr MF 0
        !           672: .mk
        !           673: .os
        !           674: .ev 1
        !           675: .if \\n(TD=0 .if \\n(TC<5  .XK
        !           676: .nr TC 0
        !           677: .ns
        !           678: .ev
        !           679: .nr TQ \\n(.i
        !           680: .if \\n(IT>0 .in 0
        !           681: .if \\n(IT>0 .TT
        !           682: .if \\n(IT>0 .in \\n(TQu
        !           683: .mk #T
        !           684: .if \\n(PO>0 .po \\n(POu
        !           685: .if t .if \\n(.o+\\n(LL>7.75i .tm Offset + line length exceeds 7.75 inches, too wide
        !           686: ..
        !           687: .de XK
        !           688: .nr TD 1
        !           689: .nf
        !           690: .ls 1
        !           691: .in 0
        !           692: .rn KJ KL
        !           693: .KL
        !           694: .rm KL
        !           695: .if "\\n(.z"KJ" .di
        !           696: .nr TB 0
        !           697: .if "\\n(.z"KJ" .nr TB 1
        !           698: .br
        !           699: .in
        !           700: .ls
        !           701: .fi
        !           702: .nr TD 0
        !           703: ..
        !           704: .de KD
        !           705: .nr KM 0
        !           706: .if "\\n(.z"KJ" .nr KM 1 \" KM is 1 if in a rediversion of keeps
        !           707: .if \\n(KM>0 \!.KD \\$1
        !           708: .if \\n(KM=0 .if \\n(.t<\\$1 .di KJ
        !           709: ..
        !           710: .de PT
        !           711: .lt \\n(LLu
        !           712: .pc %
        !           713: .nr PN \\n%
        !           714: .if \\n%-1 .tl '\\*(LH'\\*(CH'\\*(RH'
        !           715: .lt \\n(.lu
        !           716: ..
        !           717: .      \"FO - footer of page
        !           718: .de FO
        !           719: .rn FO FZ
        !           720: .if \\n(K1>0 .tm This memo has a multi-page cover sheet.  You are
        !           721: .if \\n(K1>0 .tm rebuked in the name of the Committee on Technical Memoranda.
        !           722: .if \\n(IT>0 .nr T. 1
        !           723: .if \\n(IT>0 .if \\n(FC=0  .T# 1
        !           724: .if \\n(IT>0 .br
        !           725: .nr FC +1
        !           726: .if !\\n(NX .nr WF 0
        !           727: .nr dn 0
        !           728: .if \\n(FC<=1 .if \\n(XX .XF
        !           729: .rn FZ FO
        !           730: .nr MF 0
        !           731: .if \\n(dn  .nr MF 1
        !           732: .if !\\n(WF .nr YY 0-\\n(FMu
        !           733: .if !\\n(WF .ch FO \\n(YYu
        !           734: .if !\\n(dn .nr WF 0
        !           735: .if \\n(FC<=1 .if \\n(XX=0  .if \\n(NX>0 .RC
        !           736: .if \\n(FC<=1 .if \\n(XX=0  .if \\n(NX<=0 'bp
        !           737: .nr FC -1
        !           738: .if \\n(ML>0 .ne \\n(MLu
        !           739: ..
        !           740: .      \"2C - begin double column
        !           741: .de 2C
        !           742: .if !\\n(1T .if n .sp 4
        !           743: .if !\\n(1T .if t .sp 2
        !           744: .RT
        !           745: .if \\n(NX=0 .mk
        !           746: .if \\n(NX=0 .nr NC 1
        !           747: .hy 12
        !           748: .if \\n(L1=0 .nr L1 \\n(.l
        !           749: .nr NX 1
        !           750: .if \\n(CW=0 .nr CW \\n(.l*7/15
        !           751: .ll \\n(CWu
        !           752: .nr FL \\n(CWu*11u/12u
        !           753: .if \\n(GW=0 .nr GW \\n(L1-(2*\\n(CW)
        !           754: .nr RO \\n(CW+\\n(GW
        !           755: .ns
        !           756: ..
        !           757: .de RC
        !           758: .if \\n(NC>1 .C2
        !           759: .if \\n(NC<=1 .C1
        !           760: .nr NC \\n(ND
        !           761: ..
        !           762: .de C1
        !           763: .rt
        !           764: .po +\\n(ROu
        !           765: .nr ND 2
        !           766: .nr XX 0 1
        !           767: .if \\n(MF .FV
        !           768: .ev 1
        !           769: .if \\n(TB .XK
        !           770: .nr TC 0
        !           771: .ev
        !           772: .ns
        !           773: ..
        !           774: .ch FO \\n(YYu
        !           775: .de C2
        !           776: .po \\n(POu
        !           777: 'bp
        !           778: .nr ND 1
        !           779: ..
        !           780: .      \"1C - return to single column format
        !           781: .de 1C
        !           782: .br
        !           783: .RT
        !           784: .po \\n(POu
        !           785: .nr ND 1
        !           786: .if \\n(NX>0 .ll \\n(L1u
        !           787: .if \\n(NX>0 .bp
        !           788: .nr NX 0
        !           789: .hy 14
        !           790: ..
        !           791: .      \".de R3
        !           792: .      \".pl 102
        !           793: .      \".nr LT \\n(.l
        !           794: .      \"..
        !           795: .de BT
        !           796: .nr PX \\n(.s
        !           797: .nr PF \\n(.f
        !           798: .ft 1
        !           799: .ps \\n(PS
        !           800: 'lt \\n(LTu
        !           801: .if \\n%>0 .tl '\\*(LF'\\*(CF'\\*(RF'
        !           802: .ft \\n(PF
        !           803: .ps \\n(PX
        !           804: ..
        !           805: .      \"PP - paragraph
        !           806: .de PP
        !           807: .RT
        !           808: .ne 1.1
        !           809: .if \\n(1T .sp \\n(PDu
        !           810: .ti +\\n(PIu
        !           811: ..
        !           812: .      \"SH - (unnumbered) section heading
        !           813: .de SH
        !           814: .RT
        !           815: .if \\n(1T .sp 1
        !           816: .if !\\n(1T .BG
        !           817: .RT
        !           818: .ne 4
        !           819: .ft 3
        !           820: .if n .cu 1000
        !           821: ..
        !           822: .      \"NH - numbered heading
        !           823: .de NH
        !           824: .RT
        !           825: .if \\n(1T .sp 1
        !           826: .if \\n(1T .if !\\n(.$ .sp 1
        !           827: .if !\\n(1T .BG
        !           828: .RT
        !           829: .ne 4
        !           830: .ft 3
        !           831: .if n .cu 1000
        !           832: .nr NS \\$1
        !           833: .if !\\n(.$ .nr NS 1
        !           834: .if !\\n(NS .nr NS 1
        !           835: .nr H\\n(NS +1
        !           836: .if !\\n(NS-4 .nr H5 0
        !           837: .if !\\n(NS-3 .nr H4 0
        !           838: .if !\\n(NS-2 .nr H3 0
        !           839: .if !\\n(NS-1 .nr H2 0
        !           840: .if !\\$1 .if \\n(.$ .nr H1 1
        !           841: .ds SN \\n(H1.
        !           842: .if \\n(NS-1 .as SN \\n(H2
        !           843: .if \\n(NS-2 .as SN .\\n(H3
        !           844: .if \\n(NS-3 .as SN .\\n(H4
        !           845: .if \\n(NS-4 .as SN .\\n(H5
        !           846: .nr IQ \w'\\*(SN\ \ '
        !           847: .nr IP +1
        !           848: .in +\\n(IQu
        !           849: .ti -\\n(IQu
        !           850: .nf
        !           851: \\*(SN\ \ \\c
        !           852: ..
        !           853: .      \"BG - begin, execute at first PP
        !           854: .de BG
        !           855: .br
        !           856: .ME
        !           857: .rm ME
        !           858: .di
        !           859: .ce 0
        !           860: .nr KI 0
        !           861: .hy 14
        !           862: .nr 1T 1
        !           863: .S\\n(ST
        !           864: .rm S0
        !           865: .rm S2
        !           866: .rm TX
        !           867: .rm AX
        !           868: .rm WT
        !           869: .rm XT
        !           870: .rm GR
        !           871: .rm GP
        !           872: .rm GS
        !           873: .rm GX
        !           874: .rm I1
        !           875: .rm I2
        !           876: .rm I3
        !           877: .rm I4
        !           878: .rm I5
        !           879: .rm CB
        !           880: .rm E1
        !           881: .rm E2
        !           882: .de TL
        !           883: .ft 3
        !           884: .sp
        !           885: .ce 100
        !           886: .LG
        !           887: \\..
        !           888: .de AU
        !           889: .ft 2
        !           890: .ce 100
        !           891: .sp
        !           892: .NL
        !           893: \\..
        !           894: .de AI
        !           895: .ft 1
        !           896: .ce 100
        !           897: .if n .sp
        !           898: .if t .sp .5
        !           899: .NL
        !           900: \\..
        !           901: .RA
        !           902: .rm RA
        !           903: .rn FJ FS
        !           904: .rn FK FE
        !           905: .nf
        !           906: .if \\n(KG=0 .nr FP 0 \"KI should be new
        !           907: .nr KG 0 \"KI should be new
        !           908: .if \\n(FP>0 .FS
        !           909: .if \\n(FP>0 .FG
        !           910: .if \\n(FP>0 .FE
        !           911: .br
        !           912: .if \\n(TV>0 .if n .sp 2
        !           913: .if \\n(TV>0 .if t .sp 1
        !           914: .fi
        !           915: .ll \\n(LLu
        !           916: ..
        !           917: .de RA \"redefine abstract macros
        !           918: .de AB
        !           919: .br
        !           920: .if !\\n(1T .BG
        !           921: .ce 1
        !           922: .sp 1
        !           923: ABSTRACT
        !           924: .sp 1
        !           925: .nr AJ 1
        !           926: .in +\\n(.lu/12u
        !           927: .ll -\\n(.lu/12u
        !           928: .RT
        !           929: \\..
        !           930: .de AE
        !           931: .nr AJ 0
        !           932: .br
        !           933: .in 0
        !           934: .ll \\n(LLu
        !           935: .if \\n(VS>40 .vs \\n(VSu
        !           936: .if \\n(VS<=39 .vs \\n(VSp
        !           937: \\..
        !           938: ..
        !           939: .      \"IP - indented paragraph
        !           940: .de IP
        !           941: .RT
        !           942: .if !\\n(IP .nr IP +1
        !           943: .sp \\n(PDu
        !           944: .ne 3v
        !           945: .if \\n(.$-1 .nr IQ \\$2n
        !           946: .if \\n(.$ .LB "\\$1"
        !           947: .if !\\n(.$ .LB
        !           948: ..
        !           949: .      \"LP - left aligned (block) paragraph
        !           950: .de LP
        !           951: .ti \\n(.iu
        !           952: .RT
        !           953: .if \\n(1T .sp \\n(PDu
        !           954: .ne 1.1
        !           955: .if \\n(.$ .LB \\$1
        !           956: ..
        !           957: .      \"IE - synonym for .LP
        !           958: .de IE
        !           959: .LP
        !           960: ..
        !           961: .      \"LB - label paragraph
        !           962: .de LB
        !           963: .in +\\n(IQu
        !           964: .ta \\n(IQu
        !           965: .if \\n(.$ .ti -\\n(IQu
        !           966: .if \\n(.$ \\$1\t\c
        !           967: ..
        !           968: .      \"RS - prepare for double indenting
        !           969: .de RS
        !           970: .in +\\n(IRu
        !           971: ..
        !           972: .      \"RE - retreat to the left
        !           973: .de RE
        !           974: .br
        !           975: .in -\\n(IRu
        !           976: ..
        !           977: .      \"CM - cut mark
        !           978: .de CM
        !           979: .po 0
        !           980: .\"lt 7i
        !           981: .ft 1
        !           982: .ps 10
        !           983: .vs 4p
        !           984: .\"tl '--''--'
        !           985: .tl '---'''
        !           986: .po
        !           987: .vs
        !           988: .\"lt
        !           989: .ps
        !           990: .ft
        !           991: ..
        !           992: .      \"B - bold font
        !           993: .de B
        !           994: .nr PQ \\n(.f
        !           995: .if n .if \\n(.$>2 \\&\\$3\\c
        !           996: .if "\\$1"" .if n .ul 1000
        !           997: .if !"\\$1"" .if n .ul 1
        !           998: .if t .if !"\\$1"" \\$3\\fB\\$1\\f\\n(PQ\\$2
        !           999: .if n .if \\n(.$=1 \\$1
        !          1000: .if n .if \\n(.$>1 \\$1\\c
        !          1001: .if n .if \\n(.$>1 \\&\\$2
        !          1002: ..
        !          1003: .      \"R - Roman font
        !          1004: .de R
        !          1005: .if n .ul 0
        !          1006: .ft 1
        !          1007: ..
        !          1008: .      \"I - italic font
        !          1009: .de I
        !          1010: .nr PQ \\n(.f
        !          1011: .if n .if \\n(.$>2 \\&\\$3\\c
        !          1012: .if "\\$1"" .if n .ul 1000
        !          1013: .if !"\\$1"" .if n .ul 1
        !          1014: .if t .if !"\\$1"" \\$3\\fI\\$1\\f\\n(PQ\\$2
        !          1015: .if n .if \\n(.$=1 \\$1
        !          1016: .if n .if \\n(.$>1 \\$1\\c
        !          1017: .if n .if \\n(.$>1 \\&\\$2
        !          1018: ..
        !          1019: .      \"TA - tabs set in ens or chars
        !          1020: .de TA
        !          1021: .ta \\$1n \\$2n \\$3n \\$4n \\$5n \\$6n \\$7n \\$8n \\$9n
        !          1022: ..
        !          1023: .      \"SM - make smaller size
        !          1024: .de SM
        !          1025: .ps -2
        !          1026: ..
        !          1027: .      \"LG - make larger size
        !          1028: .de LG
        !          1029: .ps +2
        !          1030: ..
        !          1031: .      \"NL - return to normal size
        !          1032: .de NL
        !          1033: .ps \\n(PS
        !          1034: ..
        !          1035: .      \"DA - force date; ND - no date or new date.
        !          1036: .de DA
        !          1037: .ds DY \\$1
        !          1038: ..
        !          1039: .if \n(mo-0 .ds MO January
        !          1040: .if \n(mo-1 .ds MO February
        !          1041: .if \n(mo-2 .ds MO March
        !          1042: .if \n(mo-3 .ds MO April
        !          1043: .if \n(mo-4 .ds MO May
        !          1044: .if \n(mo-5 .ds MO June
        !          1045: .if \n(mo-6 .ds MO July
        !          1046: .if \n(mo-7 .ds MO August
        !          1047: .if \n(mo-8 .ds MO September
        !          1048: .if \n(mo-9 .ds MO October
        !          1049: .if \n(mo-10 .ds MO November
        !          1050: .if \n(mo-11 .ds MO December
        !          1051: .if \n(dw-0 .ds DW Sunday
        !          1052: .if \n(dw-1 .ds DW Monday
        !          1053: .if \n(dw-2 .ds DW Tuesday
        !          1054: .if \n(dw-3 .ds DW Wednesday
        !          1055: .if \n(dw-4 .ds DW Thursday
        !          1056: .if \n(dw-5 .ds DW Friday
        !          1057: .if \n(dw-6 .ds DW Saturday
        !          1058: .ds DY \*(MO \n(dy, 19\n(yr
        !          1059: .IZ
        !          1060: .rm IZ
        !          1061: .rm MO
        !          1062: .de FN
        !          1063: .FS
        !          1064: ..
        !          1065: .      \"FS - begin footnote
        !          1066: .de FJ
        !          1067: 'ce 0
        !          1068: .di
        !          1069: .ev1
        !          1070: .ll \\n(FLu
        !          1071: .da FF
        !          1072: .br
        !          1073: .if \\n(IF>0 .tm Footnote within footnote-illegal.
        !          1074: .nr IF 1
        !          1075: .if !\\n+(XX-1 .FA
        !          1076: ..
        !          1077: .      \"FE - footnote end
        !          1078: .de FK
        !          1079: .br
        !          1080: .in 0
        !          1081: .nr IF 0
        !          1082: .di
        !          1083: .ev
        !          1084: .if !\\n(XX-1 .nr dn +\\n(.v
        !          1085: .nr YY -\\n(dn
        !          1086: .if \\n(NX=0 .nr WF 1
        !          1087: .if \\n(dl>\\n(CW .nr WF 1
        !          1088: .if (\\n(nl+\\n(.v)<=(\\n(.p+\\n(YY) .ch FO \\n(YYu
        !          1089: .if (\\n(nl+\\n(.v)>(\\n(.p+\\n(YY) .if \\n(nl>(\\n(HM+1.5v) .ch FO \\n(nlu+\\n(.vu
        !          1090: .if (\\n(nl+\\n(.v)>(\\n(.p+\\n(YY) .if \\n(nl>(\\n(HM+1.5v) .ch FX 16i
        !          1091: .if (\\n(nl+\\n(.v)>(\\n(.p+\\n(YY) .if \\n(nl<=(\\n(HM+1.5v) .ch FO \\n(HMu+(4u*\\n(.vu)
        !          1092: ..
        !          1093: .\"    First page footer.
        !          1094: .de FS
        !          1095: .ev1
        !          1096: .br
        !          1097: .ll \\n(FLu
        !          1098: .da FG
        !          1099: ..
        !          1100: .de FE
        !          1101: .br
        !          1102: .di
        !          1103: .nr FP \\n(dn
        !          1104: .if \\n(1T=0 .nr KG 1 \";not in abstract repeat next page. KI should be new
        !          1105: .ev
        !          1106: ..
        !          1107: .de FA
        !          1108: .if n __________________________
        !          1109: .if t \l'1i'
        !          1110: .br
        !          1111: ..
        !          1112: .de FV
        !          1113: .FS
        !          1114: .nf
        !          1115: .ls 1
        !          1116: .FY
        !          1117: .ls
        !          1118: .fi
        !          1119: .FE
        !          1120: ..
        !          1121: .de FX
        !          1122: .if \\n(XX>0 .di FY
        !          1123: .if \\n(XX>0 .ns
        !          1124: ..
        !          1125: .de XF
        !          1126: .if \\n(nlu+1v>(\\n(.pu-\\n(FMu) .ch FX \\n(nlu+1.9v
        !          1127: .ev1
        !          1128: .nf
        !          1129: .ls 1
        !          1130: .FF
        !          1131: .rm FF
        !          1132: .nr XX 0 1
        !          1133: .br
        !          1134: .ls
        !          1135: .di
        !          1136: .fi
        !          1137: .ev
        !          1138: ..
        !          1139: .de FL
        !          1140: .ev1
        !          1141: .nr FL \\$1n
        !          1142: .ll \\$1
        !          1143: .ev
        !          1144: ..
        !          1145: .de UL \" underline argument, don't italicize
        !          1146: .if t \\$1\l'|0\(ul'\\$2
        !          1147: .if n .I \\$1 \\$2
        !          1148: ..
        !          1149: .em EM
        !          1150: . \"  ACCENTS  say \*'e or \*`e to get e acute or e grave
        !          1151: .ds ' \h'\w'e'u*4/10'\z\(aa\h'-\w'e'u*4/10'
        !          1152: .ds ` \h'\w'e'u*4/10'\z\(ga\h'-\w'e'u*4/10'
        !          1153: . \"  UMLAUT  \*:u, etc.
        !          1154: .ds : \v'-0.6m'\h'(1u-(\\n(.fu%2u))*0.13m+0.06m'\z.\h'0.2m'\z.\h'-((1u-(\\n(.fu%2u))*0.13m+0.26m)'\v'0.6m'
        !          1155: . \" TILDE and CIRCUMFLEX
        !          1156: .ds ^ \\k:\h'-\\n(.fu+1u/2u*2u+\\n(.fu-1u*0.13m+0.06m'\z^\h'|\\n:u'
        !          1157: .ds ~ \\k:\h'-\\n(.fu+1u/2u*2u+\\n(.fu-1u*0.13m+0.06m'\z~\h'|\\n:u'
        !          1158: .      \" czech v symbol
        !          1159: .ds C \\k:\\h'+\\w'e'u/4u'\\v'-0.6m'\\s6v\\s0\\v'0.6m'\\h'|\\n:u'
        !          1160: .              \" cedilla
        !          1161: .ds , \\k:\\h'\\w'c'u*0.4u'\\z,\\h'|\\n:u'
        !          1162: .if n .ds oq ""
        !          1163: .if n .ds cq ""
        !          1164: .if n .ds OQ '
        !          1165: .if n .ds CQ '
        !          1166: .if n .ds em --
        !          1167: .if t .ds oq ``
        !          1168: .if t .ds cq ''
        !          1169: .if t .ds OQ `
        !          1170: .if t .ds CQ '
        !          1171: .if t .ds em \(em
        !          1172: .if n .na
        !          1173: .if t .if \nd=0 .ss 4
        !          1174: .if t .if \nd=1 .ss 10
        !          1175: .if t .if \nd=2 .ss 12
        !          1176: .if n .po 1i
        !          1177: .if t .if \\nd=3 .po 1.0625i
        !          1178: .if t .if \\nd=3 .nr PO 1.0625i
        !          1179: .ds Ag a\(ga
        !          1180: .ds At a\(um
        !          1181: .ds Cd \o'c,'
        !          1182: .ds Ea e\(aa
        !          1183: .ds Eg e\(ga
        !          1184: .ds Ic i\(cf\h'-\w'.'u'\^\^\^
        !          1185: .ds Na n\(aa
        !          1186: .ds Ol o\(um
        !          1187: .ds Oo \s-2\v'-8u'o\v'8u'\s+2
        !          1188: .ds eA E\(aa
        !          1189: .ds mi -
        !          1190: .if t .if !\nd .nr T. 1
        !          1191: .ie \n(T. .ds M \fM
        !          1192: .el .ds M \fB
        !          1193: .if \nd .ds v+ \v'.25m'
        !          1194: .if \nd .ds v- \v'-.25m'
        !          1195: .ds ra >\^
        !          1196: .ds lS \\*(v-+\(mi\(mi\(mi\\*(v+
        !          1197: .ds rS \\*(v-\(mi\(mi\(mi\\*(ra
        !          1198: .ds rE \\*(v+
        !          1199: .ds CF \s10\fR\- \\n(PN \-\s0\fP
        !          1200: .de dU
        !          1201: .sp -.65
        !          1202: ..
        !          1203: .de dD
        !          1204: .sp -.2
        !          1205: ..
        !          1206: .de Nt
        !          1207: .Ds
        !          1208: .ta 2.7i
        !          1209: icon-project.arizona@csnet-relay       \fR(CSNET or ARPANET)\fP
        !          1210: arizona!icon-project   \fR(Usenet and uucpnet)
        !          1211: .De
        !          1212: There are currently uucp connections to Arizona through
        !          1213: \*Mnoao\fR, \*Mmcnc\fR, \*Mihnp4\fR, and \*Mutah-cs\fR.
        !          1214: ..
        !          1215: .ds U UNIX\u\s-2*\s0\d
        !          1216: .de Un
        !          1217: .FS
        !          1218: \u\s-2*\s0\dUNIX is a trademark of AT&T Bell Laboratories.
        !          1219: .FE
        !          1220: ..
        !          1221: .if \nv .ss 10
        !          1222: .hy 14
        !          1223: .de Gr
        !          1224: .GR DCR-8401831
        !          1225: ..
        !          1226: .de Gi
        !          1227: .GR DCR-8502015
        !          1228: ..
        !          1229: .de Gs
        !          1230: .GR DCR-8401831 DCR-8502015
        !          1231: ..
        !          1232: .de Nh
        !          1233: .sp -.8
        !          1234: .NH
        !          1235: ..
        !          1236: .de Wd
        !          1237: .ll 7.8i
        !          1238: .lt 7.8i
        !          1239: .nr LL 7.8i
        !          1240: .nr LT 7.8i
        !          1241: ..
        !          1242: .de Pf
        !          1243: .nr VS 20
        !          1244: .vs 20
        !          1245: ..
        !          1246: .de do
        !          1247: .if '\\$1'' .in +.5i
        !          1248: .if !'\\$1'' .in +\\$1
        !          1249: .vs 6p
        !          1250: \&.
        !          1251: \&.\\$2
        !          1252: \&.
        !          1253: .vs
        !          1254: .in
        !          1255: ..
        !          1256: .de Ve
        !          1257: .nf
        !          1258: .sp -.5
        !          1259: .do .74i
        !          1260: ..
        !          1261: .de tR
        !          1262: .de SY
        !          1263: .ch FO 16i
        !          1264: .ch FX 16i
        !          1265: .ll \\n(LLu
        !          1266: .rs
        !          1267: .sp |13P
        !          1268: .ns
        !          1269: .if \\n(TV .TY
        !          1270: .if \\n(AV .AX
        !          1271: .rs
        !          1272: .sp |22P
        !          1273: .if !'\\*(MN'' \\*(MN
        !          1274: .ce 0
        !          1275: .nf
        !          1276: .sp |28P
        !          1277: .ls 1
        !          1278: .ll -\\n(.lu/12u
        !          1279: .WB
        !          1280: .ll \\n(LLu
        !          1281: .ls
        !          1282: .ce 1000
        !          1283: .sp |8i
        !          1284: \\*(DY
        !          1285: .sp 2
        !          1286: Department of Computer Science
        !          1287: .sp 1
        !          1288: The University of Arizona
        !          1289: .sp 1
        !          1290: Tucson, Arizona 85721
        !          1291: .ce 0
        !          1292: .sp |10i
        !          1293: .na
        !          1294: .fi
        !          1295: .GX
        !          1296: .br
        !          1297: ..
        !          1298: ..
        !          1299: .ds d \s+5\fR\&.\h'-1.5p'\fP\s-5
        !          1300: .ds t  
        !          1301: .ds >= >=
        !          1302: .ds >: >:
        !          1303: .ds >> >>
        !          1304: .ds <= <=
        !          1305: .ds <: <:
        !          1306: .ds << <<
        !          1307: .ds <- <-
        !          1308: .ds -> ->
        !          1309: .ds <> <->
        !          1310: .if n .fp 4 M c1
        !          1311: .ds cf ^
        !          1312: .ds fm '
        !          1313: .ds sl /
        !          1314: .ds v \fR|\fP
        !          1315: .ds b \|
        !          1316: .ds El \fR.\^.\^.\fP
        !          1317: .ds sd \s8\v'.2m'\h'-0.4n'
        !          1318: .ds su \v'-.2m'\s0
        !          1319: .ds 0 \fIexpr\fP
        !          1320: .ds 1 \fIexpr\*(sd1\*(su\fP
        !          1321: .ds 2 \fIexpr\*(sd2\*(su\fP
        !          1322: .ds 3 \fIexpr\*(sd3\*(su\fP
        !          1323: .ds 4 \fIexpr\*(sd4\*(su\fP
        !          1324: .ds 5 \fIexpr\*(sd5\*(su\fP
        !          1325: .ds i \fIexpr\*(sdi\*(su\fP
        !          1326: .ds n \fIexpr\*(sdn\*(su\fP
        !          1327: .ds z \fIexpr\*(sd0\*(su\fP
        !          1328: .de Ds
        !          1329: .DS
        !          1330: .tr -\\-'\\(fm/\\(sl
        !          1331: .ie \n(T. .ss9
        !          1332: .el .ss 20
        !          1333: .Ta
        !          1334: .In
        !          1335: .if t \\*M\c
        !          1336: ..
        !          1337: .de De
        !          1338: .ie \n(T. .ss4
        !          1339: .el .ss 10
        !          1340: .DE
        !          1341: .ft R
        !          1342: .tr -\\*(mi'\\*(fm/\\*(sl
        !          1343: ..
        !          1344: .de Dd
        !          1345: .De
        !          1346: .sp -.4
        !          1347: .Ds
        !          1348: ..
        !          1349: .de Ua
        !          1350: Technical Report \\$1, Department of Computer Science, The University of Arizona.
        !          1351: ..
        !          1352: .de
        !          1353: .if \nv .ss 10
        !          1354: .if \nv .rm CM
        !          1355: .de Li
        !          1356: .Sd
        !          1357: .de Ta
        !          1358: .ta 3i
        !          1359: \\..
        !          1360: .de Ti
        !          1361: .ce 10
        !          1362: \f3\\\\$1\f1
        !          1363: .ce 0
        !          1364: .sp 2
        !          1365: .ds RF \s10\*(DY\s0
        !          1366: .ds LF \s10\\\\$3\s0
        !          1367: 'so \\\\$2
        !          1368: .bp
        !          1369: \\..
        !          1370: ..
        !          1371: .de Sd
        !          1372: .am Ds
        !          1373: .ps 8
        !          1374: .vs 10
        !          1375: .nr PS 8
        !          1376: .nr VS 10
        !          1377: \\..
        !          1378: .am De
        !          1379: .nr VS 12
        !          1380: .nr PS 10
        !          1381: .vs 12
        !          1382: .ps 10
        !          1383: \\..
        !          1384: ..
        !          1385: .de Qs
        !          1386: .br
        !          1387: .ps -1p
        !          1388: .vs -1p
        !          1389: .in +5n
        !          1390: .ll -5n
        !          1391: .sp
        !          1392: ..
        !          1393: .de Qe
        !          1394: .br
        !          1395: .ps +1p
        !          1396: .vs +1p
        !          1397: .in -5n
        !          1398: .ll +5n
        !          1399: .sp
        !          1400: ..
        !          1401: .de Qd
        !          1402: .Qe
        !          1403: .sp -.7
        !          1404: .Qs
        !          1405: ..
        !          1406: .de Ap
        !          1407: .bp
        !          1408: .ce 10
        !          1409: \f3\\$1\f1
        !          1410: .ce 0
        !          1411: .sp 2
        !          1412: .if !''\\$2' .so \\$2
        !          1413: ..
        !          1414: .if \nd=3 .po 1.0625i
        !          1415: .if \nd=3 .nr PO 1.0625i
        !          1416: .if \nd=3 .ds M \fH
        !          1417: .de CS
        !          1418: .cs H 22
        !          1419: .ft H
        !          1420: ..
        !          1421: .de CE
        !          1422: .cs H
        !          1423: .ft R
        !          1424: ..
        !          1425: .DA "June 4, 1986"
        !          1426: .TR 86-13a
        !          1427: .Gr
        !          1428: .TL
        !          1429: The Icon Program Library; Version 6.0
        !          1430: .AU
        !          1431: Ralph E. Griswold
        !          1432: .AE
        !          1433: .tr *\(**
        !          1434: .SH
        !          1435: Introduction
        !          1436: .PP
        !          1437: This version of the Icon program library is intended for use with
        !          1438: Version 6.0 of Icon.
        !          1439: Basic documentation for Version 6 of Icon is contained in the Icon book\*([<\*([[1\*(]]\*(>]
        !          1440: and a supplementary report\*([<\*([[2\*(]]\*(>].
        !          1441: .PP
        !          1442: The library contains both complete programs and collections
        !          1443: of procedures. The programs range from demonstrations and games to
        !          1444: text-processing utilities. The procedures range from straightforward
        !          1445: extensions to Icon's function repertoire to such
        !          1446: relatively esoteric subjects as programmer-defined control operations.
        !          1447: This manual is divided into two main parts according to the
        !          1448: composition of the library:
        !          1449: complete programs and collections of procedures.
        !          1450: .PP
        !          1451: While the library provides some useful application programs and
        !          1452: components that may be helpful in building other programs, it also
        !          1453: provides examples of Icon programming techniques. In particular, persons
        !          1454: who are new to Icon may find it helpful to read the source code for
        !          1455: the library to see how experienced persons program in Icon. While
        !          1456: not all of the code is the best possible \(em far from it \(em
        !          1457: it illustrates useful idioms and a variety programming techniques.
        !          1458: .PP
        !          1459: In the descriptions that follow, there are pointers to interesting
        !          1460: programming techniques as well as several suggestions for
        !          1461: extensions and improvements to programs.
        !          1462: Such extensions are good exercises
        !          1463: persons who are just starting in Icon. Some of these extensions, however, will
        !          1464: challenge the most experienced Icon programmer.
        !          1465: .SH
        !          1466: Library Format
        !          1467: .PP
        !          1468: The root directory of the library is \*Mipl\fR (``Icon program library'').
        !          1469: There are four subdirectories: \*Msource\fR, \*Mprogs\fR, \*Mprocs\fR,
        !          1470: and \*Mdata\fR.
        !          1471: The subdirectory \*Msource\fR contains Icon source code for both
        !          1472: programs and procedure libraries. Compiled programs are in \*Mprogs\fR
        !          1473: and translated procedures are in \*Mprocs\fR.
        !          1474: The subdirectory \*Mdata\fR contains sample input for programs in
        !          1475: \*Mprogs\fR. The names of programs and data files generally
        !          1476: coincide, with the extensions of data files providing some
        !          1477: differentiating identification. For example, the data file
        !          1478: \*Mcsgen.abc\fR is input to the program \*Mcsgen\fR. There are
        !          1479: also several files with the extension \*M.txt\fR
        !          1480: that contain English-language text
        !          1481: that is suitable as input to any of the programs
        !          1482: that process text files.
        !          1483: .SH
        !          1484: Disclaimer
        !          1485: .PP
        !          1486: The material contained in the Icon program library is provided on
        !          1487: an as-is basis. No claim is made that the programs are free of error
        !          1488: or that they will function properly.
        !          1489: The responsibility for the use of library material resides entirely
        !          1490: with the user.
        !          1491: .PP
        !          1492: Notes of errors will be appreciated and corrections will be incorporated
        !          1493: in future releases of the library.
        !          1494: .SH
        !          1495: New Material
        !          1496: .PP
        !          1497: Additions are made to the Icon program library from time to time.
        !          1498: New material
        !          1499: is welcome. Such material should be sent to:
        !          1500: .DS
        !          1501: .ft R
        !          1502: Icon Project
        !          1503: Department of Computer Science
        !          1504: The University of Arizona
        !          1505: Tucson, AZ   87521
        !          1506: .DE
        !          1507: Documentation similar in form to that provided in this manual \fImust\fR
        !          1508: be included and test data should be provided where appropriate.
        !          1509: The final decision on inclusion of material in the library resides
        !          1510: with the Icon Project.
        !          1511: .SH
        !          1512: Acknowledgements
        !          1513: .PP
        !          1514: Several persons have contributed programs and procedures to the
        !          1515: Icon program library.
        !          1516: In addition to the author of this manual, these persons include
        !          1517: Allan Anderson, Ward Cunningham, Tom Hicks, William
        !          1518: Malloy, Bill Mitchell, Mike Novak, Randal Schwartz,
        !          1519: Steve Wampler, and George Yee. See the source files for specific attributions.
        !          1520: .ds CH \s10Programs\s0
        !          1521: .bp
        !          1522: .SH
        !          1523: Introduction
        !          1524: .PP
        !          1525: Most programs take input from standard input and write
        !          1526: output to standard output.
        !          1527: Input and output can be redirected and piped in the usual fashion.
        !          1528: For example,
        !          1529: .Ds
        !          1530: csgen <..\edata\ecsgen.abc | more
        !          1531: .De
        !          1532: runs the program \*Mcsgen\fR\s-2\u1\d\s0 on the data file \*Mcsgen.abc\fR in the parallel
        !          1533: .FS
        !          1534: \s-2\u1\d\s0\^On some systems, including DOS\*([<\*([[3\*(]]\*(>] and VMS\*([<\*([[4\*(]]\*(>],
        !          1535: compiled programs cannot be run directly, but must be executed using
        !          1536: \*Miconx\fR. For DOS, the example above is done as follows:
        !          1537: .Ds
        !          1538: iconx csgen <..\edata\ecsgen.abc | more
        !          1539: .De
        !          1540: .FE
        !          1541: subdirectory and pipes the output through \*Mmore\fR.
        !          1542: .PP
        !          1543: Many programs take
        !          1544: command line arguments, which may be the names of files to
        !          1545: process or options that select specific processing functions.
        !          1546: An option is prefixed by a dash, sometimes followed by an
        !          1547: argument. For example,
        !          1548: .Ds
        !          1549: deal -h 5
        !          1550: .De
        !          1551: runs the program \*Mdeal\fR with the option \*M\-h\fR and the
        !          1552: argument \*M5\fR.
        !          1553: .PP
        !          1554: If a program is not called with the proper options or arguments,
        !          1555: it generally terminates with an error message such as
        !          1556: .Ds
        !          1557: usage: [ -h n ] [ -s n ]
        !          1558: .De
        !          1559: which indicates the proper usage. Some programs provide
        !          1560: more specific errors messages. Error messages are written
        !          1561: to standard error output. Standard error output
        !          1562: is always written to the console and cannot be
        !          1563: redirected.  Consult the descriptions of the
        !          1564: programs that follow for details.
        !          1565: .PP
        !          1566: The programs that follow are divided into categories by their function.
        !          1567: .NH
        !          1568: Demonstrations and Games
        !          1569: .PP
        !          1570: .NH 2
        !          1571: Non-Attacking Queens: \*Mqueens\fR
        !          1572: .PP
        !          1573: This program displays the solutions to the non-attacking
        !          1574: \fIn\fR-queens problem: the ways in which \fIn\fR queens can be
        !          1575: placed on an \fIn\fR-by-\fIn\fR chessboard so that no queen can
        !          1576: attack another. A positive integer can be given as a command line
        !          1577: argument to specify the number of queens. For example,
        !          1578: .Ds
        !          1579: iconx queens 8
        !          1580: .De
        !          1581: displays the solutions for 8 queens on an 8-by-8 chessboard.
        !          1582: The default value in the absence of an argument is 6.
        !          1583: One solution for six queens is:
        !          1584: .br
        !          1585: .ne 1.8i
        !          1586: .in .5i
        !          1587: .CS
        !          1588:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          1589:   |   | Q |   |   |   |   |
        !          1590:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          1591:   |   |   |   | Q |   |   |
        !          1592:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          1593:   |   |   |   |   |   | Q |
        !          1594:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          1595:   | Q |   |   |   |   |   |
        !          1596:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          1597:   |   |   | Q |   |   |   |
        !          1598:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          1599:   |   |   |   |   | Q |   |
        !          1600:   \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          1601: .sp .1
        !          1602: .CE
        !          1603: .in 0
        !          1604: .LP
        !          1605: \fBComments:\fR
        !          1606: There are many approaches to programming solutions to the \fIn\fR-queens problem.
        !          1607: This library program is worth reading for its
        !          1608: programming techniques. Other solutions may be found in
        !          1609: \*([[1\*(]] and\*([<\*([[5\*(]]\*(>].
        !          1610: .NH 2
        !          1611: Word Intersections: \*Mcross\fR
        !          1612: .PP
        !          1613: This program takes a list of words and tries to arrange them
        !          1614: in cross-word format so that they intersect. Uppercase letters
        !          1615: are mapped into lowercase letters on input.
        !          1616: For example, the input
        !          1617: .Ds
        !          1618: and
        !          1619: eggplants
        !          1620: elephants
        !          1621: purple
        !          1622: .De
        !          1623: produces the output
        !          1624: .ne 2i
        !          1625: .CS
        !          1626: .nf
        !          1627: .in .5i
        !          1628: +\-\-\-\-\-\-\-\-\-+
        !          1629: | p       |
        !          1630: | u e     |
        !          1631: | r g     |
        !          1632: | p g     |
        !          1633: |elephants|
        !          1634: | e l     |
        !          1635: |   and   |
        !          1636: |   n     |
        !          1637: |   t     |
        !          1638: |   s     |
        !          1639: +\-\-\-\-\-\-\-\-\-+
        !          1640: .in 0
        !          1641: .CE
        !          1642: .LP
        !          1643: \fBDiagnostics:\fR
        !          1644: The program objects if the input contains a nonalphabetic
        !          1645: character.
        !          1646: .LP
        !          1647: \fBComments:\fR
        !          1648: This program produces only one possible intersection and
        !          1649: it does not attempt to produce the most compact result.
        !          1650: The program is not very fast, either.
        !          1651: There is a lot of room for improvement here. In particular,
        !          1652: it is natural for Icon to generate a sequence of solutions.
        !          1653: .NH 2
        !          1654: Bridge Hands: \*Mdeal
        !          1655: .PP
        !          1656: This program shuffles, deals, and displays hands in the game of bridge.
        !          1657: An example of the output of \*Mdeal\fR is
        !          1658: .br
        !          1659: .ne 2.2i
        !          1660: .CS
        !          1661: .in .5i
        !          1662: .nf
        !          1663: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          1664: 
        !          1665:           S: KQ987
        !          1666:           H: 52
        !          1667:           D: T94
        !          1668:           C: T82
        !          1669: 
        !          1670: S: 3                S: JT4
        !          1671: H: T7               H: J9863
        !          1672: D: AKQ762           D: J85
        !          1673: C: QJ94             C: K7
        !          1674: 
        !          1675:           S: A652
        !          1676:           H: AKQ4
        !          1677:           D: 3
        !          1678:           C: A653
        !          1679: 
        !          1680: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          1681: .in 0
        !          1682: .CE
        !          1683: .LP
        !          1684: \fBOptions:\fR
        !          1685: The following options are available:
        !          1686: .RS
        !          1687: .IP "\*M\-h\fI n\fR" .5i
        !          1688: Produce \fIn\fR hands. The default is 1.
        !          1689: .IP "\*M\-s\fI n\fR"
        !          1690: Set the seed for random generation to \fIn\fR.
        !          1691: Different seeds give different hands.
        !          1692: The default seed is 0.
        !          1693: .RE
        !          1694: .NH 2
        !          1695: Farberisms: \*Mfarb
        !          1696: .PP
        !          1697: Dave Farber, co-author of the original SNOBOL programming language,
        !          1698: is noted for his creative use of the English language. Hence the
        !          1699: terms ``farberisms'' and ``to farberate''.
        !          1700: This program produces a randomly selected farberism.
        !          1701: .LP
        !          1702: \fBNotes:\fR Not all of the farberisms contained in this program were
        !          1703: uttered by the master himself; others have learned to emulate him.
        !          1704: A few of the farberisms may be objectionable to some persons.
        !          1705: ``I wouldn't marry her with a twenty-foot pole.''
        !          1706: .NH
        !          1707: Random Strings
        !          1708: .PP
        !          1709: The programs in this section involve the random generation of
        !          1710: strings according to various criteria.
        !          1711: These programs are only loosely related to each other.
        !          1712: .NH 2
        !          1713: Random Sentence Generation: \*Mrsg
        !          1714: .PP
        !          1715: This program generates randomly selected strings (``sentences'')
        !          1716: from a grammar specified by
        !          1717: the user.
        !          1718: Grammars are basically context-free and resemble BNF in form, although
        !          1719: there are a number of extensions.
        !          1720: .PP
        !          1721: The program works interactively, allowing the user to build, test, modify,
        !          1722: and save grammars. Input to \*Mrsg\fR consists of various kinds of
        !          1723: specifications, which can be intermixed:
        !          1724: .PP
        !          1725: \fIProductions\fR define nonterminal symbols in a syntax similar to 
        !          1726: the rewriting rules of BNF with various alternatives consisting
        !          1727: of the concatenation of nonterminal and terminal symbols.
        !          1728: \fIGeneration specifications\fR cause the generation of a specified
        !          1729: number of sentences from the language defined by a given nonterminal
        !          1730: symbol.
        !          1731: \fIGrammar output specifications\fR cause the definition of a
        !          1732: specified nonterminal or the entire current grammar to be written
        !          1733: to a given file.
        !          1734: \fISource specifications\fR cause subsequent input to be read from
        !          1735: a specified file.
        !          1736: .PP
        !          1737: In addition, any line beginning with \*M#\fR is considered to be
        !          1738: a comment, while any line beginning with \*M=\fR causes the rest
        !          1739: of that line to be used subsequently as a prompt to the user whenever \*Mrsg\fR
        !          1740: is ready for input (there normally is no prompt). A line consisting
        !          1741: of a single \*M=\fR stops prompting.
        !          1742: .LP
        !          1743: \fBProductions:\fR
        !          1744: Examples of productions are:
        !          1745: .Ds
        !          1746: <expr>::=<term>|<term>+<expr>
        !          1747: <term>::=<elem>|<elem>*<term>
        !          1748: <elem>::=x|y|z|(<expr>)
        !          1749: .De
        !          1750: Productions may occur in any order. The definition for a nonterminal
        !          1751: symbol can be changed by specifying a new production for it.
        !          1752: .PP
        !          1753: There are a number of special devices to facilitate the definition of
        !          1754: grammars, including eight predefined, built-in nonterminal symbols:
        !          1755: .nf
        !          1756: .sp .5
        !          1757: .ta .3i 1.2i
        !          1758:        symbol  definition
        !          1759: .sp .5
        !          1760:        \*M<lb> <
        !          1761:        <rb>    >
        !          1762:        <vb>    |
        !          1763:        <nl>\fR newline
        !          1764:        \*M<>\fR        empty string
        !          1765:        \*M<&lcase>\fR  any single lowercase letter
        !          1766:        \*M<&ucase>\fR  any single uppercase letter
        !          1767:        \*M<&digit>\fR  any single digit
        !          1768: .sp 1
        !          1769: .fi
        !          1770: In addition, if the string between a \*M<\fR and a \*M>\fR
        !          1771: begins and
        !          1772: ends with a single quotation mark, it stands for
        !          1773: any single character between the quotation marks. For example,
        !          1774: .Ds
        !          1775: <'xyz'>
        !          1776: .De
        !          1777: is equivalent to
        !          1778: .Ds
        !          1779: x|y|z
        !          1780: .De
        !          1781: Finally, if the name of a nonterminal symbol between the \*M<\fR and
        !          1782: \*M>\fR begins with \*M?\fR, the user is queried during generation
        !          1783: to supply a string for that nonterminal symbol. For example, in
        !          1784: .Ds
        !          1785: <expr>::=<?term>|<term>+<expr>
        !          1786: .De
        !          1787: if the first alternative is encountered during generation, the user is
        !          1788: asked to provide a string for \*M<term>\fR.
        !          1789: Note that this is a \fIstrongly\fR context-sensitive feature.
        !          1790: .LP
        !          1791: \fBGeneration Specifications:\fR
        !          1792: A generation specification consists of a nonterminal symbol
        !          1793: followed by a nonnegative integer. An example is
        !          1794: .Ds
        !          1795: <expr>10
        !          1796: .De
        !          1797: which specifies the generation of 10 \*M<expr>\fRs. If the
        !          1798: integer is omitted, it is assumed to be 1. Generated sentences
        !          1799: are written to standard output.
        !          1800: .LP
        !          1801: \fBGrammar Output Specifications:\fR
        !          1802: A grammar output specification consists of a nonterminal symbol,
        !          1803: followed by \*M\->\fR, followed by a file name. Such a specification
        !          1804: causes the current definition of the nonterminal symbol to be
        !          1805: written to the given file. If the file is omitted, standard output
        !          1806: is assumed. If the nonterminal symbol is omitted, the entire grammar
        !          1807: is written out. Thus,
        !          1808: .Ds
        !          1809: \->
        !          1810: .De
        !          1811: causes the entire grammar to be written to standard output.
        !          1812: .LP
        !          1813: \fBSource Specifications:\fR
        !          1814: A source specification consists of \*M@\fR followed by a file name.
        !          1815: Subsequent input is read from that file. When an end of file is encountered,
        !          1816: input reverts to the previous file. Input files can be nested.
        !          1817: .LP
        !          1818: \fBOptions:\fR
        !          1819: The following options are available:
        !          1820: .RS
        !          1821: .IP "\*M\-s\fI n\fR" .5i
        !          1822: Set the seed for random generation to \fIn\fR.
        !          1823: The default seed is 0.
        !          1824: .IP "\*M\-l\fI n\fR"
        !          1825: Terminate generation if the number of symbols remaining to be processed
        !          1826: exceeds \fIn\fR. There is no default limit.
        !          1827: .IP \*M\-t\fR
        !          1828: Trace the generation of sentences. Trace output goes to standard error
        !          1829: output.
        !          1830: .RE
        !          1831: .LP
        !          1832: \fBDiagnostics:\fR
        !          1833: Syntactically erroneous input lines are noted but are otherwise ignored.
        !          1834: Specifications for a file that cannot be opened are noted and treated as
        !          1835: erroneous.
        !          1836: .PP
        !          1837: If an undefined nonterminal symbol is encountered during generation,
        !          1838: an error message that identifies the undefined symbol is produced,
        !          1839: followed by the partial sentence generated to that point. Exceeding
        !          1840: the limit of symbols remaining to be generated as specified by
        !          1841: the \*M\-l\fR option is handled similarly.
        !          1842: .LP
        !          1843: \fBCaveats:\fR
        !          1844: Generation may fail to terminate because of a loop in the rewriting
        !          1845: rules or, more seriously, because of the progressive accumulation
        !          1846: of nonterminal symbols. The latter problem can be identified
        !          1847: by using the \*M\-t\fR option and controlled by using the \*M\-l\fR
        !          1848: option. The problem often can be circumvented by duplicating alternatives
        !          1849: that lead to fewer rather than more nonterminal symbols. For
        !          1850: example, changing
        !          1851: .Ds
        !          1852: <term>::=<elem>|<elem>*<term>
        !          1853: .De
        !          1854: to
        !          1855: .Ds
        !          1856: <term>::=<elem>|<elem>|<elem>*<term>
        !          1857: .De
        !          1858: increases the probability of selecting \*M<elem>\fR from 1/2 to 2/3.
        !          1859: See\*([<\*([[6\*(]]\*(>] for a discussion of the general
        !          1860: problem.
        !          1861: .LP
        !          1862: \fBComments:\fR This program is an extension and elaboration of
        !          1863: a program described in some detail in\*([<\*([[1\*(]]\*(>]. It illustrates
        !          1864: many features of Icon, including a combination of string and
        !          1865: list processing as well as extensive use of generators. The source
        !          1866: code is worth studying.
        !          1867: .PP
        !          1868: There are many possible extensions to the program. One of the most
        !          1869: useful would be a way to specify the probability of selecting
        !          1870: an alternative.
        !          1871: .NH 2
        !          1872: Context-Sensitive Generation: \*Mcsgen
        !          1873: .PP
        !          1874: This program accepts a context-sensitive production grammar
        !          1875: and generates randomly selected sentences from the corresponding
        !          1876: language.
        !          1877: See\*([<\*([[7\*(]]\*(>] for a discussion of such grammars.
        !          1878: .PP
        !          1879: Uppercase letters stand for nonterminal symbols and \*M\->\fR indicates the
        !          1880: lefthand side can be rewritten by the righthand side. Other characters
        !          1881: are considered to be terminal symbols. Lines beginning with \*M#\fR
        !          1882: are considered to be comments and are ignored.
        !          1883: A line consisting of a nonterminal symbol followed by a colon and
        !          1884: a nonnegative integer \*Mi\fR is a generation specification for \fIi\fR
        !          1885: instances of sentences for the language defined by the nonterminal
        !          1886: (goal) symbol.
        !          1887: An example of input to \*Mcsgen\fR is:
        !          1888: .Ds
        !          1889: #   a(n)b(n)c(n)
        !          1890: #   Salomaa, p. 11.
        !          1891: #   Attributed to M. Soittola.
        !          1892: #
        !          1893: X\->abc
        !          1894: X\->aYbc
        !          1895: Yb\->bY
        !          1896: Yc\->Zbcc
        !          1897: bZ\->Zb
        !          1898: aZ\->aaY
        !          1899: aZ\->aa
        !          1900: X:10
        !          1901: .De
        !          1902: The output of \*Mcsgen\fR for this example is
        !          1903: .Ds
        !          1904: aaabbbccc
        !          1905: aaaaaaaaabbbbbbbbbccccccccc
        !          1906: abc
        !          1907: aabbcc
        !          1908: aabbcc
        !          1909: aaabbbccc
        !          1910: aabbcc
        !          1911: abc
        !          1912: aaaabbbbcccc
        !          1913: aaabbbccc
        !          1914: .De
        !          1915: .PP
        !          1916: A positive integer followed by a colon can be prefixed to a production
        !          1917: to replicate that production, making its selection more likely. For
        !          1918: example,
        !          1919: .Ds
        !          1920: 3:X\->abc
        !          1921: .De
        !          1922: is equivalent to
        !          1923: .Ds
        !          1924: X\->abc
        !          1925: X\->abc
        !          1926: X\->abc
        !          1927: .De
        !          1928: .LP
        !          1929: \fBOption:\fR
        !          1930: The \*M\-t\fR option writes a trace of the derivations to standard 
        !          1931: error output.
        !          1932: .LP
        !          1933: \fBLimitations\fR:
        !          1934: Nonterminal symbols can only be represented by single uppercase letters,
        !          1935: and there is no way to represent uppercase letters as terminal symbols.
        !          1936: .PP
        !          1937: There can be only one generation specification and it must appear as
        !          1938: the last line of input.
        !          1939: .LP
        !          1940: \fBComments:\fR
        !          1941: Generation of context-sensitive strings is a slow process. It may not
        !          1942: terminate, either because of a loop in the rewriting rules
        !          1943: or because of the progressive accumulation of nonterminal symbols.
        !          1944: The program avoids deadlock, in which there are no possible rewrites for
        !          1945: a string in the derivation.
        !          1946: .PP
        !          1947: This program would be improved if the specification of nonterminal
        !          1948: symbols were more general, as in \*Mrsg\fR.
        !          1949: .NH 2
        !          1950: Parenthesis-Balanced Strings: \*Mparens
        !          1951: .PP
        !          1952: This program produces parenthesis-balanced strings in which the
        !          1953: parentheses are randomly distributed.
        !          1954: .LP
        !          1955: \fBOptions:\fR
        !          1956: The following options are available:
        !          1957: .RS
        !          1958: .IP \*M\-b\0\fIn\fR .5i
        !          1959: Bound the length of the strings to \fIn\fR left and right parentheses each. The default is 10.
        !          1960: .IP \*M\-n\0\fIn\fR
        !          1961: Produce \fIn\fR strings. The default is 10.
        !          1962: .IP \*M\-l\0\fIs\fR
        !          1963: Use the string \fIs\fR for the left parenthesis. The default is \*M(\fR .
        !          1964: .IP \*M\-r\0\fIs\fR
        !          1965: Use the string \fIs\fR for the right parenthesis. The default is \*M)\fR .
        !          1966: .IP \*M\-v\fR
        !          1967: Randomly vary the length of the strings between 0 and the bound.
        !          1968: In the absence of this option, all strings are the exactly as long
        !          1969: as the specified bound.
        !          1970: .RE
        !          1971: .PP
        !          1972: For example, the output for
        !          1973: .Ds
        !          1974: parens -v -b 4 -l "begin " -r "end " 
        !          1975: .De
        !          1976: is
        !          1977: .Ds
        !          1978: begin end 
        !          1979: begin end begin end 
        !          1980: begin begin end end begin end 
        !          1981: begin end begin begin end end 
        !          1982: begin end 
        !          1983: begin begin end end 
        !          1984: begin begin begin end end end 
        !          1985: begin end begin begin end end 
        !          1986: begin end begin end 
        !          1987: begin begin end begin end begin end end 
        !          1988: .De
        !          1989: .LP
        !          1990: \fBComments:\fR This program was motivated by the need for test
        !          1991: data for error repair schemes for block-structured programming
        !          1992: langauges. 
        !          1993: See\*([<\*([[8\*(]]\*(>]. A useful
        !          1994: extension to this program would be some way of generating other
        !          1995: text among the parentheses.
        !          1996: In addition to the intended use of the program, it can produce
        !          1997: a variety of interesting patterns, depending on the strings
        !          1998: specified by \*M\-l\fR and \*M\-r\fR.
        !          1999: .NH 2
        !          2000: Shuffled Files: \*Mshuffile
        !          2001: .PP
        !          2002: This program writes a version of the input file with
        !          2003: the lines shuffled.
        !          2004: For example, the result of shuffling
        !          2005: .Ds
        !          2006:          On the Future!-how it tells
        !          2007:          Of the rapture that impells
        !          2008:         To the swinging and the ringing
        !          2009:          Of the bells, bells, bells-
        !          2010:       Of the bells, bells, bells, bells,
        !          2011:                 Bells, bells, bells-
        !          2012:   To the rhyming and the chiming of the bells!
        !          2013: .De
        !          2014: is
        !          2015: .Ds
        !          2016:   To the rhyming and the chiming of the bells!
        !          2017:         To the swinging and the ringing
        !          2018:                 Bells, bells, bells-
        !          2019:          Of the bells, bells, bells-
        !          2020:          On the Future!-how it tells
        !          2021:       Of the bells, bells, bells, bells,
        !          2022:          Of the rapture that impells
        !          2023: .De
        !          2024: .LP
        !          2025: \fBOption:\fR
        !          2026: The option \*M\-s\fI n\fR sets the seed for random generation to \fIn\fR.
        !          2027: The default seed is 0.
        !          2028: .LP
        !          2029: \fBLimitation:\fR
        !          2030: This program stores the input file in memory and shuffles pointers to
        !          2031: the lines; there must be enough memory available to store the entire
        !          2032: file.
        !          2033: .ig
        !          2034: .NH
        !          2035: Turing Machines
        !          2036: .NH
        !          2037: Indexes
        !          2038: ..
        !          2039: .NH
        !          2040: Text Tabulation
        !          2041: .NH 2
        !          2042: Character Tabulation:\*M tablc
        !          2043: .PP
        !          2044: This program tabulates characters and lists
        !          2045: each character and the number of times it
        !          2046: occurs. Characters are written using Icon's escape conventions.
        !          2047: Line termination characters and other control characters are included in the tabulation.
        !          2048: .LP
        !          2049: \fBOptions:\fR
        !          2050: The following options are available:
        !          2051: .RS
        !          2052: .IP \*M\-a\fP .5i
        !          2053: Write the summary in alphabetical order of the characters. This is the
        !          2054: default.
        !          2055: .IP \*M\-n\fP
        !          2056: Write the summary in numerical order of the counts.
        !          2057: .IP \*M\-u\fP
        !          2058: Write only the characters that occur just once.
        !          2059: .RE
        !          2060: .NH 2
        !          2061: Word Tabulation: \*Mtablw
        !          2062: .PP
        !          2063: This program tabulates words and lists 
        !          2064: number of times each word 
        !          2065: occurs. A word is defined to be a string of consecutive
        !          2066: upper- and lowercase letters with at most one interior occurrence
        !          2067: of a dash or apostrophe.
        !          2068: .LP
        !          2069: \fBOptions:\fR
        !          2070: The following options are available:
        !          2071: .RS
        !          2072: .IP \*M\-a\fP .5i
        !          2073: Write the summary in alphabetical order of the words. This is the
        !          2074: default.
        !          2075: .IP \*M\-i\fR
        !          2076: Ignore case distinctions among letters; uppercase letters are mapped into
        !          2077: to corresponding lowercase letters on input. The default is to
        !          2078: maintain case distinctions.
        !          2079: .IP \*M\-n\fP
        !          2080: Write the summary in numerical order of the counts.
        !          2081: .IP "\*M\-l \fIn\fR"
        !          2082: Tabulate only words longer than \fIn\fR characters. The default
        !          2083: is to tabulate all words.
        !          2084: .IP \*M\-u\fP
        !          2085: Write only the words that occur just once.
        !          2086: .RE
        !          2087: .NH
        !          2088: Mailing Labels
        !          2089: .NH 2
        !          2090: Produce Mailing Labels: \*Mlabels
        !          2091: .PP
        !          2092: This program produces labels using
        !          2093: coded information taken from the input file.  In the input file, a line
        !          2094: beginning with \*M#\fR is a label header.  Subsequent lines up to the
        !          2095: next header or end-of-file are accumulated and output so as to be
        !          2096: centered horizontally and vertically on 
        !          2097: label forms.  Lines beginning with \*M*\fR are treated as comments
        !          2098: and are ignored.
        !          2099: .LP
        !          2100: \fBOptions:\fR
        !          2101: The following options are available:
        !          2102: .RS
        !          2103: .IP \*M\-c\ \fIn\fR .5i
        !          2104: Print \fIn\fR copies of each label.
        !          2105: .IP "\*M\-s\fP\0\fIs\fP"
        !          2106: Select only those labels whose headers contain a character
        !          2107: in \fIs\fP.
        !          2108: .IP \*M\-t\fP
        !          2109: Format for curved tape labels (the default is to format
        !          2110: for rectangular mailing labels).
        !          2111: .IP "\*M\-w\ \fIn\fR"
        !          2112: Limit line width to \fIn\fR characters. The default width is 40.
        !          2113: .IP "\*M\-l\ \fIn\fR"
        !          2114: Limit the number of printed lines per label to \fIn\fR. The default
        !          2115: is 8.
        !          2116: .IP "\*M\-d\ \fIn\fR"
        !          2117: Limit the depth of the label to \fIn\fR. The default is 9 for
        !          2118: rectangular labels and 12 for tape labels (\*M\-t\fR).
        !          2119: .IP \*M\-f\fR
        !          2120: Print the first line of each selected entry instead of labels.
        !          2121: .RE
        !          2122: .PP
        !          2123: Options are processed from left to right.
        !          2124: If the number of printed lines is set to a value that exceeds the depth of the label, the
        !          2125: depth is set to the number of lines.
        !          2126: If the depth is set to a value that is less than the number of printed
        !          2127: lines, the number of printed lines is set to the depth. Note that
        !          2128: the order in which these options are specified may affect the
        !          2129: results.
        !          2130: .LP
        !          2131: \fBPrinting Labels:\fR
        !          2132: Label forms should be used with a pin-feed platen.  For mailing labels,
        !          2133: the carriage
        !          2134: should be adjusted so that the first character is printed at the
        !          2135: leftmost position on the label and so that the first line of the
        !          2136: output is printed on the topmost line of the label.
        !          2137: For curved tape labels, some experimentation may be required
        !          2138: to get the text positioned properly.
        !          2139: .LP
        !          2140: \fBDiagnostics:\fR
        !          2141: If the limits on line width or the number of lines per label are exceeded,
        !          2142: a label
        !          2143: with an error message is written to standard error output.
        !          2144: .NH 2
        !          2145: Zip Code Sorting: \*Mzipsort
        !          2146: .PP
        !          2147: This program sorts labels produced by \*Mlabels\fR in ascending order of
        !          2148: their postal zip codes.
        !          2149: .LP
        !          2150: \fBOption:\fR
        !          2151: The option \*M\-d\ \fIn\fR sets the number of lines per label to \fIn\fR.
        !          2152: The default is 9. This value must agree with the value used to format
        !          2153: the labels.
        !          2154: .LP
        !          2155: \fBZip Codes:\fR
        !          2156: The zip code must be the last nonblank string at the end of the label.
        !          2157: It must consist of digits but may have an embedded dash for extended zip codes.
        !          2158: If a label does not end with a legal zip code,
        !          2159: it is placed after
        !          2160: all labels with legal zip codes.
        !          2161: In such a case, an error messages also is written to standard error
        !          2162: output.
        !          2163: .NH
        !          2164: Laminated Files
        !          2165: .NH 2
        !          2166: Laminating Files: \*Mlam
        !          2167: .PP
        !          2168: This program laminates files named on the command line onto the standard output,
        !          2169: producing a concatenation
        !          2170: of corresponding lines from each file named.
        !          2171: If the files are different lengths,
        !          2172: empty lines are substituted for missing lines in the shorter files.
        !          2173: A command line argument of the form
        !          2174: \*M\- \fIs
        !          2175: \fRcauses the string \fIs\fR to be inserted between the concatenated
        !          2176: file lines.
        !          2177: .PP
        !          2178: Each command line
        !          2179: argument is placed in the output line
        !          2180: at the point that it appears in the argument list.
        !          2181: For example, lines from \*Mfile1\fR and \*Mfile2\fR can be laminated
        !          2182: with a colon between each line from \*Mfile1\fR and the corresponding
        !          2183: line from \*Mfile2\fR by the command
        !          2184: .Ds
        !          2185: lam file1 \-: file2
        !          2186: .De
        !          2187: .PP
        !          2188: File names and strings may appear in any order in the argument list.
        !          2189: If
        !          2190: \*M\-\fR
        !          2191: is given for a file name,
        !          2192: standard input is read at that point.
        !          2193: If a file is named more than once,
        !          2194: each of its lines will be duplicated on the output line,
        !          2195: except that if standard input is named more than once,
        !          2196: its lines will be read alternately.
        !          2197: For example, each pair of lines from standard input can be
        !          2198: joined onto one line with a space between them by the command
        !          2199: .Ds
        !          2200: lam \- "\-\0" \-
        !          2201: .De
        !          2202: .LP
        !          2203: while the command
        !          2204: .Ds
        !          2205: lam file1 "\-\0" file1
        !          2206: .De
        !          2207: .LP
        !          2208: replicates each line from \*Mfile1\fR.
        !          2209: .NH 2
        !          2210: Delaminating Files: \*Mdelam
        !          2211: .PP
        !          2212: This program delaminates standard input into several output files
        !          2213: according to the specified fields.
        !          2214: It writes the fields in each line to the
        !          2215: corresponding output files as individual lines. If no data occurs in
        !          2216: the specified position for a given input line an empty output line is
        !          2217: written. This insures that all output files contain the same number of
        !          2218: lines as the input file.
        !          2219: .PP
        !          2220: If \*M\-\fR is used for the input file, the standard input is read.
        !          2221: If \*M\-\fR is used as an output file name, the corresponding field
        !          2222: is written to the standard output.
        !          2223: .PP
        !          2224: The fields are defined by a list of field
        !          2225: specifications, separated by commas, colons, or semicolons, of the
        !          2226: following form:
        !          2227: .Ds
        !          2228: .ft I
        !          2229: .ta .5i
        !          2230: n      \fRthe character in column \fIn
        !          2231: n\*M\-\fIm     \fRthe characters in columns \fIn\fR through \fIm
        !          2232: n+m            m \fRcharacters beginning at column \fIn
        !          2233: .ft R
        !          2234: .De
        !          2235: where the columns in a line are numbered from 1 to the length of the
        !          2236: line.
        !          2237: .PP
        !          2238: The use of \*Mdelam\fR is illustrated by the following examples.
        !          2239: The command
        !          2240: .Ds
        !          2241: delam 1\-10,5 x.txt y.txt
        !          2242: .De
        !          2243: reads standard input and writes characters 1 through 10 to file \*Mx.txt\fR and
        !          2244: character 5 to file \*My.txt\fR.
        !          2245: The command
        !          2246: .Ds
        !          2247: delam 10+5:1\-10:1\-10:80 mid x1 x2 end
        !          2248: .De
        !          2249: writes characters 10 through 14 to
        !          2250: \*Mmid\fR, 1 through 10 to \*Mx1\fR and \*Mx2\fR, and character 80 to
        !          2251: \*Mend\fR.
        !          2252: The command
        !          2253: .Ds
        !          2254: delam 1\-80;1\-80 \- \-
        !          2255: .De
        !          2256: copies standard input to standard output, replicating the
        !          2257: first eighty columns of each line twice.
        !          2258: .NH 2
        !          2259: Delaminating Files by Separators: \*Mdelamc
        !          2260: .PP
        !          2261: This program delaminates standard input into several output files
        !          2262: according to the separator characters specified by the string
        !          2263: following the \*M\-t\fR option.
        !          2264: It writes the fields in each line to the
        !          2265: corresponding output files as individual lines. If no data occurs in
        !          2266: the specified position for a given input line an empty output line is
        !          2267: written. This insures that all output files contain the same number of
        !          2268: lines as the input file.
        !          2269: .PP
        !          2270: If \*M\-\fR is used as an output file name, the corresponding field
        !          2271: is written to the standard output. If the \*M\-t\fR option is not used,
        !          2272: an ascii horizontal tab character is assumed as the default
        !          2273: field separator.
        !          2274: .PP
        !          2275: The use of \*Mdelamc\fR is illustrated by the following examples.
        !          2276: The command
        !          2277: .Ds
        !          2278: delamc labels opcodes operands
        !          2279: .De
        !          2280: writes the fields of standard input, each of which
        !          2281: is separated by a tab character, to the output files \*Mlabels\fR,
        !          2282: \*Mopcodes\fR,
        !          2283: and \*Moperands\fR.
        !          2284: The command
        !          2285: .Ds
        !          2286: delamc \-t: scores names matric ps1 ps2 ps3
        !          2287: .De
        !          2288: writes the fields of standard input, each of which are separated
        !          2289: by a colon, to the indicated output files.
        !          2290: The command
        !          2291: .Ds
        !          2292: delamc \-t,: oldata f1 f2
        !          2293: .De
        !          2294: separates the fields using either a comma or a colon.
        !          2295: .NH
        !          2296: Icon Program Utilities
        !          2297: .NH 2
        !          2298: Icon Program Cross Reference: \*Mipxref
        !          2299: .PP
        !          2300: This program cross-references Icon programs. It lists
        !          2301: the occurrences of each variable by line number. Variables are listed
        !          2302: by procedure or separately as globals.
        !          2303: The options specify the formatting of the
        !          2304: output and whether or not to cross-reference quoted strings and
        !          2305: non-alphanumerics. Variables that are followed by a left parenthesis
        !          2306: are listed with an asterisk following the name.
        !          2307: If a file is not specified, then standard input is cross-referenced.
        !          2308: .LP
        !          2309: \fBOptions:\fR
        !          2310: The following options change the format defaults:
        !          2311: .RS
        !          2312: .IP "\*M\-c\fR \fIn\fR" 0.5i
        !          2313: The column width per line number. The default is 4 columns wide.
        !          2314: .IP "\*M\-l\fR \fIn\fR"
        !          2315: The starting column (i.e. left margin) of the line numbers.
        !          2316: The default is column 40.
        !          2317: .IP "\*M\-w\fR \fIn\fR"
        !          2318: The column width of the whole output line. The default is 80 columns wide.
        !          2319: .RE
        !          2320: .PP
        !          2321: Normally only alphanumerics are cross-referenced. These options expand
        !          2322: what is considered:
        !          2323: .RS
        !          2324: .IP \*M\-q\fR 0.5i
        !          2325: Include quoted strings.
        !          2326: .IP \*M\-x\fR
        !          2327: Include all non-alphanumerics.
        !          2328: .RE
        !          2329: .LP
        !          2330: \fBNote:\fR
        !          2331: This program assumes the subject file is a valid Icon program. For example,
        !          2332: quotes are expected to be matched.
        !          2333: .NH 2
        !          2334: Sort Icon Declarations: \*Mipsort
        !          2335: .PP
        !          2336: This program reads an Icon program and writes
        !          2337: an equivalent program with the procedures
        !          2338: sorted alphabetically. Global, link, and record declarations
        !          2339: come first in the order they appear in the original program.
        !          2340: The main procedure comes next followed by the remaining procedures
        !          2341: in alphabetical order.
        !          2342: .PP
        !          2343: Comments and white space between declarations are attached to the next
        !          2344: following declaration.
        !          2345: .LP
        !          2346: \fBLimitations:\fR
        !          2347: This program only recognizes declarations that start at the beginning
        !          2348: of a line.
        !          2349: .PP
        !          2350: Comments and interline white space between declarations may not come
        !          2351: out as intended.
        !          2352: .NH 2
        !          2353: Icon Program Splitting: \*Mipsplit
        !          2354: .PP
        !          2355: This progam reads an Icon program and writes
        !          2356: each procedure to a separate file. The output file names consist of
        !          2357: the procedure name with \*M.icn\fR appended.
        !          2358: If the \*M\-g\fR option is specified, any
        !          2359: global, link, and record declarations
        !          2360: are written to that file. Otherwise they are written in the file for
        !          2361: the procedure that immediately follows them.
        !          2362: .PP
        !          2363: Comments and white space between declarations are attached to the next
        !          2364: following declaration.
        !          2365: .LP
        !          2366: \fBNotes:\fR
        !          2367: The program only recognizes declarations that start at the beginning
        !          2368: of lines.
        !          2369: Comments and interline white space between declarations may not come
        !          2370: out as intended.
        !          2371: .PP
        !          2372: If the \*M\-g\fR option is not specified, any global, link, or
        !          2373: record declarations that follow the last procedure are discarded.
        !          2374: .NH
        !          2375: Miscellaneous Utilities
        !          2376: .NH 2
        !          2377: Line Lengths: \*Mll
        !          2378: .PP
        !          2379: This program prints the lengths of the shortest and longest lines
        !          2380: in files named on the command line.
        !          2381: If there is no command line argument, the standard input is used.
        !          2382: The argument \*M\-\fR may be used to explicitly specify the standard input.
        !          2383: .NH 2
        !          2384: Trimming Lines: \*Mtrim
        !          2385: .PP
        !          2386: This program copies lines from standard input to standard output, truncating
        !          2387: the lines at \fIn\fR characters and removing any trailing blanks. The
        !          2388: default value for \fIn\fR is 80.
        !          2389: For example,
        !          2390: .Ds
        !          2391: trim 70 <grade.txt >grade.fix
        !          2392: .De
        !          2393: copies \*Mgrade.txt\fR to \*Mgrade.fix\fR, with lines longer than
        !          2394: 70 characters truncated to 70 characters and the trailing blanks removed from
        !          2395: all lines.
        !          2396: .PP
        !          2397: The \*M\-f\fR option causes all lines to be \fIn\fR characters long
        !          2398: by adding blanks to short lines;
        !          2399: otherwise, short lines are left as is.
        !          2400: .NH 2
        !          2401: Sorting Groups of Lines: \*Mgrpsort
        !          2402: .PP
        !          2403: This program sorts input containing ``records'' defined to be
        !          2404: groups of consecutive lines. Output is written to standard output.
        !          2405: Each input record is separated by one or more repetitions of a 
        !          2406: demarcation line (a line beginning with the separator string).
        !          2407: The first line of each record is used as the key.
        !          2408: .PP
        !          2409: If no separator string is specified on the command line,
        !          2410: the default is the empty string. Because all input lines
        !          2411: are trimmed of whitespace (blanks and tabs), empty lines are default
        !          2412: demarcation lines. The separator string specified can be an initial
        !          2413: substring of the string used to demarcate lines, in which case the
        !          2414: resulting partition of the input file may be different
        !          2415: from a partition created using the entire demarcation string.
        !          2416: .PP
        !          2417: The \*M\-o\fP option sorts the input file but does not produce the sorted records.
        !          2418: Instead it lists the keys (in sorted order) and line numbers defining the
        !          2419: extent of the record associated with each key.
        !          2420: .PP
        !          2421: The use of \*Mgrpsort\fR is illustrated by the following examples.
        !          2422: The command
        !          2423: .Ds
        !          2424: grpsort "catscats" <x >y
        !          2425: .De
        !          2426: sorts the file \*Mx\fR, whose records are separated by
        !          2427: lines containing the
        !          2428: string \*M"catscats"\fR, into the file \*My\fR placing a single line
        !          2429: of \*M"catscats"\fR between each output record. Similarly, the
        !          2430: command
        !          2431: .Ds
        !          2432: grpsort "cats" <x >y
        !          2433: .De
        !          2434: sorts the file \*Mx\fR as before but assumes that any line beginning with the
        !          2435: string \*M"cats"\fR delimits a new record. This may or may not divide the
        !          2436: lines of the input file into a number of records different from the previous
        !          2437: example.
        !          2438: In any case, the output records will be separated by a single line of \*M"cats"\fR.
        !          2439: Another example is
        !          2440: .Ds
        !          2441: grpsort \-o <bibliography >bibkeys
        !          2442: .De
        !          2443: which sorts the file \*Mbibliography\fR and produces a sorted list of
        !          2444: the keys and the extents of the associated records in \*Mbibkeys\fR.
        !          2445: Each output key line is of the form:
        !          2446: .ne 10
        !          2447: .Ds
        !          2448: [s\-e] key
        !          2449: .De
        !          2450: where
        !          2451: .Ds
        !          2452: .ta .6i
        !          2453: .ss 4
        !          2454: \*Ms\fR        is the line number of the key line
        !          2455: \*Me\fR        is the line number of the last line
        !          2456: \*Mkey\fR      is the actual key of the record
        !          2457: .De
        !          2458: .ds CH \s10Procedures\s0
        !          2459: .bp
        !          2460: .SH
        !          2461: Introduction
        !          2462: .PP
        !          2463: Collections of translated procedures are in the distribution directory \*Mprocs\fR.
        !          2464: These files can be linked into other programs.
        !          2465: .PP
        !          2466: For example, to include the procedures in \*Mgener.icn\fR in
        !          2467: an Icon program, the following link declaration can be used\s-2\u2\d\s0:
        !          2468: .Ds
        !          2469: link "/ipl/procs/gener"
        !          2470: .De
        !          2471: .FS
        !          2472: \s-2\u2\d\s0\^In DOS, backslashes can be used in place of slashes in such link
        !          2473: declarations, but they must be escaped, as in
        !          2474: .Ds
        !          2475: link "\e\eipl\e\eprocs\e\egener"
        !          2476: .De
        !          2477: .FE
        !          2478: .NH 0
        !          2479: Math Procedures: \*Mmath
        !          2480: .LP
        !          2481: The following procedures compute standard trigonometric functions.
        !          2482: The arguments are in radians.
        !          2483: .RS
        !          2484: .IP \*Msin(x)\fR 1i
        !          2485: sine of \*Mx\fR
        !          2486: .IP \*Mcos(x)\fR
        !          2487: cosine of \*Mx\fR
        !          2488: .IP \*Mtan(x)\fR
        !          2489: tangent of \*Mx\fR
        !          2490: .IP \*Masin(x)\fR
        !          2491: arc sine of \*Mx\fR in the range \-\(*p/2 to \(*p/2
        !          2492: .IP \*Macos(x)\fR
        !          2493: arc cosine of \*Mx\fR in the range 0 to \(*p
        !          2494: .IP \*Matan(x)\fR
        !          2495: arc tangent of \*Mx\fR in the range \-\(*p/2 to \(*p/2
        !          2496: .IP \*Matan2(y,x)\fR
        !          2497: arc tangent of \*Mx/y\fR in the range \-\(*p to \(*p
        !          2498: .RE
        !          2499: .LP
        !          2500: The following procedures convert from degrees to radians and conversely:
        !          2501: .RS
        !          2502: .IP \*Mdtor(d)\fR 1i
        !          2503: radian equivalent of \*Md\fR
        !          2504: .IP \*Mrtod(r)\fR
        !          2505: degree equivalent of \*Mr\fR
        !          2506: .RE
        !          2507: .LP
        !          2508: The following
        !          2509: additional procedures are available:
        !          2510: .RS
        !          2511: .IP \*Msqrt(x)\fR 1i
        !          2512: square root of \*Mx\fR
        !          2513: .IP \*Mexp(x)\fR
        !          2514: exponential function of \*Mx\fR
        !          2515: .IP \*Mlog(x)\fR
        !          2516: natural logarithm of \*Mx\fR
        !          2517: .IP \*Mlog10(x)\fR
        !          2518: base-10 logarithm of \*Mx\fR
        !          2519: .IP \*Mfloor(x)\fR
        !          2520: largest integer not greater than \*Mx\fR
        !          2521: .IP \*Mceil(x)\fR
        !          2522: smallest integer nor less than \*Mx\fR
        !          2523: .RE
        !          2524: .LP
        !          2525: \fBFailure Conditions:\fR
        !          2526: \*Masin(x)\fR and \*Macos(x)\fR fail if the absolute value of \*Mx\fR is
        !          2527: greater than one. \*Msqrt(x)\fR, \*Mlog(x)\fR, and \*Mlog10(x)\fR
        !          2528: fail if \*Mx\fR is less than zero.
        !          2529: .NH
        !          2530: Bit Operations: \*Mbitops
        !          2531: .LP
        !          2532: The following procedures perform operations on characters strings of zeros and
        !          2533: ones (``bit strings'').
        !          2534: .RS
        !          2535: .IP \*Mand(b1,\*bb2)\fR 1i
        !          2536: logical ``and'' of \*Mb1\fR and \*Mb2\fR
        !          2537: .IP \*Mbitstring(i)\fR
        !          2538: convert integer \*Mi\fR to bit string
        !          2539: .IP \*Mbsum(b1,\*bb2)\fR
        !          2540: arithmetic sum of \*Mb1\fR and \*Mb2\fR
        !          2541: (used by other procedures)
        !          2542: .IP \*Mdecimal(b)\fR
        !          2543: convert \*Mb\fR to integer
        !          2544: .IP \*Mexor(b1,\*bb2)\fR
        !          2545: ``exclusive-or'' of \*Mb1\fR and \*Mb2\fR
        !          2546: .IP \*Mneg(b)\fR
        !          2547: negation of \*Mb\fR
        !          2548: .IP \*Mor(b1,\*bb2)\fR
        !          2549: logical ``or'' of \*Mb1\fR and \*Mb2\fR
        !          2550: .RE
        !          2551: .LP
        !          2552: \fBNote:\fR
        !          2553: If \*Mi\fR in \*Mbitstring(i)\fR is negative, the value produced is
        !          2554: the corresponding unsigned 32-bit bit string.
        !          2555: .LP
        !          2556: \fBBugs:\fR
        !          2557: Integer values that exceed those allowable in Icon may produce bogus
        !          2558: results or spurious diagnostics.
        !          2559: .NH
        !          2560: Radix Conversions: \*Mradcon
        !          2561: .LP
        !          2562: The following procedures convert numbers from one radix to another. The letters
        !          2563: from \*Ma\fR to \*Mz\fR are used for ``digits'' greater than 9. All the
        !          2564: conversion procedures fail if the conversion cannot be made.
        !          2565: .RS
        !          2566: .IP \*Mexbase10(i,\*bj)\fR 1i
        !          2567: convert base-10 integer \*Mi\fR to base \*Mj\fR
        !          2568: .IP \*Minbase10(s,\*bi)\fR
        !          2569: convert base-\*Mi\fR integer \*Ms\fR to base 10
        !          2570: .IP \*Mradcon(s,\*bi,\*bj)\fR
        !          2571: convert base-\*Mi\fR integer \*Ms\fR to base \*Mj\fR
        !          2572: .RE
        !          2573: .LP
        !          2574: \fBLimitation:\fR
        !          2575: The maximum base allowed is 36.
        !          2576: .ig
        !          2577: .NH
        !          2578: Formatting Numbers: \*Mnumbers
        !          2579: ..
        !          2580: .NH
        !          2581: Complex Arithmetic: \*Mcomplex
        !          2582: .LP
        !          2583: The following procedures perform operations on complex numbers.
        !          2584: .RS
        !          2585: .IP \*Mcomplex(r,\*bi)\fR 1i
        !          2586: create complex number with real part \*Mr\fR
        !          2587: and imaginary part \*Mi\fR
        !          2588: .IP \*Mcpxadd(x1,\*bx2)\fR
        !          2589: add complex numbers \*Mx1\fR and \*Mx2\fR
        !          2590: .IP \*Mcpxdiv(x1,\*bx2)\fR
        !          2591: divide complex number \*Mx1\fR by complex number \*Mx2\fR
        !          2592: .IP \*Mcpxmul(x1,\*bx2)\fR
        !          2593: multiply complex number \*Mx1\fR by complex number \*Mx2\fR
        !          2594: .IP \*Mcpxsub(x1,\*bx2)\fR
        !          2595: subtract complex number \*Mx2\fR from complex number \*Mx1\fR
        !          2596: .IP \*Mcpxstr(x)\fR
        !          2597: convert complex number \*Mx\fR to string representation
        !          2598: .IP\*Mstrcpx(s)\fR
        !          2599: convert string representation \*Ms\fR of complex number
        !          2600: to complex number
        !          2601: .RE
        !          2602: .NH
        !          2603: Collated Strings: \*Mcollate
        !          2604: .LP
        !          2605: These procedures collate (interleave) respective characters of two
        !          2606: strings and decollate such strings by selecting every other character of a string.
        !          2607: produce a string consisting of
        !          2608: interleaved characters of \*Ms1\fR and \*Ms2\fR.
        !          2609: .RS
        !          2610: .IP \*Mcollate(s1,\*bs2)\fR 1i
        !          2611: collate the characters of \*Ms1\fR and \*Ms2\fR.
        !          2612: For example,
        !          2613: .sp .5
        !          2614:      \*Mcollate("abc",\*b"def")\fR
        !          2615: .sp .5
        !          2616: produces \*M"adbecf"\fR.
        !          2617: .IP \*Mdecollate(s,\*bi)\fR
        !          2618: produce a string consisting of
        !          2619: every other character of \*Ms\fR. If \*Mi\fR
        !          2620: is odd, the odd-numbered characters are selected, while if \*Mi\fR
        !          2621: is even, the even-numbered characters are selected.
        !          2622: .RE
        !          2623: .LP
        !          2624: \fBDiagnostics:\fR
        !          2625: Run-time error 208 occurs if the arguments to \*Mcollate\fR are not
        !          2626: of the same size.
        !          2627: .NH
        !          2628: Emphasized Text: \*Mbold
        !          2629: .LP
        !          2630: These procedures produce text with interspersed characters suitable for
        !          2631: printing to produce the effect of boldface (by overstriking) and
        !          2632: underscoring (using backspaces).
        !          2633: .RS
        !          2634: .IP \*Mbold(s)\fR 1i
        !          2635: bold version of \*Ms
        !          2636: .IP \*Muscore(s)\fR
        !          2637: underscored version of \*Ms
        !          2638: .RE
        !          2639: .NH
        !          2640: Shuffling: \*Mshuffle
        !          2641: .LP
        !          2642: The procedure \*Mshuffle(x)\fR shuffles a string or list. In the case
        !          2643: that \*Mx\fR is a string, a corresponding string with the characters
        !          2644: randomly rearranged is produced. In the case that \*Mx\fR is a list,
        !          2645: the values in the list are randomly rearranged.
        !          2646: .NH
        !          2647: Segmented Strings: \*Msegment
        !          2648: .LP
        !          2649: The procedure \*Msegment(s,\*bc)\fR generates
        !          2650: consecutive substrings of \*Ms\fR consisting of characters that
        !          2651: respectively do/do not occur in \*Mc\fR.
        !          2652: For example,
        !          2653: .Ds
        !          2654: segment("Not a sentence.",\*b&lcase ++ &ucase)
        !          2655: .De
        !          2656: generates
        !          2657: .Ds
        !          2658: "Not"
        !          2659: " "
        !          2660: "a"
        !          2661: " "
        !          2662: "sentence"
        !          2663: "."
        !          2664: .De
        !          2665: .NH
        !          2666: String Utilities: \*Mstrutil
        !          2667: .LP
        !          2668: These procedures perform simple operations on strings.
        !          2669: .RS
        !          2670: .IP \*Mcompress(s,\*bc)\fR 1i
        !          2671: compress consecutive occurrences of characters in \*Mc\fR that occur in \*Ms\fR
        !          2672: .IP \*Mdelete(s,\*bc)\fR
        !          2673: delete all occurrences of characters in \*Mc\fR that occur in \*Ms\fR
        !          2674: .IP \*Mrotate(s,\*bi)\fR
        !          2675: rotate \*Ms\fR \*Mi\fR characters to the left (negative \*Mi\fR produces
        !          2676: rotation to the right); the default value of \*Mi\fR is 1
        !          2677: .RE
        !          2678: .NH
        !          2679: Structure Utilities: \*Mstructs
        !          2680: .LP
        !          2681: These procedures manipulate trees and acyclic graphs (dags).
        !          2682: The structures are represented with lists.
        !          2683: See\*([<\*([[1\*(]]\*(>].
        !          2684: .RS
        !          2685: .IP \*Mdepth(t)\fR 1i
        !          2686: compute maximum depth of tree \*Mt\fR
        !          2687: .IP \*Meq(x,\*by)\fR
        !          2688: compare list structures \*Mx\fR and \*My\fR
        !          2689: .IP \*Mldag(s)\fR
        !          2690: construct a dag from the string \*Ms\fR
        !          2691: .IP \*Mltree(s)\fR
        !          2692: construct a tree from the string \*Ms\fR
        !          2693: .IP \*Mstree(t)\fR
        !          2694: construct a string from the tree \*Mt\fR
        !          2695: .IP \*Mtcopy(t)\fR
        !          2696: copy tree \*Mt\fR
        !          2697: .IP \*Mteq(t1,\*bt2)\fR
        !          2698: compare trees \*Mt1\fR and \*Mt2\fR
        !          2699: .IP \*Mvisit(t)\fR
        !          2700: visit, in preorder, the nodes of the tree \*Mt\fR
        !          2701: .RE
        !          2702: .LP
        !          2703: \fBNote:\fR
        !          2704: The procedure \*Mldag\fR has a second argument that is used on internal
        !          2705: recursive calls; a second argument must not be supplied by the user.
        !          2706: .NH
        !          2707: Icon Literal Escapes: \*Mescape
        !          2708: .LP
        !          2709: The procedure \*Mescape(s)\fR produces a string in which Icon
        !          2710: quoted literal escape conventions in \*Ms\fR are replaced by the corresponding
        !          2711: characters.
        !          2712: For example, \*Mescape("\e\e143\e\e141\e\e164")\fR produces the string \*M"cat"\fR.
        !          2713: .NH
        !          2714: Images of Icon Values: \*Mimage
        !          2715: .LP
        !          2716: The procedure \*MImage(x)\fR produces a string
        !          2717: image of the value \*Mx\fR. The value produced is a generalization of
        !          2718: the value produced by the Icon function \*Mimage(x)\fR, providing detailed
        !          2719: information about structures.
        !          2720: .PP
        !          2721: Tags are used to uniquely identify
        !          2722: structures. A tag consists of a letter identifying the type followed
        !          2723: by an integer. The tag letters are \*ML\fR for lists, \*MR\fR for
        !          2724: records, \*MS\fR for sets, and \*MT\fR for tables. The first time a structure is encountered,
        !          2725: it is imaged as the tag followed by a colon, followed by a representation
        !          2726: of the structure. If the same structure is encountered again, only the
        !          2727: tag is given.
        !          2728: .PP
        !          2729: An example is
        !          2730: .de In
        !          2731: .in 3n
        !          2732: ..
        !          2733: .Ds
        !          2734: a := \^["x"]
        !          2735: push(a,\*ba)
        !          2736: t := table()
        !          2737: push(a,\*bt)
        !          2738: t\^[a] := t
        !          2739: t\^["x"] := \^[\^]
        !          2740: t\^[t] := a
        !          2741: write(Image(t))
        !          2742: .De
        !          2743: which produces
        !          2744: .Ds
        !          2745: T1:\^["x"\->L1:\^[\^],\*bL2:\^[T1,\*bL2,\*b"x"]\^\->T1,\*bT1\->L2]
        !          2746: .De
        !          2747: Note that a table is represented as a list of entry and assigned
        !          2748: values separated by \*M\->\fR.
        !          2749: .NH
        !          2750: List Mapping: \*Mlmap
        !          2751: .LP
        !          2752: The procedure
        !          2753: \*Mlmap(a1,\*ba2,\*ba3)\fR maps elements of \*Ma1\fR according to \*Ma2\fR and \*Ma3\fR.
        !          2754: This procedure is the analog for lists of the built-in string-mapping
        !          2755: function \*Mmap(s1,\*bs2,\*bs3)\fR. Elements in \*Ma1\fR that are the
        !          2756: same as elements in \*Ma2\fR are mapped into the corresponding
        !          2757: elements of \*Ma3\fR. For example, given the lists
        !          2758: .Ds
        !          2759: a1 := [1,\*b2,\*b3,\*b4]
        !          2760: a2 := [4,\*b3,\*b2,\*b1]
        !          2761: a3 := ["a",\*b"b",\*b"c",\*b"d"]
        !          2762: .De
        !          2763: then
        !          2764: .Ds
        !          2765: lmap(a1,\*ba2,\*ba3)
        !          2766: .De
        !          2767: changes \*Ma1\fR to
        !          2768: .Ds
        !          2769: ["d",\*b"c",\*b"b",\*b"a"]
        !          2770: .De
        !          2771: Note that the value of \*Ma1\fR is modified.
        !          2772: .PP
        !          2773: Lists that are mapped can have any kinds of elements. The operation
        !          2774: .Ds
        !          2775: x =\^=\^= y
        !          2776: .De
        !          2777: is used to determine if elements \*Mx\fR and \*My\fR are equivalent.
        !          2778: .PP
        !          2779: All cases in \*Mlmap\fR are handled as they are in \*Mmap\fR,
        !          2780: except that no defaults are provided for omitted arguments. As with
        !          2781: \*Mmap\fR, \*Mlmap\fR can be used for transposition as well as
        !          2782: substitution.
        !          2783: .LP
        !          2784: \fBWarning:\fR
        !          2785: If \*Mlmap\fR is called with the same lists \*Ma2\fR and \*Ma3\fR
        !          2786: as in the immediately preceding call, the same mapping is performed,
        !          2787: even if the values in \*Ma2\fR and \*Ma3\fR have been changed. This
        !          2788: improves performance, but it may cause unexpected effects.
        !          2789: .LP
        !          2790: \fBComments:\fR
        !          2791: It is easy to change \*Mlmap\fR to produce a new list instead of
        !          2792: modifying \*Ma1\fR; this is a good exercise for beginning Icon
        !          2793: programmers. The ``caching'' of the mapping table based on
        !          2794: \*Ma2\fR and \*Ma3\fR also can be removed easily to avoid
        !          2795: the potential problem mentioned in the warning above.
        !          2796: .NH
        !          2797: Snapshots of Scanning: \*Msnapshot
        !          2798: .LP
        !          2799: The procedure \*Msnapshot()\fR writes a snapshot of the state of string
        !          2800: scanning, showing the value of \*M&subject\fR and \*M&pos\fR. For
        !          2801: example,
        !          2802: .Ds
        !          2803: "((a+b)\-delta)/(c*d))" ? {
        !          2804:    tab(bal('+\-/*'))
        !          2805:    snapshot()
        !          2806:    }
        !          2807: .De
        !          2808: produces
        !          2809: .nf
        !          2810: .CS
        !          2811: .in .5i
        !          2812: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          2813: |                                   |
        !          2814: | &subject = "((a+b)\-delta)/(c*d))" |
        !          2815: |                          |        |
        !          2816: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          2817: .in 0
        !          2818: .CE
        !          2819: .LP
        !          2820: Note that the bar showing the \*M&pos\fR is positioned under the
        !          2821: \*M&pos\fRth character (actual positions are between characters).
        !          2822: If \*M&pos\fR is at the end of \*M&subject\fR, the bar is positioned
        !          2823: under the quotation mark delimiting the subject. For example,
        !          2824: .Ds
        !          2825: "abcdefgh" ? (tab(0) & snapshot())
        !          2826: .De
        !          2827: produces
        !          2828: .nf
        !          2829: .CS
        !          2830: .in .5i
        !          2831: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          2832: |                       |
        !          2833: | &subject = "abcdefgh" |
        !          2834: |                     | |
        !          2835: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          2836: .in 0
        !          2837: .CE
        !          2838: .LP
        !          2839: Escape sequences are handled properly. For example,
        !          2840: .Ds
        !          2841: "abc\etdef\enghi" ? (tab(upto('\en')) & snapshot())
        !          2842: .De
        !          2843: produces
        !          2844: .nf
        !          2845: .CS
        !          2846: .in .5i
        !          2847: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          2848: |                            |
        !          2849: | &subject = "abc\etdef\enghi" |
        !          2850: |                     |      |
        !          2851: \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
        !          2852: .in 0
        !          2853: .CE
        !          2854: .LP
        !          2855: .NH
        !          2856: Miscellaneous Generators: \*Mgener
        !          2857: .LP
        !          2858: These procedures generate sequences of results.
        !          2859: .RS
        !          2860: .IP \*Mhex()\fR 1i
        !          2861: sequence of hexadecimal codes for numbers from 0 to 255
        !          2862: .IP \*Mlabel(s,\*bi)\fR
        !          2863: sequence of labels with prefix \*Ms\fR starting at \*Mi\fR
        !          2864: .IP \*Moctal()\fR
        !          2865: sequence of octal codes for numbers from 0 to 255
        !          2866: .IP \*Mstar(s)\fR
        !          2867: sequence consisting of the closure of \*Ms\fR starting with the
        !          2868: empty string and continuing in lexical order as given in \*Ms\fR
        !          2869: .RE
        !          2870: .NH
        !          2871: Result Sequences: \*Mseqimage
        !          2872: .LP
        !          2873: The procedure \*MSeqimage\^{e,\*bi,\*bj}\fR produces a string image
        !          2874: of the result sequence for the expression \*Me\fR. The first \*Mi\fR
        !          2875: results are printed. If \*Mi\fR is omitted,
        !          2876: there is no limit. If there are more than \*Mi\fR results for
        !          2877: \*Me\fR, ellipses are provided in the image after the first \*Mi\fR.
        !          2878: If \*Mj\fR is specified, at most \*Mj\fR results from the end
        !          2879: of the sequence are printed after
        !          2880: the ellipses.
        !          2881: If \*Mj\fR is omitted, only the first \*Mi\fR results are produced.
        !          2882: .LP
        !          2883: For example, the expressions
        !          2884: .Ds
        !          2885: Seqimage\^{1 to 12}
        !          2886: Seqimage\^{1 to 12\*b,10}
        !          2887: Seqimage\^{1 to 12\*b,6\*b,3}
        !          2888: .De
        !          2889: produce, respectively,
        !          2890: .Ds
        !          2891: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
        !          2892: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...}
        !          2893: {1, 2, 3, 4, 5, 6, ..., 10, 11, 12}
        !          2894: .De
        !          2895: .LP
        !          2896: \fBWarning:\fR
        !          2897: If \*Mj\fR is not omitted and \*Me\fR has a infinite result
        !          2898: sequence, \*MSeqimage\fR does not terminate.
        !          2899: .NH
        !          2900: SNOBOL4 Pattern Matching: \*Mpatterns
        !          2901: .LP
        !          2902: These procedures
        !          2903: provide procedural equivalents for most SNOBOL4 patterns and
        !          2904: some extensions. See\*([<\*([[9\*(]-11\*(]]\*(>].
        !          2905: Procedures and their pattern equivalents are:
        !          2906: .RS
        !          2907: .IP \*MAny(s)\fR 1i
        !          2908: \*MANY(S)\fR
        !          2909: .IP \*MArb()\fR
        !          2910: \*MARB\fR
        !          2911: .IP \*MArbno(p)\fR
        !          2912: \*MARBNO(P)\fR
        !          2913: .IP \*MArbx(i)\fR
        !          2914: \*MARB(I)\fR
        !          2915: .IP \*MBal()\fR
        !          2916: \*MBAL\*M
        !          2917: .IP \*MBreak(s)\*M
        !          2918: \*MBREAK(S)\fR
        !          2919: .IP \*MBreakx(s)\fR
        !          2920: \*MBREAKX(S)\fR
        !          2921: .IP \*MCat(p1,\*bp2)\fR
        !          2922: \*MP1 P2\fR
        !          2923: .IP \*MDiscard(p)\fR
        !          2924: \*M/P\fR
        !          2925: .IP \*MExog(s)\fR
        !          2926: \*M\eS\fR
        !          2927: .IP \*MFind(s)\*M
        !          2928: \*MFIND(S)\fR
        !          2929: .IP \*MLen(i)\fR
        !          2930: \*MLEN(I)\fR
        !          2931: .IP \*MLimit(p,\*bi)\fR
        !          2932: \*MP \e i\fR
        !          2933: .IP \*MLocate(p)\fR
        !          2934: \*MLOCATE(P)\fR
        !          2935: .IP \*MMarb()\fR
        !          2936: \*M\fRlongest-first\*M ARB\fR
        !          2937: .IP \*MNotany(s)\fR
        !          2938: \*MNOTANY(S)\fR
        !          2939: .IP \*MPos(i)\fR
        !          2940: \*MPOS(I)\fR
        !          2941: .IP \*MReplace(p,\*bs)\fR
        !          2942: \*MP \(== S\fR
        !          2943: .IP \*MRpos(i)\fR
        !          2944: \*MRPOS(I)\fR
        !          2945: .IP \*MRtab(i)\fR
        !          2946: \*MRTAB(I)\fR
        !          2947: .IP \*MSpan(s)\*M
        !          2948: \*MSPAN(S)\fR
        !          2949: .IP \*MString(s)\fR
        !          2950: \*MS\fR
        !          2951: .IP \*MSucceed()\*M
        !          2952: \*MSUCCEED\fR
        !          2953: .IP \*MTab(i)\fR
        !          2954: \*MTAB(I)\fR
        !          2955: .IP \*MXform(f,\*bp)\*M
        !          2956: \*MF(P)\fR
        !          2957: .RE
        !          2958: .PP
        !          2959: The following procedures relate to the application and control of
        !          2960: pattern matching:
        !          2961: .RS
        !          2962: .IP \*MApply(s,\*bp)\fR 1i
        !          2963: \*MS ? P\fR
        !          2964: .IP \*MMode()\fR
        !          2965: \fRanchored or unanchored matching (see \*MAnchor\fR and \*MFloat\fR)
        !          2966: .IP \*MAnchor()\fR
        !          2967: \*M&ANCHOR = 1 \fR if \*MMode := Anchor
        !          2968: .IP \*MFloat()\*M
        !          2969: \*M&ANCHOR = 0 \fR if \*MMode := Float\fR
        !          2970: .RE
        !          2971: .LP
        !          2972: In addition to the procedures above, the following expressions can be
        !          2973: used:
        !          2974: .RS
        !          2975: .IP \*Mp1()\ |\ p2()\fR 1i
        !          2976: \*MP1 | P2\fR
        !          2977: .IP \*Mv\ <\-\ p()\fR
        !          2978: \*MP . V \fR (approximate)
        !          2979: .IP \*Mv\ :=\ p()\fR
        !          2980: \*MP $ V \fR (approximate)
        !          2981: .IP \*Mfail\fR
        !          2982: \*MFAIL\fR
        !          2983: .IP \*M=s\fR
        !          2984: \*MS\fR  (in place of \*MString(s)\fR)
        !          2985: .IP \*Mp1()\ ||\ p2()\fR
        !          2986: \*MP1 P2 \fR (in place of \*MCat(p1,\*bp2)\fR)
        !          2987: .RE
        !          2988: .LP
        !          2989: Using this system, most SNOBOL4 patterns can be satisfactorily transliterated
        !          2990: into Icon procedures and expressions. For example, the pattern
        !          2991: .Ds
        !          2992: SPAN("0123456789") $ N "H" LEN(*N) $ LIT
        !          2993: .De
        !          2994: can be transliterated into
        !          2995: .Ds
        !          2996: (n <\- Span('0123456789')) || ="H" ||
        !          2997:    (lit <\- Len(n))
        !          2998: .De
        !          2999: Concatenation of components is necessary to preserve the pattern-matching properties
        !          3000: of SNOBOL4.
        !          3001: See the documents referenced above for details and limitations.
        !          3002: .LP
        !          3003: \fBCaveats\fR:
        !          3004: Simulating SNOBOL4 pattern matching using the procedures above
        !          3005: is inefficient.
        !          3006: .NH
        !          3007: Defined Control Operations: \*Mpdco
        !          3008: LPP
        !          3009: These procedures
        !          3010: use co-expressions to used to model the built-in control
        !          3011: structures of Icon and also provide new ones. See\*([<\*([[12\*(]]\*(>].
        !          3012: .RS
        !          3013: .IP \*MAlt\^{e1,\*be2}\fR 1.5i
        !          3014: models \*Me1 | e2\fR
        !          3015: .IP \*MColseq\^{e1,\\*be2,\ \*(El}\fR
        !          3016: produces results of \*Me1\fR, \*Me2\fR, \*(El alternately
        !          3017: .IP \*MComseq\^{e1,\*be2}\fR
        !          3018: compares result sequences of \*Me1\fR and \*Me2\fR
        !          3019: .IP \*MCond\^{e1,\*be2,\ \*(El}\fR
        !          3020: models the generalized Lisp conditional
        !          3021: .IP \*MEvery\^{e1,\*be2}\fR
        !          3022: models \*Mevery e1 do e2\fR
        !          3023: .IP \*MGalt\^{e1,\*be2,\ \*(El}\fR
        !          3024: models generalized alternation: \*Me1 | e2 | \*(El\fR
        !          3025: .IP \*MLcond\^{e1,\*be2,\ \*(El}\fR
        !          3026: models the Lisp conditional
        !          3027: .IP \*MLimit\^{e1,\*be2}\fR
        !          3028: models \*Me1 \e e2\fR
        !          3029: .IP \*MRanseq\^{e1,\*be2,\ \*(El}\fR
        !          3030: produces results of \*Me1\fR, \*Me2\fR, \*(El at random
        !          3031: .IP \*MRepalt\^{e}\fR
        !          3032: models \*M|e\fR
        !          3033: .IP \*MResume\^{e1,\*be2,\*be3}\fR
        !          3034: models \*Mevery e1 \e e2 do e3\fR
        !          3035: .IP \*MSelect\^{e1,\*be2}\fR
        !          3036: produces results from \*Me1\fR by position according to \*Me2\fR
        !          3037: .RE
        !          3038: .LP
        !          3039: \fBComments\fR:
        !          3040: Because of the handling of the scope of local identifiers in co-expressions,
        !          3041: expressions in programmer-defined control operations cannot communicate
        !          3042: through local identifiers.
        !          3043: Some constructions, such
        !          3044: as \*Mbreak\fR and \*Mreturn\fR, cannot be used in arguments to programmer-defined
        !          3045: control operations.
        !          3046: .NH
        !          3047: Defined Control Regimes: \*Mpdae
        !          3048: .LP
        !          3049: These procedures
        !          3050: use co-expressions to model the built-in argument
        !          3051: evaluation regime of Icon and also provide new ones.
        !          3052: See\*([<\*([[13\*(]]\*(>].
        !          3053: .RS
        !          3054: .IP \*MAllpar\^{e1,\*be2,\ \*(El}\fR 1.5i
        !          3055: parallel evaluation with last result used for short sequences
        !          3056: .IP \*MExtract\^{e1,\*be2,\ \*(El}\fR
        !          3057: extract results of even-numbered arguments according to
        !          3058: odd-numbered values
        !          3059: .IP \*MLifo\^{e1,\*be2,\ \*(El}\fR
        !          3060: models standard Icon ``lifo'' evaluation
        !          3061: .IP \*MParallel\^{e1,\*be2,\ \*(El}\fR
        !          3062: parallel evaluation terminating on shortest sequence
        !          3063: .IP \*MReverse\^{e1,\*be2,\ \*(El}\fR
        !          3064: left-to-right reversal of lifo evaluation
        !          3065: .IP \*MRotate\^{e1,\*be2,\ \*(El}\fR
        !          3066: parallel evaluation with shorter sequences re-evaluated
        !          3067: .IP \*MSimple\^{e1,\*be2,\ \*(El}\fR
        !          3068: simple evaluation with only success or failure
        !          3069: .RE
        !          3070: .LP
        !          3071: \fBComments:\fR
        !          3072: Because of the handling of the scope of local identifiers in co-expressions,
        !          3073: expressions in programmer-defined argument evaluation regimes cannot communicate
        !          3074: through local identifiers.
        !          3075: Some constructions, such
        !          3076: as \*Mbreak\fR and \*Mreturn\fR, cannot be used in arguments to programmer-defined
        !          3077: argument evaluation regimes.
        !          3078: .LP
        !          3079: At most 10 arguments can be used in the invocation of a programmer-defined
        !          3080: argument evaluation regime. This limit can be increased by
        !          3081: modifying \*MCall\fR, a utility procedure that is included.
        !          3082: .rm CH
        !          3083: .bp
        !          3084: .[]
        !          3085: .[-
        !          3086: .ds [F 1
        !          3087: .ds [A R\*(p]\*(a]E\*(p] Griswold
        !          3088: .as [A \*(n]M\*(p]\*(a]T\*(p] Griswold
        !          3089: .ds [T The Icon Programming Language
        !          3090: .ds [I Prentice-Hall, Inc.
        !          3091: .ds [C Englewood Cliffs, NJ
        !          3092: .ds [D 1983
        !          3093: .][
        !          3094: .[-
        !          3095: .ds [F 2
        !          3096: .ds [A R\*(p]\*(a]E\*(p] Griswold
        !          3097: .as [A \*(c]W\*(p]\*(a]H\*(p] Mitchell
        !          3098: .as [A \*(m]J\*(p] O'Bagy
        !          3099: .ds [T \fIVersion 6.0 of Icon\fR
        !          3100: .ds [R The Univ. of Arizona Tech. Rep. 86-10
        !          3101: .ds [D May 1986
        !          3102: .][
        !          3103: .[-
        !          3104: .ds [F 3
        !          3105: .ds [A R\*(p]\*(a]E\*(p] Griswold
        !          3106: .ds [T \fIThe Translation and Execution of Icon Programs under MS-DOS\fR
        !          3107: .ds [R The Univ. of Arizona Tech. Rep.
        !          3108: .ds [D Dec. 1985
        !          3109: .][
        !          3110: .[-
        !          3111: .ds [F 4
        !          3112: .ds [A G\*(p]\*(a]M\*(p] Townsend
        !          3113: .ds [T \fIUsing Version 6.0 of Icon Under VMS\fR
        !          3114: .ds [R The Univ. of Arizona Tech. Rep.
        !          3115: .ds [D May 1986
        !          3116: .][
        !          3117: .[-
        !          3118: .ds [F 5
        !          3119: .ds [A R\*(p]\*(a]E\*(p] Griswold
        !          3120: .ds [T \fIProgramming in Icon; Problems and Solutions from the Icon Newsletter\fR
        !          3121: .ds [R The Univ. of Arizona Tech. Rep. 86-2
        !          3122: .ds [D Jan. 1986
        !          3123: .][
        !          3124: .[-
        !          3125: .ds [F 6
        !          3126: .ds [A C\*(p]\*(a]S\*(p] Wetherwell
        !          3127: .ds [T ``Probablistic Languages: A Review and Some Open Questions''
        !          3128: .ds [J Computing Surveys
        !          3129: .ds [V 12
        !          3130: .ds [N 4
        !          3131: .nr [P 1
        !          3132: .ds [P 362-379
        !          3133: .ds [D 1980
        !          3134: .][
        !          3135: .[-
        !          3136: .ds [F 7
        !          3137: .ds [A A\*(p] Salomaa
        !          3138: .ds [T Formal Languages
        !          3139: .ds [I Academic Press
        !          3140: .ds [D 1973
        !          3141: .][
        !          3142: .[-
        !          3143: .ds [F 8
        !          3144: .ds [A D\*(p]\*(a]B\*(p] Anderson
        !          3145: .as [A \*(n]M\*(p]\*(a]R\*(p] Sleep
        !          3146: .ds [T ``Uniform Random Generation of Balanced Parenthesis Strings''
        !          3147: .ds [J ACM Trans. Prog. Lang. and Systems
        !          3148: .ds [V 2
        !          3149: .ds [N 1
        !          3150: .nr [P 1
        !          3151: .ds [P 122-128
        !          3152: .ds [D 1980
        !          3153: .][
        !          3154: .[-
        !          3155: .ds [F 9
        !          3156: .ds [A R\*(p]\*(a]E\*(p] Griswold
        !          3157: .ds [T \fIPattern Matching in Icon\fR
        !          3158: .ds [R The Univ. of Arizona Tech. Rep. 80-25
        !          3159: .ds [d Oct. 1980
        !          3160: .][
        !          3161: .[-
        !          3162: .ds [F 10
        !          3163: .ds [A R\*(p]\*(a]E\*(p] Griswold
        !          3164: .ds [T \fIModels of String Pattern Matching\fR
        !          3165: .ds [R The Univ. of Arizona Tech. Rep. 81-6
        !          3166: .ds [D May 1981
        !          3167: .][
        !          3168: .[-
        !          3169: .ds [F 11
        !          3170: .ds [A A\*(p]\*(a]C\*(p] Fleck
        !          3171: .ds [T ``Formal Models for String Patterns''
        !          3172: .ds [B Current Trends in Programming Methodology; Data Structuring
        !          3173: .ds [I Prentice-Hall, Inc.
        !          3174: .ds [C Englewood Cliffs, NJ
        !          3175: .ds [V IV
        !          3176: .ds [D 1978
        !          3177: .nr [P 1
        !          3178: .ds [P 216-240
        !          3179: .][
        !          3180: .[-
        !          3181: .ds [F 12
        !          3182: .ds [A R\*(p]\*(a]E\*(p] Griswold
        !          3183: .as [A \*(n]M\*(p] Novak
        !          3184: .ds [T ``Programmer-Defined Control Operations''
        !          3185: .ds [J Computer J.
        !          3186: .ds [V 26
        !          3187: .ds [N 2
        !          3188: .ds [D May 1983
        !          3189: .nr [P 1
        !          3190: .ds [P 175-183
        !          3191: .][
        !          3192: .[-
        !          3193: .ds [F 13
        !          3194: .ds [A M\*(p] Novak
        !          3195: .as [A \*(n]R\*(p]\*(a]E\*(p] Griswold
        !          3196: .ds [T \fIProgrammer-Defined Argument Evaluation Regimes\fR
        !          3197: .ds [R The Univ. of Arizona Tech. Rep. 82-16
        !          3198: .ds [D Dec. 1982
        !          3199: .][

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.