ref: 7975eec3e602fd5bc3e93c78f4166259190f2fe9
parent: 147d51bf7c6cd8798ddb26e33d857be13a66c548
author: henesy <devnull@localhost>
date: Sun Nov 4 12:36:16 EST 2018
add os and such
--- /dev/null
+++ b/locale/Argentina
@@ -1,0 +1,1 @@
+ART -10800 ART -10800
--- /dev/null
+++ b/locale/Australia_ACT
@@ -1,0 +1,24 @@
+EST 36000 EST 39600
+ 57722400 68004000 89172000 100058400 120621600 131508000
+ 152071200 162957600 183520800 195012000 215575200 226461600
+ 247024800 257911200 278474400 289360800 309924000 320810400
+ 341373600 352260000 372823200 386733600 404877600 415764000
+ 436327200 447213600 467776800 478663200 499226400 511322400
+ 530071200 542772000 562125600 574826400 594180000 606276000
+ 625629600 636516000 657079200 667965600 688528800 699415200
+ 719978400 731469600 752032800 762919200 783482400 794368800
+ 814932000 825818400 846381600 857268000 877831200 888717600
+ 909280800 920772000 941335200 952221600 972784800 983671200
+1004234400 1015120800 1035684000 1046570400 1067133600 1078624800
+1099188000 1110074400 1130637600 1141524000 1162087200 1172973600
+1193536800 1204423200 1224986400 1235872800 1256436000 1267927200
+1288490400 1299376800 1319940000 1330826400 1351389600 1362276000
+1382839200 1393725600 1414288800 1425175200 1445738400 1457229600
+1477792800 1488679200 1509242400 1520128800 1540692000 1551578400
+1572141600 1583028000 1603591200 1615082400 1635645600 1646532000
+1667095200 1677981600 1698544800 1709431200 1729994400 1740880800
+1761444000 1772330400 1792893600 1804384800 1824948000 1835834400
+1856397600 1867284000 1887847200 1898733600 1919296800 1930183200
+1950746400 1962237600 1982800800 1993687200 2014250400 2025136800
+2045700000 2056586400 2077149600 2088036000 2108599200 2119485600
+2140048800
--- /dev/null
+++ b/locale/Australia_Broken-Hill
@@ -1,0 +1,24 @@
+??? 32400 ??? 36000
+ 57722400 68004000 89172000 100058400 120621600 131508000
+ 152071200 162957600 183520800 195012000 215575200 226461600
+ 247024800 257911200 278474400 289360800 309924000 320810400
+ 341373600 352260000 372823200 386733600 404877600 415764000
+ 436327200 447213600 467776800 478663200 499226400 511322400
+ 530071200 542772000 562125600 574826400 594180000 606276000
+ 625629600 636516000 657079200 667965600 688528800 699415200
+ 719978400 731469600 752032800 762919200 783482400 794368800
+ 814932000 825818400 846381600 857268000 877831200 888717600
+ 909280800 920772000 941335200 952221600 972784800 983671200
+1004234400 1015120800 1035684000 1046570400 1067133600 1078624800
+1099188000 1110074400 1130637600 1141524000 1162087200 1172973600
+1193536800 1204423200 1224986400 1235872800 1256436000 1267927200
+1288490400 1299376800 1319940000 1330826400 1351389600 1362276000
+1382839200 1393725600 1414288800 1425175200 1445738400 1457229600
+1477792800 1488679200 1509242400 1520128800 1540692000 1551578400
+1572141600 1583028000 1603591200 1615082400 1635645600 1646532000
+1667095200 1677981600 1698544800 1709431200 1729994400 1740880800
+1761444000 1772330400 1792893600 1804384800 1824948000 1835834400
+1856397600 1867284000 1887847200 1898733600 1919296800 1930183200
+1950746400 1962237600 1982800800 1993687200 2014250400 2025136800
+2045700000 2056586400 2077149600 2088036000 2108599200 2119485600
+2140048800
--- /dev/null
+++ b/locale/Australia_LHI
@@ -1,0 +1,24 @@
+??? 37800 ??? 41400
+ 57722400 68004000 89172000 100058400 120621600 131508000
+ 152071200 162957600 183520800 195012000 215575200 226461600
+ 247024800 257911200 278474400 289360800 309924000 320810400
+ 341373600 352260000 372823200 386733600 404877600 415764000
+ 436327200 447213600 467776800 478663200 499226400 511322400
+ 530071200 542772000 562125600 574826400 594180000 606276000
+ 625629600 636516000 657079200 667965600 688528800 699415200
+ 719978400 731469600 752032800 762919200 783482400 794368800
+ 814932000 825818400 846381600 857268000 877831200 888717600
+ 909280800 920772000 941335200 952221600 972784800 983671200
+1004234400 1015120800 1035684000 1046570400 1067133600 1078624800
+1099188000 1110074400 1130637600 1141524000 1162087200 1172973600
+1193536800 1204423200 1224986400 1235872800 1256436000 1267927200
+1288490400 1299376800 1319940000 1330826400 1351389600 1362276000
+1382839200 1393725600 1414288800 1425175200 1445738400 1457229600
+1477792800 1488679200 1509242400 1520128800 1540692000 1551578400
+1572141600 1583028000 1603591200 1615082400 1635645600 1646532000
+1667095200 1677981600 1698544800 1709431200 1729994400 1740880800
+1761444000 1772330400 1792893600 1804384800 1824948000 1835834400
+1856397600 1867284000 1887847200 1898733600 1919296800 1930183200
+1950746400 1962237600 1982800800 1993687200 2014250400 2025136800
+2045700000 2056586400 2077149600 2088036000 2108599200 2119485600
+2140048800
--- /dev/null
+++ b/locale/Australia_NSW
@@ -1,0 +1,24 @@
+EST 36000 EST 39600
+ 57722400 68004000 89172000 100058400 120621600 131508000
+ 152071200 162957600 183520800 195012000 215575200 226461600
+ 247024800 257911200 278474400 289360800 309924000 320810400
+ 341373600 352260000 372823200 386733600 404877600 415764000
+ 436327200 447213600 467776800 478663200 499226400 511322400
+ 530071200 542772000 562125600 574826400 594180000 606276000
+ 625629600 636516000 657079200 667965600 688528800 699415200
+ 719978400 731469600 752032800 762919200 783482400 794368800
+ 814932000 825818400 846381600 857268000 877831200 888717600
+ 909280800 920772000 941335200 952221600 972784800 983671200
+1004234400 1015120800 1035684000 1046570400 1067133600 1078624800
+1099188000 1110074400 1130637600 1141524000 1162087200 1172973600
+1193536800 1204423200 1224986400 1235872800 1256436000 1267927200
+1288490400 1299376800 1319940000 1330826400 1351389600 1362276000
+1382839200 1393725600 1414288800 1425175200 1445738400 1457229600
+1477792800 1488679200 1509242400 1520128800 1540692000 1551578400
+1572141600 1583028000 1603591200 1615082400 1635645600 1646532000
+1667095200 1677981600 1698544800 1709431200 1729994400 1740880800
+1761444000 1772330400 1792893600 1804384800 1824948000 1835834400
+1856397600 1867284000 1887847200 1898733600 1919296800 1930183200
+1950746400 1962237600 1982800800 1993687200 2014250400 2025136800
+2045700000 2056586400 2077149600 2088036000 2108599200 2119485600
+2140048800
--- /dev/null
+++ b/locale/Australia_North
@@ -1,0 +1,1 @@
+CST 34200 CST 34200
--- /dev/null
+++ b/locale/Australia_Queensland
@@ -1,0 +1,3 @@
+EST 36000 EST 39600
+ 57722400 68004000 625629600 636516000 657079200 667965600
+ 688528800 699415200
--- /dev/null
+++ b/locale/Australia_South
@@ -1,0 +1,24 @@
+CST 34200 CST 37800
+ 57722400 68608800 89172000 100058400 120621600 131508000
+ 152071200 162957600 183520800 195012000 215575200 226461600
+ 247024800 257911200 278474400 289360800 309924000 320810400
+ 341373600 352260000 372823200 384314400 404877600 415764000
+ 436327200 447213600 467776800 478663200 499226400 511322400
+ 530676000 542772000 562125600 574826400 594180000 606276000
+ 625629600 638330400 657079200 667965600 688528800 701229600
+ 719978400 731469600 752032800 764733600 783482400 794368800
+ 814932000 827632800 846381600 857268000 877831200 890532000
+ 909280800 920772000 941335200 954036000 972784800 983671200
+1004234400 1016935200 1035684000 1046570400 1067133600 1080439200
+1099188000 1110074400 1130637600 1143338400 1162087200 1172973600
+1193536800 1206237600 1224986400 1235872800 1256436000 1269741600
+1288490400 1299376800 1319940000 1332640800 1351389600 1362276000
+1382839200 1395540000 1414288800 1425175200 1445738400 1459044000
+1477792800 1488679200 1509242400 1521943200 1540692000 1551578400
+1572141600 1584842400 1603591200 1615082400 1635645600 1648346400
+1667095200 1677981600 1698544800 1711245600 1729994400 1740880800
+1761444000 1774144800 1792893600 1804384800 1824948000 1837648800
+1856397600 1867284000 1887847200 1900548000 1919296800 1930183200
+1950746400 1964052000 1982800800 1993687200 2014250400 2026951200
+2045700000 2056586400 2077149600 2089850400 2108599200 2119485600
+2140048800
--- /dev/null
+++ b/locale/Australia_Sturt
@@ -1,0 +1,24 @@
+??? 32400 ??? 36000
+ 57722400 68004000 89172000 100058400 120621600 131508000
+ 152071200 162957600 183520800 195012000 215575200 226461600
+ 247024800 257911200 278474400 289360800 309924000 320810400
+ 341373600 352260000 372823200 386733600 404877600 415764000
+ 436327200 447213600 467776800 478663200 499226400 511322400
+ 530071200 542772000 562125600 574826400 594180000 606276000
+ 625629600 636516000 657079200 667965600 688528800 699415200
+ 719978400 731469600 752032800 762919200 783482400 794368800
+ 814932000 825818400 846381600 857268000 877831200 888717600
+ 909280800 920772000 941335200 952221600 972784800 983671200
+1004234400 1015120800 1035684000 1046570400 1067133600 1078624800
+1099188000 1110074400 1130637600 1141524000 1162087200 1172973600
+1193536800 1204423200 1224986400 1235872800 1256436000 1267927200
+1288490400 1299376800 1319940000 1330826400 1351389600 1362276000
+1382839200 1393725600 1414288800 1425175200 1445738400 1457229600
+1477792800 1488679200 1509242400 1520128800 1540692000 1551578400
+1572141600 1583028000 1603591200 1615082400 1635645600 1646532000
+1667095200 1677981600 1698544800 1709431200 1729994400 1740880800
+1761444000 1772330400 1792893600 1804384800 1824948000 1835834400
+1856397600 1867284000 1887847200 1898733600 1919296800 1930183200
+1950746400 1962237600 1982800800 1993687200 2014250400 2025136800
+2045700000 2056586400 2077149600 2088036000 2108599200 2119485600
+2140048800
--- /dev/null
+++ b/locale/Australia_Tasmania
@@ -1,0 +1,24 @@
+EST 39600 EST 36000
+ 5713200 25671600 37767600 57726000 68007600 89175600
+ 100062000 120625200 131511600 152074800 162961200 183524400
+ 195015600 215578800 226465200 247028400 257914800 278478000
+ 289364400 309927600 320814000 341377200 352263600 372826800
+ 386132400 404881200 417582000 436330800 447217200 467780400
+ 478666800 499230000 510116400 530074800 542775600 562129200
+ 574830000 594183600 606279600 625633200 637729200 657082800
+ 670388400 686718000 701838000 718167600 733287600 749617200
+ 764737200 781066800 796186800 812516400 828241200 844570800
+ 859690800 876020400 891140400 907470000 922590000 938919600
+ 954039600 970369200 985489200 1002423600 1017543600 1033873200
+1048993200 1065322800 1080442800 1096772400 1111892400 1128222000
+1143342000 1159671600 1174791600 1191726000 1206846000 1223175600
+1238295600 1254625200 1269745200 1286074800 1301194800 1317524400
+1332644400 1349578800 1364698800 1381028400 1396148400 1412478000
+1427598000 1443927600 1459047600 1475377200 1490497200 1506826800
+1521946800 1538881200 1554001200 1570330800 1585450800 1601780400
+1616900400 1633230000 1648350000 1664679600 1679799600 1696129200
+1711854000 1728183600 1743303600 1759633200 1774753200 1791082800
+1806202800 1822532400 1837652400 1853982000 1869102000 1886036400
+1901156400 1917486000 1932606000 1948935600 1964055600 1980385200
+1995505200 2011834800 2026954800 2043284400 2058404400 2075338800
+2090458800 2106788400 2121908400 2138238000
--- /dev/null
+++ b/locale/Australia_Victoria
@@ -1,0 +1,24 @@
+EST 36000 EST 39600
+ 57722400 68004000 89172000 100058400 120621600 131508000
+ 152071200 162957600 183520800 195012000 215575200 226461600
+ 247024800 257911200 278474400 289360800 309924000 320810400
+ 341373600 352260000 372823200 384314400 404877600 415764000
+ 436327200 447213600 467776800 478663200 499226400 511322400
+ 530071200 542772000 561520800 574826400 594180000 606276000
+ 625629600 637725600 657079200 667965600 688528800 699415200
+ 719978400 731469600 752032800 762919200 783482400 794368800
+ 814932000 825818400 846381600 857268000 877831200 888717600
+ 909280800 920772000 941335200 952221600 972784800 983671200
+1004234400 1015120800 1035684000 1046570400 1067133600 1078624800
+1099188000 1110074400 1130637600 1141524000 1162087200 1172973600
+1193536800 1204423200 1224986400 1235872800 1256436000 1267927200
+1288490400 1299376800 1319940000 1330826400 1351389600 1362276000
+1382839200 1393725600 1414288800 1425175200 1445738400 1457229600
+1477792800 1488679200 1509242400 1520128800 1540692000 1551578400
+1572141600 1583028000 1603591200 1615082400 1635645600 1646532000
+1667095200 1677981600 1698544800 1709431200 1729994400 1740880800
+1761444000 1772330400 1792893600 1804384800 1824948000 1835834400
+1856397600 1867284000 1887847200 1898733600 1919296800 1930183200
+1950746400 1962237600 1982800800 1993687200 2014250400 2025136800
+2045700000 2056586400 2077149600 2088036000 2108599200 2119485600
+2140048800
--- /dev/null
+++ b/locale/Australia_West
@@ -1,0 +1,3 @@
+WST 28800 WDT 32400
+ 152071200 162957600 436327200 447213600 690343200 699415200
+1193536800 1206842400 1224986400 1238292000
--- /dev/null
+++ b/locale/Australia_Yancowinna
@@ -1,0 +1,24 @@
+CST 34200 CST 37800
+ 57722400 68004000 89172000 100058400 120621600 131508000
+ 152071200 162957600 183520800 195012000 215575200 226461600
+ 247024800 257911200 278474400 289360800 309924000 320810400
+ 341373600 352260000 372823200 386733600 404877600 415764000
+ 436327200 447213600 467776800 478663200 499226400 511322400
+ 530071200 542772000 562125600 574826400 594180000 606276000
+ 625629600 636516000 657079200 667965600 688528800 699415200
+ 719978400 731469600 752032800 762919200 783482400 794368800
+ 814932000 825818400 846381600 857268000 877831200 888717600
+ 909280800 920772000 941335200 952221600 972784800 983671200
+1004234400 1015120800 1035684000 1046570400 1067133600 1078624800
+1099188000 1110074400 1130637600 1141524000 1162087200 1172973600
+1193536800 1204423200 1224986400 1235872800 1256436000 1267927200
+1288490400 1299376800 1319940000 1330826400 1351389600 1362276000
+1382839200 1393725600 1414288800 1425175200 1445738400 1457229600
+1477792800 1488679200 1509242400 1520128800 1540692000 1551578400
+1572141600 1583028000 1603591200 1615082400 1635645600 1646532000
+1667095200 1677981600 1698544800 1709431200 1729994400 1740880800
+1761444000 1772330400 1792893600 1804384800 1824948000 1835834400
+1856397600 1867284000 1887847200 1898733600 1919296800 1930183200
+1950746400 1962237600 1982800800 1993687200 2014250400 2025136800
+2045700000 2056586400 2077149600 2088036000 2108599200 2119485600
+2140048800
--- /dev/null
+++ b/locale/Brazil_Acre
@@ -1,0 +1,18 @@
+AST -18000 ADT -14400
+ 561952800 571626000 593402400 603075600 625543200 634525200
+ 656906400 665974800 688356000 697424400 719805600 729478800
+ 751255200 760928400 782704800 792378000 814845600 823827600
+ 846208800 855277200 877658400 887418000 909108000 918781200
+ 940557600 950230800 972698400 981680400 1004061600 1013130000
+1035511200 1044579600 1066960800 1076720400 1098410400 1108083600
+1129860000 1139533200 1162000800 1170982800 1193364000 1202432400
+1224813600 1234573200 1256263200 1265936400 1287712800 1297386000
+1319162400 1328835600 1351216800 1360285200 1382666400 1391734800
+1414116000 1423875600 1445565600 1455238800 1477015200 1486688400
+1509156000 1518138000 1540519200 1549587600 1571968800 1581037200
+1603418400 1613091600 1634868000 1644541200 1666317600 1675990800
+1698458400 1707440400 1729821600 1738890000 1761271200 1771030800
+1792720800 1802394000 1824170400 1833843600 1856311200 1865293200
+1887674400 1896742800 1919124000 1928192400 1950573600 1960333200
+1982023200 1991696400 2013472800 2023146000 2045613600 2054595600
+2076976800 2086045200 2108426400 2118186000 2139876000
--- /dev/null
+++ b/locale/Brazil_DeNoronha
@@ -1,0 +1,18 @@
+FST -7200 FDT -3600
+ 561952800 571626000 593402400 603075600 625543200 634525200
+ 656906400 665974800 688356000 697424400 719805600 729478800
+ 751255200 760928400 782704800 792378000 814845600 823827600
+ 846208800 855277200 877658400 887418000 909108000 918781200
+ 940557600 950230800 972698400 981680400 1004061600 1013130000
+1035511200 1044579600 1066960800 1076720400 1098410400 1108083600
+1129860000 1139533200 1162000800 1170982800 1193364000 1202432400
+1224813600 1234573200 1256263200 1265936400 1287712800 1297386000
+1319162400 1328835600 1351216800 1360285200 1382666400 1391734800
+1414116000 1423875600 1445565600 1455238800 1477015200 1486688400
+1509156000 1518138000 1540519200 1549587600 1571968800 1581037200
+1603418400 1613091600 1634868000 1644541200 1666317600 1675990800
+1698458400 1707440400 1729821600 1738890000 1761271200 1771030800
+1792720800 1802394000 1824170400 1833843600 1856311200 1865293200
+1887674400 1896742800 1919124000 1928192400 1950573600 1960333200
+1982023200 1991696400 2013472800 2023146000 2045613600 2054595600
+2076976800 2086045200 2108426400 2118186000 2139876000
--- /dev/null
+++ b/locale/Brazil_East
@@ -1,0 +1,18 @@
+EST -10800 EDT -7200
+ 561952800 571626000 593402400 603075600 625543200 634525200
+ 656906400 665974800 688356000 697424400 719805600 729478800
+ 751255200 760928400 782704800 792378000 814845600 823827600
+ 846208800 855277200 877658400 887418000 909108000 918781200
+ 940557600 950230800 972698400 981680400 1004061600 1013130000
+1035511200 1044579600 1066960800 1076720400 1098410400 1108083600
+1129860000 1139533200 1162000800 1170982800 1193364000 1202432400
+1224813600 1234573200 1256263200 1265936400 1287712800 1297386000
+1319162400 1328835600 1351216800 1360285200 1382666400 1391734800
+1414116000 1423875600 1445565600 1455238800 1477015200 1486688400
+1509156000 1518138000 1540519200 1549587600 1571968800 1581037200
+1603418400 1613091600 1634868000 1644541200 1666317600 1675990800
+1698458400 1707440400 1729821600 1738890000 1761271200 1771030800
+1792720800 1802394000 1824170400 1833843600 1856311200 1865293200
+1887674400 1896742800 1919124000 1928192400 1950573600 1960333200
+1982023200 1991696400 2013472800 2023146000 2045613600 2054595600
+2076976800 2086045200 2108426400 2118186000 2139876000
--- /dev/null
+++ b/locale/Brazil_West
@@ -1,0 +1,18 @@
+WST -14400 WDT -10800
+ 561952800 571626000 593402400 603075600 625543200 634525200
+ 656906400 665974800 688356000 697424400 719805600 729478800
+ 751255200 760928400 782704800 792378000 814845600 823827600
+ 846208800 855277200 877658400 887418000 909108000 918781200
+ 940557600 950230800 972698400 981680400 1004061600 1013130000
+1035511200 1044579600 1066960800 1076720400 1098410400 1108083600
+1129860000 1139533200 1162000800 1170982800 1193364000 1202432400
+1224813600 1234573200 1256263200 1265936400 1287712800 1297386000
+1319162400 1328835600 1351216800 1360285200 1382666400 1391734800
+1414116000 1423875600 1445565600 1455238800 1477015200 1486688400
+1509156000 1518138000 1540519200 1549587600 1571968800 1581037200
+1603418400 1613091600 1634868000 1644541200 1666317600 1675990800
+1698458400 1707440400 1729821600 1738890000 1761271200 1771030800
+1792720800 1802394000 1824170400 1833843600 1856311200 1865293200
+1887674400 1896742800 1919124000 1928192400 1950573600 1960333200
+1982023200 1991696400 2013472800 2023146000 2045613600 2054595600
+2076976800 2086045200 2108426400 2118186000 2139876000
--- /dev/null
+++ b/locale/CET
@@ -1,0 +1,19 @@
+CET 3600 CET 7200
+ 512532000 528256800 543981600 559706400 575431200 591156000
+ 606880800 622605600 638330400 654660000 670384800 686109600
+ 701834400 717559200 733284000 749008800 764733600 780458400
+ 796183200 811908000 828237600 846381600 859687200 877831200
+ 891136800 909280800 922586400 941335200 954036000 972784800
+ 985485600 1004234400 1017540000 1035684000 1048989600 1067133600
+1080439200 1099188000 1111888800 1130637600 1143338400 1162087200
+1174788000 1193536800 1206842400 1224986400 1238292000 1256436000
+1269741600 1288490400 1301191200 1319940000 1332640800 1351389600
+1364695200 1382839200 1396144800 1414288800 1427594400 1445738400
+1459044000 1477792800 1490493600 1509242400 1521943200 1540692000
+1553997600 1572141600 1585447200 1603591200 1616896800 1635645600
+1648346400 1667095200 1679796000 1698544800 1711850400 1729994400
+1743300000 1761444000 1774749600 1792893600 1806199200 1824948000
+1837648800 1856397600 1869098400 1887847200 1901152800 1919296800
+1932602400 1950746400 1964052000 1982800800 1995501600 2014250400
+2026951200 2045700000 2058400800 2077149600 2090455200 2108599200
+2121904800 2140048800
--- /dev/null
+++ b/locale/CST.CDT
@@ -1,0 +1,24 @@
+CST -21600 CDT -18000
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Canada_Atlantic
@@ -1,0 +1,24 @@
+AST -14400 ADT -10800
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 136346400 152067600 167796000 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Canada_Central
@@ -1,0 +1,24 @@
+CST -21600 CDT -18000
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 136346400 152067600 167796000 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Canada_East-Saskatchewan
@@ -1,0 +1,1 @@
+CST -21600 CST -21600
--- /dev/null
+++ b/locale/Canada_Eastern
@@ -1,0 +1,24 @@
+EST -18000 EDT -14400
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 136346400 152067600 167796000 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Canada_Mountain
@@ -1,0 +1,24 @@
+MST -25200 MDT -21600
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 136346400 152067600 167796000 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Canada_Newfoundland
@@ -1,0 +1,24 @@
+NST -12600 NDT -9000
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 136346400 152067600 167796000 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Canada_Pacific
@@ -1,0 +1,24 @@
+PST -28800 PDT -25200
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 136346400 152067600 167796000 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Canada_Yukon
@@ -1,0 +1,24 @@
+YST -32400 YDT -28800
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 136346400 152067600 167796000 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Chile_Continental
@@ -1,0 +1,18 @@
+CST -14400 CDT -10800
+ 560916000 574218000 592365600 605667600 623815200 637117200
+ 655869600 668566800 687319200 700016400 718768800 732070800
+ 750218400 763520400 781668000 794970000 813117600 826419600
+ 845172000 857869200 876621600 889318800 908071200 921373200
+ 939520800 952822800 970970400 984272400 1003024800 1015722000
+1034474400 1047171600 1065924000 1079226000 1097373600 1110675600
+1128823200 1142125200 1160272800 1173574800 1192327200 1205024400
+1223776800 1236474000 1255226400 1268528400 1286676000 1299978000
+1318125600 1331427600 1350180000 1362877200 1381629600 1394326800
+1413079200 1425776400 1444528800 1457830800 1475978400 1489280400
+1507428000 1520730000 1539482400 1552179600 1570932000 1583629200
+1602381600 1615683600 1633831200 1647133200 1665280800 1678582800
+1696730400 1710032400 1728784800 1741482000 1760234400 1772931600
+1791684000 1804986000 1823133600 1836435600 1854583200 1867885200
+1886637600 1899334800 1918087200 1930784400 1949536800 1962838800
+1980986400 1994288400 2012436000 2025738000 2043885600 2057187600
+2075940000 2088637200 2107389600 2120086800 2138839200
--- /dev/null
+++ b/locale/Chile_EasterIsland
@@ -1,0 +1,18 @@
+EST -21600 EDT -18000
+ 560916000 574218000 592365600 605667600 623815200 637117200
+ 655869600 668566800 687319200 700016400 718768800 732070800
+ 750218400 763520400 781668000 794970000 813117600 826419600
+ 845172000 857869200 876621600 889318800 908071200 921373200
+ 939520800 952822800 970970400 984272400 1003024800 1015722000
+1034474400 1047171600 1065924000 1079226000 1097373600 1110675600
+1128823200 1142125200 1160272800 1173574800 1192327200 1205024400
+1223776800 1236474000 1255226400 1268528400 1286676000 1299978000
+1318125600 1331427600 1350180000 1362877200 1381629600 1394326800
+1413079200 1425776400 1444528800 1457830800 1475978400 1489280400
+1507428000 1520730000 1539482400 1552179600 1570932000 1583629200
+1602381600 1615683600 1633831200 1647133200 1665280800 1678582800
+1696730400 1710032400 1728784800 1741482000 1760234400 1772931600
+1791684000 1804986000 1823133600 1836435600 1854583200 1867885200
+1886637600 1899334800 1918087200 1930784400 1949536800 1962838800
+1980986400 1994288400 2012436000 2025738000 2043885600 2057187600
+2075940000 2088637200 2107389600 2120086800 2138839200
--- /dev/null
+++ b/locale/Cuba
@@ -1,0 +1,21 @@
+CST -18000 CDT -14400
+ 290563200 308703600 322012800 340153200 358300800 371602800
+ 389750400 403052400 421200000 434502000 453254400 466556400
+ 484704000 498006000 516153600 529455600 547603200 560905200
+ 579052800 592354800 611107200 623804400 642556800 655858800
+ 674006400 687308400 705456000 718758000 736905600 750207600
+ 768355200 781657200 800409600 813106800 831859200 845161200
+ 863308800 876610800 894758400 908060400 926208000 939510000
+ 958262400 970959600 989712000 1003014000 1021161600 1034463600
+1052611200 1065913200 1084060800 1097362800 1115510400 1128812400
+1147564800 1160262000 1179014400 1192316400 1210464000 1223766000
+1241913600 1255215600 1273363200 1286665200 1304812800 1318114800
+1336867200 1350169200 1368316800 1381618800 1399766400 1413068400
+1431216000 1444518000 1462665600 1475967600 1494720000 1507417200
+1526169600 1539471600 1557619200 1570921200 1589068800 1602370800
+1620518400 1633820400 1651968000 1665270000 1684022400 1696719600
+1715472000 1728774000 1746921600 1760223600 1778371200 1791673200
+1809820800 1823122800 1841875200 1854572400 1873324800 1886626800
+1904774400 1918076400 1936224000 1949526000 1967673600 1980975600
+1999123200 2012425200 2031177600 2043874800 2062627200 2075929200
+2094076800 2107378800 2125526400 2138828400
--- /dev/null
+++ b/locale/EET
@@ -1,0 +1,13 @@
+EET 7200 EEST 10800
+638334000 657082800 670388400 688532400 701838000 719982000
+733287600 752036400 764737200 783486000 796186800 814935600
+828241200 846385200 859690800 877834800 891140400 909284400
+922590000 941338800 954039600 972788400 985489200 1004238000
+1017543600 1035687600 1048993200 1067137200 1080442800 1099191600
+1111892400 1130641200 1143342000 1162090800 1174791600 1193540400
+1206846000 1224990000 1238295600 1256439600 1269745200 1288494000
+1301194800 1319943600 1332644400 1351393200 1364698800 1382842800
+1396148400 1414292400 1427598000 1445742000 1459047600 1477796400
+1490497200 1509246000 1521946800 1540695600 1554001200 1572145200
+1585450800 1603594800 1616900400 1635649200 1648350000 1667098800
+1679799600 1698548400 1711854000 1729998000 1743303600 1761447600
--- /dev/null
+++ b/locale/EST.EDT
@@ -1,0 +1,24 @@
+EST -18000 EDT -14400
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Egypt
@@ -1,0 +1,23 @@
+EET 7200 EET 10800
+ 10375200 23590800 41911200 55126800 73533600 86749200
+ 105069600 118285200 136605600 149821200 168141600 181357200
+ 199764000 212979600 231300000 244515600 262836000 276051600
+ 294372000 307587600 325994400 339210000 420602400 433818000
+ 452224800 465440400 483760800 496976400 515296800 528512400
+ 546832800 560048400 578455200 591670800 609991200 623206800
+ 641527200 654742800 673063200 686278800 704685600 717901200
+ 736221600 749437200 767757600 780973200 799293600 812509200
+ 830916000 844131600 862452000 875667600 893988000 907203600
+ 925524000 938739600 957146400 970362000 988682400 1001898000
+1020218400 1033434000 1051754400 1064970000 1083376800 1096592400
+1114912800 1128128400 1146448800 1159664400 1177984800 1191200400
+1209607200 1222822800 1241143200 1254358800 1272679200 1285894800
+1304215200 1317430800 1335837600 1349053200 1367373600 1380589200
+1398909600 1412125200 1430445600 1443661200 1462068000 1475283600
+1493604000 1506819600 1525140000 1538355600 1556676000 1569891600
+1588298400 1601514000 1619834400 1633050000 1651370400 1664586000
+1682906400 1696122000 1714528800 1727744400 1746064800 1759280400
+1777600800 1790816400 1809136800 1822352400 1840759200 1853974800
+1872295200 1885510800 1903831200 1917046800 1935367200 1948582800
+1966989600 1980205200 1998525600 2011741200 2030061600 2043277200
+2061597600 2074813200 2093220000 2106435600 2124756000 2137971600
--- /dev/null
+++ b/locale/GB-Eire
@@ -1,0 +1,19 @@
+GMT 0 BST 3600
+ 512528400 530672400 543978000 562122000 575427600 593571600
+ 606877200 625626000 638326800 657075600 670381200 688525200
+ 701830800 719974800 733280400 751424400 764730000 782874000
+ 796179600 814928400 828234000 846378000 859683600 877827600
+ 891133200 909277200 922582800 940726800 954032400 972781200
+ 985482000 1004230800 1017536400 1035680400 1048986000 1067130000
+1080435600 1099184400 1111885200 1130634000 1143334800 1162083600
+1174784400 1193533200 1206838800 1224982800 1238288400 1256432400
+1269738000 1288486800 1301187600 1319936400 1332637200 1351386000
+1364691600 1382835600 1396141200 1414285200 1427590800 1445734800
+1459040400 1477789200 1490490000 1509238800 1521939600 1540688400
+1553994000 1572138000 1585443600 1603587600 1616893200 1635642000
+1648342800 1667091600 1679792400 1698541200 1711846800 1729990800
+1743296400 1761440400 1774746000 1792890000 1806195600 1824944400
+1837645200 1856394000 1869094800 1887843600 1901149200 1919293200
+1932598800 1950742800 1964048400 1982797200 1995498000 2014246800
+2026947600 2045696400 2058397200 2077146000 2090451600 2108595600
+2121901200 2140045200 2147483647
--- /dev/null
+++ b/locale/GMT
@@ -1,0 +1,1 @@
+GMT 0
--- /dev/null
+++ b/locale/HST
@@ -1,0 +1,1 @@
+HST -36000 HST -36000
--- /dev/null
+++ b/locale/Hongkong
@@ -1,0 +1,1 @@
+HKT 28800 HKT 28800
--- /dev/null
+++ b/locale/Iceland
@@ -1,0 +1,1 @@
+WET 0 WET 0
--- /dev/null
+++ b/locale/Iran
@@ -1,0 +1,18 @@
+IST 12600 IDT 16200
+ 575431200 590547600 606880800 621997200 638330400 653446800
+ 670384800 684896400 701834400 716950800 733284000 748400400
+ 764733600 779850000 796183200 811299600 828237600 842749200
+ 859687200 874803600 891136800 906253200 922586400 937702800
+ 954036000 969152400 985485600 1000602000 1017540000 1032051600
+1048989600 1064106000 1080439200 1095555600 1111888800 1127005200
+1143338400 1158454800 1174788000 1189904400 1206842400 1221958800
+1238292000 1253408400 1269741600 1284858000 1301191200 1316307600
+1332640800 1347757200 1364695200 1379206800 1396144800 1411261200
+1427594400 1442710800 1459044000 1474160400 1490493600 1505610000
+1521943200 1537059600 1553997600 1568509200 1585447200 1600563600
+1616896800 1632013200 1648346400 1663462800 1679796000 1694912400
+1711850400 1726362000 1743300000 1758416400 1774749600 1789866000
+1806199200 1821315600 1837648800 1852765200 1869098400 1884214800
+1901152800 1915664400 1932602400 1947718800 1964052000 1979168400
+1995501600 2010618000 2026951200 2042067600 2058400800 2073517200
+2090455200 2105571600 2121904800 2137021200
--- /dev/null
+++ b/locale/Israel
@@ -1,0 +1,4 @@
+IST 7200 IDT 10800
+609890400 620776800 638316000 651621600 669765600 683676000
+701820000 715730400 733701600 747180000 765151200 778024800
+796600800 810079200
--- /dev/null
+++ b/locale/Jamaica
@@ -1,0 +1,24 @@
+EST -18000 EDT -14400
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Japan
@@ -1,0 +1,1 @@
+JST 32400 JST 32400
--- /dev/null
+++ b/locale/Libya
@@ -1,0 +1,20 @@
+EET 7200 EET 10800
+ 386474400 402195600 418010400 433731600 449632800 465354000
+ 481168800 496890000 512704800 528426000 544240800 559962000
+ 575863200 591584400 607399200 623120400 638935200 654656400
+ 670471200 686192400 702093600 717814800 733629600 749350800
+ 765165600 780886800 796701600 812422800 828324000 844045200
+ 859860000 875581200 891396000 907117200 922932000 938653200
+ 954554400 970275600 986090400 1001811600 1017626400 1033347600
+1049162400 1064883600 1080784800 1096506000 1112320800 1128042000
+1143856800 1159578000 1175392800 1191114000 1207015200 1222736400
+1238551200 1254272400 1270087200 1285808400 1301623200 1317344400
+1333245600 1348966800 1364781600 1380502800 1396317600 1412038800
+1427853600 1443574800 1459476000 1475197200 1491012000 1506733200
+1522548000 1538269200 1554084000 1569805200 1585706400 1601427600
+1617242400 1632963600 1648778400 1664499600 1680314400 1696035600
+1711936800 1727658000 1743472800 1759194000 1775008800 1790730000
+1806544800 1822266000 1838167200 1853888400 1869703200 1885424400
+1901239200 1916960400 1932775200 1948496400 1964397600 1980118800
+1995933600 2011654800 2027469600 2043190800 2059005600 2074726800
+2090628000 2106349200 2122164000 2137885200
--- /dev/null
+++ b/locale/MET
@@ -1,0 +1,19 @@
+MET 3600 MDT 7200
+ 512532000 528256800 543981600 559706400 575431200 591156000
+ 606880800 622605600 638330400 654660000 670384800 686109600
+ 701834400 717559200 733284000 749008800 764733600 780458400
+ 796183200 811908000 828237600 846381600 859687200 877831200
+ 891136800 909280800 922586400 941335200 954036000 972784800
+ 985485600 1004234400 1017540000 1035684000 1048989600 1067133600
+1080439200 1099188000 1111888800 1130637600 1143338400 1162087200
+1174788000 1193536800 1206842400 1224986400 1238292000 1256436000
+1269741600 1288490400 1301191200 1319940000 1332640800 1351389600
+1364695200 1382839200 1396144800 1414288800 1427594400 1445738400
+1459044000 1477792800 1490493600 1509242400 1521943200 1540692000
+1553997600 1572141600 1585447200 1603591200 1616896800 1635645600
+1648346400 1667095200 1679796000 1698544800 1711850400 1729994400
+1743300000 1761444000 1774749600 1792893600 1806199200 1824948000
+1837648800 1856397600 1869098400 1887847200 1901152800 1919296800
+1932602400 1950746400 1964052000 1982800800 1995501600 2014250400
+2026951200 2045700000 2058400800 2077149600 2090455200 2108599200
+2121904800 2140048800
--- /dev/null
+++ b/locale/MST.MDT
@@ -1,0 +1,24 @@
+MST -25200 MDT -21600
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Mexico_BajaNorte
@@ -1,0 +1,18 @@
+PST -28800 PDT -25200
+ 544586400 562122000 576036000 594176400 607485600 625626000
+ 638935200 657075600 670989600 688525200 702439200 719974800
+ 733888800 752029200 765338400 783478800 796788000 814928400
+ 828842400 846378000 860292000 877827600 891741600 909277200
+ 923191200 941331600 954640800 972781200 986090400 1004230800
+1018144800 1035680400 1049594400 1067130000 1081044000 1099184400
+1112493600 1130634000 1143943200 1162083600 1175392800 1193533200
+1207447200 1224982800 1238896800 1256432400 1270346400 1288486800
+1301796000 1319936400 1333245600 1351386000 1365300000 1382835600
+1396749600 1414285200 1428199200 1445734800 1459648800 1477789200
+1491098400 1509238800 1522548000 1540688400 1554602400 1572138000
+1586052000 1603587600 1617501600 1635642000 1648951200 1667091600
+1680400800 1698541200 1712455200 1729990800 1743904800 1761440400
+1775354400 1792890000 1806804000 1824944400 1838253600 1856394000
+1869703200 1887843600 1901757600 1919293200 1933207200 1950742800
+1964656800 1982797200 1996106400 2014246800 2027556000 2045696400
+2059005600 2077146000 2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Mexico_BajaSur
@@ -1,0 +1,1 @@
+MST -25200 MST -25200
--- /dev/null
+++ b/locale/Mexico_General
@@ -1,0 +1,1 @@
+CST -21600 CST -21600
--- /dev/null
+++ b/locale/Moscow
@@ -1,0 +1,12 @@
+MSK 10800 MSD 14400
+638330400 657079200 670384800 688528800 701834400 719978400
+733284000 752032800 764733600 783482400 796183200 814932000
+828237600 846381600 859687200 877831200 891136800 909280800
+922586400 941335200 954036000 972784800 985485600 1004234400
+1017540000 1035684000 1048989600 1067133600 1080439200 1099188000
+1111888800 1130637600 1143338400 1162087200 1174788000 1193536800
+1206842400 1224986400 1238292000 1256436000 1269741600 1288490400
+1301191200 1319940000 1332640800 1351389600 1364695200 1382839200
+1396144800 1414288800 1427594400 1445738400 1459044000 1477792800
+1490493600 1509242400 1521943200 1540692000 1553997600 1572141600
+1585447200 1603591200 1616896800 1635645600 1648346400
--- /dev/null
+++ b/locale/NOTICE
@@ -1,0 +1,29 @@
+This copyright NOTICE applies to all files in this directory and
+subdirectories, unless another copyright notice appears in a given
+file or subdirectory. If you take substantial code from this software to use in
+other programs, you must somehow include with it an appropriate
+copyright notice that includes the copyright notice and the other
+notices below. It is fine (and often tidier) to do that in a separate
+file such as NOTICE, LICENCE or COPYING.
+
+ Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
+ Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
--- /dev/null
+++ b/locale/NZ
@@ -1,0 +1,23 @@
+NZS 43200 NZD 46800
+ 152071200 162957600 183520800 195012000 215575200 226461600
+ 247024800 257911200 278474400 289360800 309924000 320810400
+ 341373600 352260000 372823200 384314400 404877600 415764000
+ 436327200 447213600 467776800 478663200 499226400 510112800
+ 530676000 541562400 562125600 573616800 594180000 605066400
+ 623815200 637725600 655264800 669175200 686714400 700624800
+ 718164000 732679200 749613600 764128800 781063200 795578400
+ 812512800 827028000 844567200 858477600 876016800 889927200
+ 907466400 921981600 938916000 953431200 970365600 984880800
+1002420000 1016330400 1033869600 1047780000 1065319200 1079834400
+1096768800 1111284000 1128218400 1142733600 1159668000 1174183200
+1191117600 1207447200 1222567200 1238896800 1254016800 1270346400
+1285466400 1301796000 1316916000 1333245600 1348970400 1365300000
+1380420000 1396749600 1411869600 1428199200 1443319200 1459648800
+1474768800 1491098400 1506823200 1522548000 1538272800 1554602400
+1569722400 1586052000 1601172000 1617501600 1632621600 1648951200
+1664071200 1680400800 1696125600 1712455200 1727575200 1743904800
+1759024800 1775354400 1790474400 1806804000 1821924000 1838253600
+1853978400 1869703200 1885428000 1901757600 1916877600 1933207200
+1948327200 1964656800 1979776800 1996106400 2011226400 2027556000
+2043280800 2059005600 2074730400 2091060000 2106180000 2122509600
+2137629600
--- /dev/null
+++ b/locale/NZ_CHAT
@@ -1,0 +1,1 @@
+NZ- 45900 NZ- 45900
--- /dev/null
+++ b/locale/Navajo
@@ -1,0 +1,24 @@
+MST -25200 MDT -21600
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/PRC
@@ -1,0 +1,24 @@
+CST 28800 CDT 32400
+ 8733600 22039200 40183200 53488800 71632800 84938400
+ 103082400 116388000 135136800 147837600 166586400 179892000
+ 198036000 211341600 229485600 242791200 260935200 274240800
+ 292384800 305690400 324439200 337744800 355888800 369194400
+ 387338400 400644000 418788000 432093600 450237600 463543200
+ 482292000 494992800 513741600 527047200 545191200 558496800
+ 576640800 589946400 608090400 621396000 639540000 652845600
+ 671594400 684295200 703044000 716349600 734493600 747799200
+ 765943200 779248800 797392800 810698400 829447200 842148000
+ 860896800 874202400 892346400 905652000 923796000 937101600
+ 955245600 968551200 986695200 1000000800 1018749600 1031450400
+1050199200 1063504800 1081648800 1094954400 1113098400 1126404000
+1144548000 1157853600 1175997600 1189303200 1208052000 1221357600
+1239501600 1252807200 1270951200 1284256800 1302400800 1315706400
+1333850400 1347156000 1365904800 1378605600 1397354400 1410660000
+1428804000 1442109600 1460253600 1473559200 1491703200 1505008800
+1523152800 1536458400 1555207200 1567908000 1586656800 1599962400
+1618106400 1631412000 1649556000 1662861600 1681005600 1694311200
+1713060000 1725760800 1744509600 1757815200 1775959200 1789264800
+1807408800 1820714400 1838858400 1852164000 1870308000 1883613600
+1902362400 1915063200 1933812000 1947117600 1965261600 1978567200
+1996711200 2010016800 2028160800 2041466400 2059610400 2072916000
+2091664800 2104970400 2123114400 2136420000
--- /dev/null
+++ b/locale/PST.PDT
@@ -1,0 +1,24 @@
+PST -28800 PDT -25200
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1175392800 1193533200 1207447200 1224982800
+1238896800 1256432400 1270346400 1288486800 1301796000 1319936400
+1333245600 1351386000 1365300000 1382835600 1396749600 1414285200
+1428199200 1445734800 1459648800 1477789200 1491098400 1509238800
+1522548000 1540688400 1554602400 1572138000 1586052000 1603587600
+1617501600 1635642000 1648951200 1667091600 1680400800 1698541200
+1712455200 1729990800 1743904800 1761440400 1775354400 1792890000
+1806804000 1824944400 1838253600 1856394000 1869703200 1887843600
+1901757600 1919293200 1933207200 1950742800 1964656800 1982797200
+1996106400 2014246800 2027556000 2045696400 2059005600 2077146000
+2091060000 2108595600 2122509600 2140045200
--- /dev/null
+++ b/locale/Poland
@@ -1,0 +1,19 @@
+MET 3600 MET 7200
+ 512528400 528253200 543978000 559702800 575427600 591152400
+ 606877200 622602000 638326800 654656400 670381200 686106000
+ 701830800 717555600 733280400 749005200 764730000 780454800
+ 796179600 811904400 828234000 843958800 859683600 875408400
+ 891133200 906858000 922582800 938307600 954032400 969757200
+ 985482000 1001811600 1017536400 1033261200 1048986000 1064710800
+1080435600 1096160400 1111885200 1127610000 1143334800 1159059600
+1174784400 1191114000 1206838800 1222563600 1238288400 1254013200
+1269738000 1285462800 1301187600 1316912400 1332637200 1348966800
+1364691600 1380416400 1396141200 1411866000 1427590800 1443315600
+1459040400 1474765200 1490490000 1506214800 1521939600 1538269200
+1553994000 1569718800 1585443600 1601168400 1616893200 1632618000
+1648342800 1664067600 1679792400 1695517200 1711846800 1727571600
+1743296400 1759021200 1774746000 1790470800 1806195600 1821920400
+1837645200 1853370000 1869094800 1885424400 1901149200 1916874000
+1932598800 1948323600 1964048400 1979773200 1995498000 2011222800
+2026947600 2042672400 2058397200 2074726800 2090451600 2106176400
+2121901200 2137626000
--- /dev/null
+++ b/locale/README
@@ -1,0 +1,5 @@
+To change the default time zone you see on your local system,
+copy the appropriate file to /locale/timezone.
+
+Most of these files were provided by David Hogan.
+The Israel file was provided by Amos Shapir.
--- /dev/null
+++ b/locale/ROC
@@ -1,0 +1,1 @@
+CST 28800 CST 28800
--- /dev/null
+++ b/locale/ROK
@@ -1,0 +1,2 @@
+KST 32400 KDT 36000
+ 547610400 560916000 579060000 592365600
--- /dev/null
+++ b/locale/Singapore
@@ -1,0 +1,1 @@
+SST 28800 SST 28800
--- /dev/null
+++ b/locale/Turkey
@@ -1,0 +1,19 @@
+EET 10800 EET 14400
+ 512528400 528249600 543978000 559699200 575427600 591148800
+ 606877200 622598400 638326800 654652800 670381200 686102400
+ 701830800 717552000 733280400 749001600 764730000 780451200
+ 796179600 811900800 828234000 843955200 859683600 875404800
+ 891133200 906854400 922582800 938304000 954032400 969753600
+ 985482000 1001808000 1017536400 1033257600 1048986000 1064707200
+1080435600 1096156800 1111885200 1127606400 1143334800 1159056000
+1174784400 1191110400 1206838800 1222560000 1238288400 1254009600
+1269738000 1285459200 1301187600 1316908800 1332637200 1348963200
+1364691600 1380412800 1396141200 1411862400 1427590800 1443312000
+1459040400 1474761600 1490490000 1506211200 1521939600 1538265600
+1553994000 1569715200 1585443600 1601164800 1616893200 1632614400
+1648342800 1664064000 1679792400 1695513600 1711846800 1727568000
+1743296400 1759017600 1774746000 1790467200 1806195600 1821916800
+1837645200 1853366400 1869094800 1885420800 1901149200 1916870400
+1932598800 1948320000 1964048400 1979769600 1995498000 2011219200
+2026947600 2042668800 2058397200 2074723200 2090451600 2106172800
+2121901200 2137622400
--- /dev/null
+++ b/locale/US_Alaska
@@ -1,0 +1,24 @@
+AKS -32400 AKD -28800
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1173578400 1194141600 1205028000 1225591200
+1236477600 1257040800 1268532000 1289095200 1299981600 1320544800
+1331431200 1351994400 1362880800 1383444000 1394330400 1414893600
+1425780000 1446343200 1457834400 1478397600 1489284000 1509847200
+1520733600 1541296800 1552183200 1572746400 1583632800 1604196000
+1615687200 1636250400 1647136800 1667700000 1678586400 1699149600
+1710036000 1730599200 1741485600 1762048800 1772935200 1793498400
+1804989600 1825552800 1836439200 1857002400 1867888800 1888452000
+1899338400 1919901600 1930788000 1951351200 1962842400 1983405600
+1994292000 2014855200 2025741600 2046304800 2057191200 2077754400
+2088640800 2109204000 2120090400 2140653600
--- /dev/null
+++ b/locale/US_Arizona
@@ -1,0 +1,1 @@
+MST -25200 MST -25200
--- /dev/null
+++ b/locale/US_Central
@@ -1,0 +1,24 @@
+CST -21600 CDT -18000
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1173578400 1194141600 1205028000 1225591200
+1236477600 1257040800 1268532000 1289095200 1299981600 1320544800
+1331431200 1351994400 1362880800 1383444000 1394330400 1414893600
+1425780000 1446343200 1457834400 1478397600 1489284000 1509847200
+1520733600 1541296800 1552183200 1572746400 1583632800 1604196000
+1615687200 1636250400 1647136800 1667700000 1678586400 1699149600
+1710036000 1730599200 1741485600 1762048800 1772935200 1793498400
+1804989600 1825552800 1836439200 1857002400 1867888800 1888452000
+1899338400 1919901600 1930788000 1951351200 1962842400 1983405600
+1994292000 2014855200 2025741600 2046304800 2057191200 2077754400
+2088640800 2109204000 2120090400 2140653600
--- /dev/null
+++ b/locale/US_East-Indiana
@@ -1,0 +1,12 @@
+EST -18000 EDT -14400
+1143943200 1162083600 1173578400 1194141600 1205028000 1225591200
+1236477600 1257040800 1268532000 1289095200 1299981600 1320544800
+1331431200 1351994400 1362880800 1383444000 1394330400 1414893600
+1425780000 1446343200 1457834400 1478397600 1489284000 1509847200
+1520733600 1541296800 1552183200 1572746400 1583632800 1604196000
+1615687200 1636250400 1647136800 1667700000 1678586400 1699149600
+1710036000 1730599200 1741485600 1762048800 1772935200 1793498400
+1804989600 1825552800 1836439200 1857002400 1867888800 1888452000
+1899338400 1919901600 1930788000 1951351200 1962842400 1983405600
+1994292000 2014855200 2025741600 2046304800 2057191200 2077754400
+2088640800 2109204000 2120090400 2140653600
--- /dev/null
+++ b/locale/US_Eastern
@@ -1,0 +1,24 @@
+EST -18000 EDT -14400
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1173578400 1194141600 1205028000 1225591200
+1236477600 1257040800 1268532000 1289095200 1299981600 1320544800
+1331431200 1351994400 1362880800 1383444000 1394330400 1414893600
+1425780000 1446343200 1457834400 1478397600 1489284000 1509847200
+1520733600 1541296800 1552183200 1572746400 1583632800 1604196000
+1615687200 1636250400 1647136800 1667700000 1678586400 1699149600
+1710036000 1730599200 1741485600 1762048800 1772935200 1793498400
+1804989600 1825552800 1836439200 1857002400 1867888800 1888452000
+1899338400 1919901600 1930788000 1951351200 1962842400 1983405600
+1994292000 2014855200 2025741600 2046304800 2057191200 2077754400
+2088640800 2109204000 2120090400 2140653600
--- /dev/null
+++ b/locale/US_Hawaii
@@ -1,0 +1,1 @@
+HST -36000 HST -36000
--- /dev/null
+++ b/locale/US_Michigan
@@ -1,0 +1,24 @@
+EST -18000 EDT -14400
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1173578400 1194141600 1205028000 1225591200
+1236477600 1257040800 1268532000 1289095200 1299981600 1320544800
+1331431200 1351994400 1362880800 1383444000 1394330400 1414893600
+1425780000 1446343200 1457834400 1478397600 1489284000 1509847200
+1520733600 1541296800 1552183200 1572746400 1583632800 1604196000
+1615687200 1636250400 1647136800 1667700000 1678586400 1699149600
+1710036000 1730599200 1741485600 1762048800 1772935200 1793498400
+1804989600 1825552800 1836439200 1857002400 1867888800 1888452000
+1899338400 1919901600 1930788000 1951351200 1962842400 1983405600
+1994292000 2014855200 2025741600 2046304800 2057191200 2077754400
+2088640800 2109204000 2120090400 2140653600
--- /dev/null
+++ b/locale/US_Mountain
@@ -1,0 +1,24 @@
+MST -25200 MDT -21600
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1173578400 1194141600 1205028000 1225591200
+1236477600 1257040800 1268532000 1289095200 1299981600 1320544800
+1331431200 1351994400 1362880800 1383444000 1394330400 1414893600
+1425780000 1446343200 1457834400 1478397600 1489284000 1509847200
+1520733600 1541296800 1552183200 1572746400 1583632800 1604196000
+1615687200 1636250400 1647136800 1667700000 1678586400 1699149600
+1710036000 1730599200 1741485600 1762048800 1772935200 1793498400
+1804989600 1825552800 1836439200 1857002400 1867888800 1888452000
+1899338400 1919901600 1930788000 1951351200 1962842400 1983405600
+1994292000 2014855200 2025741600 2046304800 2057191200 2077754400
+2088640800 2109204000 2120090400 2140653600
--- /dev/null
+++ b/locale/US_Pacific
@@ -1,0 +1,24 @@
+PST -28800 PDT -25200
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1173578400 1194141600 1205028000 1225591200
+1236477600 1257040800 1268532000 1289095200 1299981600 1320544800
+1331431200 1351994400 1362880800 1383444000 1394330400 1414893600
+1425780000 1446343200 1457834400 1478397600 1489284000 1509847200
+1520733600 1541296800 1552183200 1572746400 1583632800 1604196000
+1615687200 1636250400 1647136800 1667700000 1678586400 1699149600
+1710036000 1730599200 1741485600 1762048800 1772935200 1793498400
+1804989600 1825552800 1836439200 1857002400 1867888800 1888452000
+1899338400 1919901600 1930788000 1951351200 1962842400 1983405600
+1994292000 2014855200 2025741600 2046304800 2057191200 2077754400
+2088640800 2109204000 2120090400 2140653600
--- /dev/null
+++ b/locale/US_Yukon
@@ -1,0 +1,24 @@
+YST -32400 YDT -28800
+ 9943200 25664400 41392800 57718800 73447200 89168400
+ 104896800 120618000 126669600 152067600 162352800 183517200
+ 199245600 215571600 230695200 247021200 262749600 278470800
+ 294199200 309920400 325648800 341370000 357098400 372819600
+ 388548000 404874000 419997600 436323600 452052000 467773200
+ 483501600 499222800 514951200 530672400 544586400 562122000
+ 576036000 594176400 607485600 625626000 638935200 657075600
+ 670989600 688525200 702439200 719974800 733888800 752029200
+ 765338400 783478800 796788000 814928400 828842400 846378000
+ 860292000 877827600 891741600 909277200 923191200 941331600
+ 954640800 972781200 986090400 1004230800 1018144800 1035680400
+1049594400 1067130000 1081044000 1099184400 1112493600 1130634000
+1143943200 1162083600 1173578400 1194141600 1205028000 1225591200
+1236477600 1257040800 1268532000 1289095200 1299981600 1320544800
+1331431200 1351994400 1362880800 1383444000 1394330400 1414893600
+1425780000 1446343200 1457834400 1478397600 1489284000 1509847200
+1520733600 1541296800 1552183200 1572746400 1583632800 1604196000
+1615687200 1636250400 1647136800 1667700000 1678586400 1699149600
+1710036000 1730599200 1741485600 1762048800 1772935200 1793498400
+1804989600 1825552800 1836439200 1857002400 1867888800 1888452000
+1899338400 1919901600 1930788000 1951351200 1962842400 1983405600
+1994292000 2014855200 2025741600 2046304800 2057191200 2077754400
+2088640800 2109204000 2120090400 2140653600
--- /dev/null
+++ b/locale/W-SU
@@ -1,0 +1,19 @@
+??? 10800 ??? 14400
+ 512532000 528256800 543981600 559706400 575431200 591156000
+ 606880800 622605600 638330400 654660000 670384800 686109600
+ 701834400 717559200 733284000 749008800 764733600 780458400
+ 796183200 811908000 828237600 843962400 859687200 875412000
+ 891136800 906861600 922586400 938311200 954036000 969760800
+ 985485600 1001815200 1017540000 1033264800 1048989600 1064714400
+1080439200 1096164000 1111888800 1127613600 1143338400 1159063200
+1174788000 1191117600 1206842400 1222567200 1238292000 1254016800
+1269741600 1285466400 1301191200 1316916000 1332640800 1348970400
+1364695200 1380420000 1396144800 1411869600 1427594400 1443319200
+1459044000 1474768800 1490493600 1506218400 1521943200 1538272800
+1553997600 1569722400 1585447200 1601172000 1616896800 1632621600
+1648346400 1664071200 1679796000 1695520800 1711850400 1727575200
+1743300000 1759024800 1774749600 1790474400 1806199200 1821924000
+1837648800 1853373600 1869098400 1885428000 1901152800 1916877600
+1932602400 1948327200 1964052000 1979776800 1995501600 2011226400
+2026951200 2042676000 2058400800 2074730400 2090455200 2106180000
+2121904800 2137629600
--- /dev/null
+++ b/locale/WET
@@ -1,0 +1,19 @@
+WET 0 WET 3600
+ 512528400 528253200 543978000 559702800 575427600 591152400
+ 606877200 622602000 638326800 654656400 670381200 686106000
+ 701830800 717555600 733280400 749005200 764730000 780454800
+ 796179600 811904400 828234000 843958800 859683600 875408400
+ 891133200 906858000 922582800 938307600 954032400 969757200
+ 985482000 1001811600 1017536400 1033261200 1048986000 1064710800
+1080435600 1096160400 1111885200 1127610000 1143334800 1159059600
+1174784400 1191114000 1206838800 1222563600 1238288400 1254013200
+1269738000 1285462800 1301187600 1316912400 1332637200 1348966800
+1364691600 1380416400 1396141200 1411866000 1427590800 1443315600
+1459040400 1474765200 1490490000 1506214800 1521939600 1538269200
+1553994000 1569718800 1585443600 1601168400 1616893200 1632618000
+1648342800 1664067600 1679792400 1695517200 1711846800 1727571600
+1743296400 1759021200 1774746000 1790470800 1806195600 1821920400
+1837645200 1853370000 1869094800 1885424400 1901149200 1916874000
+1932598800 1948323600 1964048400 1979773200 1995498000 2011222800
+2026947600 2042672400 2058397200 2074726800 2090451600 2106176400
+2121901200 2137626000
--- /dev/null
+++ b/locale/en_US/dict/calendar
@@ -1,0 +1,33 @@
+"Calendar"
+"Set"
+"Show"
+"Save"
+"Del"
+"Date (YYYY/MM/DD):"
+"Time (HH:MM.SS):"
+"Cannot set time: "
+"Set Time"
+"Cannot set time: "
+"Invalid date syntax"
+"Invalid time syntax"
+"Invalid time or date given"
+"write failed:"
+"Sun"
+"Mon"
+"Tue"
+"Wed"
+"Thu"
+"Fri"
+"Sat"
+"Jan"
+"Feb"
+"Mar"
+"Apr"
+"May"
+"Jun"
+"Jul"
+"Aug"
+"Sep"
+"Oct"
+"Nov"
+"Dec"
--- /dev/null
+++ b/locale/en_US/location
@@ -1,0 +1,1 @@
+en_US
--- /dev/null
+++ b/locale/location
@@ -1,0 +1,1 @@
+en_US
--- /dev/null
+++ b/locale/timezone
@@ -1,0 +1,19 @@
+GMT 0 BST 3600
+ 512528400 530672400 543978000 562122000 575427600 593571600
+ 606877200 625626000 638326800 657075600 670381200 688525200
+ 701830800 719974800 733280400 751424400 764730000 782874000
+ 796179600 814928400 828234000 846378000 859683600 877827600
+ 891133200 909277200 922582800 940726800 954032400 972781200
+ 985482000 1004230800 1017536400 1035680400 1048986000 1067130000
+1080435600 1099184400 1111885200 1130634000 1143334800 1162083600
+1174784400 1193533200 1206838800 1224982800 1238288400 1256432400
+1269738000 1288486800 1301187600 1319936400 1332637200 1351386000
+1364691600 1382835600 1396141200 1414285200 1427590800 1445734800
+1459040400 1477789200 1490490000 1509238800 1521939600 1540688400
+1553994000 1572138000 1585443600 1603587600 1616893200 1635642000
+1648342800 1667091600 1679792400 1698541200 1711846800 1729990800
+1743296400 1761440400 1774746000 1792890000 1806195600 1824944400
+1837645200 1856394000 1869094800 1887843600 1901149200 1919293200
+1932598800 1950742800 1964048400 1982797200 1995498000 2014246800
+2026947600 2045696400 2058397200 2077146000 2090451600 2108595600
+2121901200 2140045200 2147483647
--- /dev/null
+++ b/makemk.sh
@@ -1,0 +1,78 @@
+#!/bin/sh
+
+# this file is used only to bootstrap mk onto a platform
+# that currently lacks a binary for mk. after that, mk can
+# look after itself.
+
+# support@vitanuova.com
+
+# change these defines as appropriate here or in mkconfig
+# ROOT should be the root of the Inferno tree
+ROOT=/usr/inferno
+SYSTARG=FreeBSD
+OBJTYPE=386
+SYSTYPE=posix
+
+# if you have already changed mkconfig from the distribution, we'll use the definitions from that
+grep -s 'SYSTARG=Plan9' mkconfig || . ./mkconfig
+
+PLAT=$ROOT/$SYSTARG/$OBJTYPE
+
+# you might need to adjust the CC, LD, AR, and RANLIB definitions after this point
+CC="p gcc -m32 -c -I$PLAT/include -I$ROOT/include -I$ROOT/utils/include"
+LD="p gcc -m32"
+AR="p ar crvs"
+RANLIB=":" # some systems still require `ranlib'
+
+error() {
+ echo $* >&2
+ exit 1
+}
+
+ofiles() {
+ echo $* | sed 's/\.c/.o/g'
+}
+
+p() {
+ echo $*
+ "$@"
+}
+
+# make sure we start off clean
+echo removing old libraries and binaries
+rm -f $PLAT/lib/*.a $PLAT/bin/*
+rm -f utils/cc/y.tab.?
+
+# ensure the output directories exist
+mkdir -p $PLAT/lib $PLAT/bin
+
+# libregexp
+cd $ROOT/utils/libregexp || error cannot find libregexp directory
+CFILES="regaux.c regcomp.c regerror.c regexec.c regsub.c rregexec.c rregsub.c"
+$CC $CFILES || error libregexp compilation failed
+$AR $PLAT/lib/libregexp.a `ofiles $CFILES` || error libregexp ar failed
+$RANLIB $PLAT/lib/libregexp.a || error libregexp ranlib failed
+
+# libbio
+cd $ROOT/libbio || error cannot find libbio directory
+$CC *.c || error libbio compilation failed
+$AR $PLAT/lib/libbio.a *.o || error libbio ar failed
+$RANLIB $PLAT/lib/libbio.a || error libbio ranlib failed
+
+# lib9
+cd $ROOT/lib9 || error cannot find lib9 directory
+CFILES="dirstat-$SYSTYPE.c rerrstr.c errstr-$SYSTYPE.c getuser-$SYSTYPE.c" # system specific
+CFILES="$CFILES charstod.c cleanname.c create.c dirwstat.c *print*.c *fmt*.c exits.c getfields.c pow10.c print.c qsort.c rune.c runestrlen.c seek.c strdup.c strtoll.c utflen.c utfrrune.c utfrune.c utf*.c *str*cpy*.c"
+$CC $CFILES || error lib9 compilation failed
+$AR $PLAT/lib/lib9.a `ofiles $CFILES` || error lib9 ar failed
+$RANLIB $PLAT/lib/lib9.a || error lib9 ranlib failed
+
+# mk itself
+cd $ROOT/utils/mk
+CFILES="Posix.c sh.c" # system specific
+CFILES="$CFILES arc.c archive.c bufblock.c env.c file.c graph.c job.c lex.c main.c match.c mk.c parse.c recipe.c rule.c run.c shprint.c symtab.c var.c varsub.c word.c"
+$CC $CFILES || error mk compilation failed
+$LD -o mk `ofiles $CFILES` $PLAT/lib/libregexp.a $PLAT/lib/libbio.a $PLAT/lib/lib9.a || error mk link failed
+cp mk $PLAT/bin || error mk binary install failed
+
+echo mk binary built successfully!
--- /dev/null
+++ b/man/1/0intro
@@ -1,0 +1,188 @@
+.TH INTRO 1
+.SH NAME
+intro \- introduction to Inferno
+.SH DESCRIPTION
+Inferno is a virtualised operating system that can
+run natively across a wide range of processor architectures
+or hosted on a wide range of operating systems.
+The principal components of the system are:
+.IP •
+The Inferno kernel which can run both native and `hosted' on a range of platforms
+and which presents the same interface to programs in both cases.
+.IP •
+The Dis virtual machine.
+.IP •
+Styx - the tiny broad-spectrum file service protocol.
+.IP •
+Limbo - a new simple, modular, concurrent programming language.
+.IP •
+Tk and Prefab - graphical user interface (`GUI') primitives without a lot of goo.
+.IP •
+The portable cross-development suites that allow any native Inferno platform
+to be cross-compiled on any hosted system.
+.SS Manual conventions
+Throughout this volume, manual entries are cross referenced
+by a notation of the form
+.IR entry ( n ),
+where
+.I entry
+is the name of the page (in italics) and
+.I n
+is the manual section holding the page.
+The same name may be found in more than one section.
+For example, the environment variable inspection command
+documented in
+.IR env (1),
+is quite distinct from the module interface to environment variables
+which is documented in
+.IR env (2),
+which in turn is distinct from the component documented by
+.IR env (3),
+which describes the underlying device that implements environment variables.
+.PP
+Pathnames are understood to exist in the file system space visible from
+Inferno. The root of this space when viewed from the host operating
+system is the Inferno installation directory, sometimes called the
+Inferno root directory. Unless otherwise enabled, the result of
+changes made by Inferno programs to files in the file system space
+is generally restricted to this portion of the host file system.
+.SS Name spaces
+One of the great strengths of Inferno is the
+.I name space
+interface to the resources available to a process,
+a hierarchical structure
+which looks very similar to a conventional file system.
+Resources look like files and directories that can be read
+and written, created and deleted in a way familiar to
+most programmers.
+.PP
+While this interface
+.I is
+used to provide programs with access to conventional
+disk-based filestore, it is also used to control devices
+and user level programs
+.I mounted
+in a process's name space.
+Once a program or a device has been attached to a process's
+name space, the program or device interprets any access
+to the attachment point;
+it can synthesise on demand the names of new files or directories,
+create their contents on the fly as the process reads from them,
+and interpret written data as commands or data as appropriate
+(See
+.IR bind (1)
+and
+.IR sys-bind (2)).
+.PP
+Each new Inferno process inherits its parent's name space,
+but it can divorce its own name space from that of its parent (see
+.IR sys-pctl (2)),
+giving programs the capability to attach
+resources to their own name space without making them globally
+visible. This per-process name space is potent
+but potentially confusing, so, to help programs that might be
+confused,
+.IR namespace (4)
+gives some conventions that should be adhered to if programs
+are to work properly. (That page also gives a general overview
+of the Inferno source tree.)
+.SS Start up
+See ``Installation of the Inferno Software'' in Volume 2
+for details of how to start up Inferno.
+.SS Window/development environment
+Inferno provides a powerful development environment in which to write, compile,
+execute and debug programs written in the Limbo language.
+It gives the developer a clean platform from which he can utilise
+an operating system which contains
+many new and innovative ideas and some, carefully chosen,
+older concepts that have survived the test of time and are likely to be
+familiar to most Plan 9 or Unix users.
+.PP
+Superficially, the Inferno shell
+.IR sh (1)
+looks and behaves much like
+its Plan 9 or Unix contemporaries but, at heart, it is quite different.
+The shell takes advantage of the dynamic module loading
+services that Inferno provides to allow it to be dynamically extended
+in appropriate and interesting ways. For example, by loading the
+.IR sh-tk (1)
+builtin module, a shell script can provide all the programming logic
+required to manage a
+.I Tk
+window with full
+.I Tk
+functionality in, surprisingly, few lines of code; by loading the
+.IR sh-file2chan (1)
+builtin module, a shell script can create a file in the name space
+whose properties are completely under the control of the script.
+.PP
+The Inferno window
+manager
+.IR wm (1)
+allows the user to manage the order and position of a dynamic collection of application
+windows in which to perform various tasks.
+.IR Acme (1)
+is targeted at programmers. It is an editor, a shell and window system all rolled
+into one, which through thoughtful and consistent application of simple principles
+results in a rich and productive programming environment with a user interface
+that feels right.
+.I Acme
+requires a three-button mouse and
+attaches distinct functions to the three mouse buttons and, indeed, to chords of buttons to
+maximise the productivity of the programmer's mouse. For more details of the
+.I Acme
+user interface see the paper
+"Acme: A User Interface for Programmers" in Volume 2.
+.PP
+Limbo programs are compiled with
+.IR limbo (1).
+This compiles Limbo source into a machine-independent format (Dis) for
+execution by the Inferno Dis virtual machine. The virtual machine is designed to provide
+safe execution of programs even on machines without memory protection.
+Debugging is made straightforward by use of either
+.IR stack (1)
+, to display the execution stack of a process
+or, if a finer inspection is required,
+.IR deb (1),
+a novel window based debugger that allows the user to identify the exact location of
+problems, set break points and walk the data structures of any module loaded by the program. See "Program Development in Inferno" in Volume 2 for details on how to use the
+development tools that Inferno provides.
+.SH SEE ALSO
+.nf
+Section (1) (this section) for the commonly-used commands.
+Section (2) for Limbo modules, including Inferno's system calls.
+Section (3) for kernel devices (accessed by `bind').
+Section (4) for file services (accessed by `mount').
+Section (5) for the Styx file service protocol.
+Section (6) for file formats and system conventions.
+Section (7) for databases and database access modules.
+Section (8) for administrative modules and system services.
+Section (9) for the reference for Inferno's Tk variant, Limbo/Tk.
+Section (10) for the build environment and device driver implementation.
+.PP
+Volume 2 contains papers and other documentation about Inferno.
+.PP
+The back of this volume contains a permuted index.
+.SH DIAGNOSTICS
+On successful execution, a process can simply exit.
+Programs (modules) that wish to return error status to
+the command interpreters
+.IR sh (1)
+and
+.IR mash (1)
+do so by raising a special exception (eg, using the
+.B raise
+statement in Limbo).
+The exception's value is a string
+beginning with the text
+.RB ` fail: '.
+.SH SEE ALSO
+.IR intro (2),
+.IR intro (3),
+.IR intro (4),
+.IR intro (5),
+.IR intro (6),
+.IR intro (7),
+.IR intro (8),
+.IR intro (9),
+.IR intro (10)
--- /dev/null
+++ b/man/1/9win
@@ -1,0 +1,71 @@
+.TH 9WIN 1
+.SH NAME
+9win \- create a Plan 9 window within Inferno
+.SH SYNOPSIS
+.B 9win
+[
+-s
+]
+[
+.B -x width
+]
+[
+.B -y height
+]
+[
+.IR cmd
+[
+.I arg ...
+]
+]
+.SH DESCRIPTION
+.I 9win
+creates a window for a graphical Plan 9 command (default
+.BR rio )
+to run in. If provided,
+.I width
+and
+.I height
+give a desired width and height for the new window.
+.I Cmd
+gives the command to run,
+and
+.I arg
+its arguments.
+.PP
+The
+.B -s
+option tells
+.I 9win
+to run in server mode. Used by
+.IR 9cpu (1),
+it exports on its standard input
+a namespace
+suitable for a graphical Plan 9 program to run
+within. With this option, no command may be given.
+.SH SOURCE
+.B /appl/cmd/9win.b
+.SH SEE ALSO
+.IR 9cpu (1),
+.IR import (4)
+.SH FILES
+.B /dev/winname
+.br
+.B /dev/mouse
+.br
+.B /dev/cons
+.br
+.B /dev/consctl
+.br
+ Files served by
+.IR 9win .
+.SH BUGS
+.I 9win
+does not export a full
+.I rio
+environment, so Plan 9 programs
+that wish to create new windows will not work correctly
+(unless running inside a
+.I rio
+started by
+.IR 9win )
--- /dev/null
+++ b/man/1/INDEX
@@ -1,0 +1,324 @@
+intro 0intro
+9win 9win
+acme acme
+win acme
+abc alphabet-abc
+alphabet-abc alphabet-abc
+alphabet-fs alphabet-fs
+fs alphabet-fs
+alphabet-grid alphabet-grid
+grid alphabet-grid
+alphabet-main alphabet-main
+main alphabet-main
+ar ar
+asm asm
+disdump asm
+auhdr auplay
+auplay auplay
+raw2iaf auplay
+wav2iaf auplay
+avr avr
+basename basename
+bind bind
+mount bind
+unmount bind
+blur blur
+brutus brutus
+cal cal
+calc calc
+calendar calendar
+cat cat
+cd cd
+charon charon
+chgrp chgrp
+chmod chmod
+cleanname cleanname
+cmp cmp
+collab collab
+connect collab
+chat collab-clients
+collab collab-clients
+collab-clients collab-clients
+poll collab-clients
+poller collab-clients
+whiteboard collab-clients
+comm comm
+cook cook
+cp cp
+fcp cp
+cprof cprof
+cpu cpu
+aescbc crypt
+crypt crypt
+date date
+dd dd
+deb deb
+diff diff
+disdep disdep
+dmview dmview
+dmwm dmview
+du du
+ebook ebook
+echo echo
+emu emu
+env env
+fc fc
+filename filename
+fmt fmt
+fortune fortune
+freq freq
+fs fs
+ftest ftest
+newer ftest
+ftree ftree
+gettar gettar
+lstar gettar
+puttar gettar
+grep grep
+grid-monitor grid-monitor
+monitor grid-monitor
+grid grid-ns
+grid-ns grid-ns
+ns grid-ns
+grid grid-query
+grid-query grid-query
+query grid-query
+grid grid-register
+grid-register grid-register
+register grid-register
+grid grid-session
+grid-session grid-session
+session grid-session
+gunzip gzip
+gzip gzip
+idea idea
+itest itest
+itreplay itest
+keyboard keyboard
+pen keyboard
+broke kill
+kill kill
+limbo limbo
+dial listen
+listen listen
+styxlisten listen
+logon logon
+logwindow logwindow
+look look
+lc ls
+ls ls
+m4 m4
+lookman man
+man man
+man2html man
+man2txt man
+wm/man man
+mash mash
+mash mash-make
+mash-make mash-make
+mash mash-tk
+mash-tk mash-tk
+ack math-misc
+crackerbarrel math-misc
+factor math-misc
+fibonacci math-misc
+fit math-misc
+genprimes math-misc
+math-misc math-misc
+mersenne math-misc
+parts math-misc
+perms math-misc
+pi math-misc
+powers math-misc
+primes math-misc
+sieve math-misc
+mc mc
+mdb mdb
+miniterm miniterm
+mk mk
+mkdir mkdir
+mprof mprof
+wm/mprof mprof
+mux mux
+mv mv
+netkey netkey
+netstat netstat
+ns ns
+nsbuild nsbuild
+os os
+p p
+passwd passwd
+plumb plumb
+prof prof
+wm/prof prof
+ps ps
+pwd pwd
+rcmd rcmd
+read read
+rm rm
+runas runas
+secstore secstore
+sendmail sendmail
+builtin sh
+exit sh
+load sh
+loaded sh
+local sh
+quote sh
+run sh
+set sh
+sh sh
+unload sh
+unquote sh
+whatis sh
+ sh-alphabet
+alphabet sh-alphabet sh-alphabet
+autoconvert sh-alphabet
+autodeclare
+declare sh-alphabet
+define sh-alphabet
+import sh-alphabet
+sh-alphabet sh-alphabet
+type sh-alphabet
+typeset sh-alphabet
+arg sh-arg
+sh-arg sh-arg
+csv sh-csv
+getcsv sh-csv
+sh-csv sh-csv
+expr sh-expr
+mpexpr sh-expr
+ntest sh-expr
+sh-expr sh-expr
+file2chan sh-file2chan
+rblock sh-file2chan
+rdata sh-file2chan
+rerror sh-file2chan
+rget sh-file2chan
+rread sh-file2chan
+rreadone sh-file2chan
+rwrite sh-file2chan
+sh-file2chan sh-file2chan
+mload sh-mload
+munload sh-mload
+sh-mload sh-mload
+match sh-regex
+re sh-regex
+sh-regex sh-regex
+els sh-sexprs
+islist sh-sexprs
+mklist sh-sexprs
+mktext sh-sexprs
+mktextlist sh-sexprs
+sexprs sh-sexprs
+sh-sexprs sh-sexprs
+text sh-sexprs
+textels sh-sexprs
+! sh-std
+and sh-std
+apply sh-std
+env sh-std
+fn sh-std
+getlines sh-std
+hd sh-std
+if sh-std
+index sh-std
+join sh-std
+no sh-std
+or sh-std
+parse sh-std
+pctl sh-std
+pid sh-std
+raise sh-std
+rescue sh-std
+sh-std sh-std
+split sh-std
+status sh-std
+std sh-std
+tl sh-std
+while sh-std
+~ sh-std
+alen sh-string
+drop sh-string
+in sh-string
+len sh-string
+prefix sh-string
+sh-string sh-string
+slice sh-string
+splitl sh-string
+splitr sh-string
+splitstrl sh-string
+splitstrr sh-string
+take sh-string
+tolower sh-string
+toupper sh-string
+report sh-test
+sh-test sh-test
+alt sh-tk
+chan sh-tk
+recv sh-tk
+send sh-tk
+sh-tk sh-tk
+tk sh-tk
+pause sleep
+sleep sleep
+sort sort
+join spree-join
+spree-join spree-join
+stack stack
+stream stream
+strings strings
+md5sum sum
+sha1sum sum
+sum sum
+tail tail
+tcs tcs
+tee tee
+telnet telnet
+time time
+timestamp timestamp
+rm tiny
+sh tiny
+tiny tiny
+tkcmd tkcmd
+tktester tktester
+toolbar toolbar
+touch touch
+tr tr
+tsort tsort
+unicode unicode
+uniq uniq
+units units
+uudecode uuencode
+uuencode uuencode
+vacget vacget
+vacput vacget
+wc wc
+webgrab webgrab
+wish wish
+wm wm
+about wm-misc
+clock wm-misc
+coffee wm-misc
+colors wm-misc
+date wm-misc
+edit wm-misc
+mand wm-misc
+memory wm-misc
+polyhedra wm-misc
+reversi wm-misc
+rt wm-misc
+stopwatch wm-misc
+sweeper wm-misc
+task wm-misc
+tetris wm-misc
+unibrowse wm-misc
+view wm-misc
+winctl wm-misc
+wm-misc wm-misc
+mash wm-sh
+sh wm-sh
+wm-sh wm-sh
+xd xd
+yacc yacc
+zeros zeros
--- /dev/null
+++ b/man/1/acme
@@ -1,0 +1,1203 @@
+.TH ACME 1
+.SH NAME
+acme, win \- interactive text windows
+.SH SYNOPSIS
+.B acme
+[
+.B -f
+.I varfont
+]
+[
+.B -F
+.I fixfont
+]
+[
+.B -c
+.I ncol
+]
+[
+.B -b
+]
+[
+.B -l
+.I file
+|
+.I file
+\&... ]
+.LP
+.B win
+[
+.I command
+]
+.SH DESCRIPTION
+.I Acme
+manages windows of text that may be edited interactively or by external programs.
+The interactive interface uses the keyboard and mouse; external programs
+use a set of files served by
+.IR acme ;
+these are discussed in
+.IR acme (4).
+.PP
+Any named
+.I files
+are read into
+.I acme
+windows before
+.I acme
+accepts input.
+With the
+.B -l
+option, the state of the entire system is loaded
+from
+.IR file ,
+which should have been created by a
+.B Dump
+command (q.v.),
+and subsequent
+.I file
+names are ignored.
+Plain files display as text; directories display as columnated lists of the
+names of their components with the names of subdirectories having a slash appended.
+.PP
+The
+.B -f
+.RB ( -F )
+option sets the default variable-pitch (fixed-pitch)
+font; the default is
+.B /fonts/lucidasans/euro.8.font
+.RB ( \&.../lucm/unicode.9.font ).
+Tab intervals are set to the width of 4 numeral zeros in the variable-pitch font.
+.PP
+.SS Windows
+.I Acme
+windows are in two parts: a one-line
+.I tag
+above a multi-line
+.IR body .
+The body typically contains an image of a file or the output of a program.
+The tag contains a number of
+blank-separated words, followed by a vertical bar character, followed by anything.
+The first word is the name of the window, typically the name of the associated
+file or directory, and the other words are commands available in that window.
+Any text may be added after the bar; examples are strings to search for or
+commands to execute in that window.
+Changes to the text left of the bar will be ignored,
+unless the result is to change the name of the
+window.
+.PP
+If a window holds a directory, the name (first word of the tag) will end with
+a slash.
+.SS Scrolling
+Each window has a scroll bar to the left of the body.
+Scrolling occurs when the button is pressed, rather than released,
+and continues
+as long as the mouse button is held down in the scroll bar.
+For example, to scroll slowly through a file,
+hold button 3 down near the top of the scroll bar. Moving the mouse
+down the scroll bar speeds up the rate of scrolling. Scrolling backwards is performed
+similarly using button 1. Button 2 allows absolute movement within the text; clicking it
+at different heights within the scroll bar changes the focused text without intermediate
+scrolling.
+.SS Layout
+.I Acme
+windows are arranged in columns. By default, it creates two columns when starting;
+this can be overridden with the
+.B -c
+option.
+Placement is automatic but may be adjusted
+using the
+.I layout box
+in the upper left corner of each window and column.
+Pressing and holding any mouse button in the box drags
+the associated window or column.
+For windows, just
+clicking in the layout box grows the window in place: button 1
+grows it a little, button 2 grows it as much as it can, still leaving all other
+tags in that column visible, and button 3 takes over the column completely,
+temporarily hiding other windows in the column.
+(They will return
+.I en masse
+if any of them needs attention.)
+The layout box in a window is normally white; when it is black in the center,
+it records that the file is `dirty':
+.I Acme
+believes it is modified from its original
+contents.
+.PP
+Tags exist at the top of each column and across the whole display.
+.I Acme
+pre-loads them with useful commands.
+Also, the tag across the top maintains a list of executing long-running commands.
+.SS Typing
+The behaviour of typed text is as one would expect
+except that the characters are delivered to the tag or body under the mouse; there is no
+`click to type'.
+(The experimental option
+.B -b
+causes typing to go to the most recently clicked-at or made window.)
+The usual backspacing conventions apply.
+The ESC key selects the text typed since the last mouse action,
+a feature particularly useful when executing commands.
+A side effect is that typing ESC with text already selected is identical
+to a
+.B Cut
+command
+.RI ( q.v. ).
+.PP
+Most text, including the names of windows, may be edited uniformly.
+The only exception is that the command names to the
+left of the bar in a tag are maintained automatically; changes to them are repaired
+by
+.IR acme .
+.SS "Directory context
+Each window's tag names a directory: explicitly if the window
+holds a directory; implicitly if it holds a regular file
+(e.g. the directory
+.B /module
+if the window holds
+.BR /module/sys.m ).
+This directory provides a
+.I context
+for interpreting file names in that window.
+For example, the string
+.B sys.m
+in a window labelled
+.B /module/
+or
+.B /module/draw.m
+will be interpreted as the file name
+.BR /module/sys.m .
+The directory is defined purely textually, so it can be a non-existent
+directory or a real directory associated with a non-existent file
+(e.g.
+.BR /module/not-a-file ).
+File names beginning with a slash
+are assumed to be absolute file names.
+.SS Errors
+Windows whose names begin with
+.B -
+or
+.B +
+conventionally hold diagnostics and other data
+not directly associated with files.
+A window labelled
+.B +Errors
+receives all diagnostics produced by
+.I acme
+itself.
+Diagnostics from commands run by
+.I acme
+appear in a window named
+.IB directory /+Errors
+where
+.I directory
+is identified by the context of the command.
+These error windows are created when needed.
+.SS "Mouse button 1
+Mouse button 1 selects text and double-clicking highlights the text for replacement text to be
+typed in.
+.PP
+Button 1 is also useful for matching symbols. For example to match curly brackets in some limbo
+source,
+double click button 1 immediately after the open curly bracket.
+The whole of the text up to any matching end curly bracket will be highlighted. A similar match
+is made if the double click is performed immediately before the end bracket. In all,
+.I acme
+will match the pairs { and }, [ and ], ( and ), < and >, « and », ' and ', " and ", ` and `.
+Also whole lines of text may be highlighted by double clicking at the beginning or end of the line.
+.SS "Mouse button 2
+By an
+action similar to selecting text with button 1,
+button 2 indicates text to execute as a command.
+If the indicated text has multiple white-space-separated words,
+the first is the command name and the second and subsequent
+are its arguments.
+If button 2 is `clicked'\(emindicates a null string\(em\c
+.I acme
+.I expands
+the indicated text to find a command to run:
+if the click is within button-1-selected text,
+.I acme
+takes that selection as the command;
+otherwise it takes the largest string of valid file name characters containing the click.
+Valid file name characters are alphanumerics and
+.B _
+.B .
+.B -
+.B +
+.BR / .
+This behaviour is similar to double-clicking with button 1 but,
+because a null command is meaningless, only a single click is required.
+.PP
+Some commands, all by convention starting with a capital letter, are
+.I built-ins
+that are executed directly by
+.IR acme :
+.TF "Lineno\ \ "
+.PD
+.TP
+.B Cut
+Delete most recently selected text and place in snarf buffer.
+.TP
+.B Del
+Delete window. If window is dirty, instead print a warning; a second
+.B Del
+will succeed.
+.TP
+.B Delcol
+Delete column and all its windows, after checking that windows are not dirty.
+.TP
+.B Delete
+Delete window without checking for dirtiness.
+.TP
+.B Dump
+Write the state of
+.I acme
+to the file name, if specified, or
+.B $home/acme.dump
+by default.
+.TP
+.B Edit
+Treat the argument as a text editing command in the style of Plan9's
+.IR sam.
+The full
+.B Sam
+language is implemented except for the commands
+.BR k ,
+.BR n ,
+.BR q ,
+and
+.BR ! .
+The
+.B =
+command is slightly different: it includes the file name and
+gives only the line address unless the command is explicitly
+.BR =# .
+The `current window' for the command is the body of the window in which the
+.B Edit
+command is executed.
+Usually the
+.B Edit
+command would be typed in a tag; longer commands may be prepared in a
+scratch window and executed, with
+.B Edit
+itself in the current window, using the 2-1 chord described below. See the later
+section on editing for a full description of the commands available here.
+.TP
+.B Exit
+Exit
+.I acme
+after checking that windows are not dirty.
+.TP
+.B Font
+With no arguments, change the font of the associated window from fixed-spaced to
+proportional-spaced or
+.I vice versa\f1.
+Given a file name argument, change the font of the window to that stored in the named file.
+If the file name argument is prefixed by
+.B var
+.RB ( fix ),
+also set the default proportional-spaced (fixed-spaced) font for future use to that font.
+Other existing windows are unaffected.
+.TP
+.B Get
+Load file into window, replacing previous contents (after checking for dirtiness as in
+.BR Del ).
+With no argument, use the existing file name of the window.
+Given an argument, use that file but do not change the window's file name.
+.TP
+.B ID
+Print window ID number
+.RI ( q.v. ).
+.TP
+.B Incl
+When opening `include' files with button 3,
+.I acme
+searches in the directories
+.B /module
+and
+.B /include .
+.B Incl
+adds its arguments to a supplementary list of include directories, analogous to
+the
+.B -I
+option to the compilers.
+This list is per-window and is inherited when windows are created by actions in that window, so
+.I Incl
+is most usefully applied to a directory containing relevant source.
+With no arguments,
+.I Incl
+prints the supplementary list.
+.TP
+.B Kill
+Send a
+.B kill
+note to
+.IR acme -initiated
+commands named as arguments.
+.TP
+.B Lineno
+Give the line number(s) of the currently selected text.
+.TP
+.B Load
+Restore the state of
+.I acme
+from a file (default
+.BR $home/acme.dump )
+created by the
+.B Dump
+command.
+.TP
+.B Local
+When prefixed to a command
+run the
+command in the same file name space and environment variable group as
+.IR acme .
+The environment of the command
+is restricted but is sufficient to run
+.IR bind (1),
+.IR mount ,
+etc.,
+and to set environment variables.
+.TP
+.B Look
+Search in body for occurrence of literal text indicated by the argument or,
+if none is given, by the selected text in the body.
+.TP
+.B New
+Make new window. With arguments, load the named files into windows.
+.TP
+.B Newcol
+Make new column.
+.TP
+.B Paste
+Replace most recently selected text with contents of snarf buffer.
+.TP
+.B Put
+Write window to the named file.
+With no argument, write to the file named in the tag of the window.
+.TP
+.B Putall
+Write all dirty windows whose names indicate existing regular files.
+.TP
+.B Redo
+Complement of
+.BR Undo .
+.TP
+.B Send
+Append selected text or snarf buffer to end of body; used mainly with
+.IR win .
+.TP
+.B Snarf
+Place selected text in snarf buffer.
+.TP
+.B Sort
+Arrange the windows in the column from top to bottom in lexicographical
+order based on their names.
+.TP
+.B Undo
+Undo last textual change or set of changes.
+.TP
+.B Zerox
+Create a copy of the window containing most recently selected text.
+.PP
+A common place to store text for commands is in the tag; in fact
+.I acme
+maintains a set of commands appropriate to the state of the window
+to the left of the bar in the tag.
+.PP
+If the text indicated with button 2 is not a recognized built-in, it is executed as
+a shell command. For example, indicating
+.B date
+with button 2 runs
+.IR date (1).
+The standard
+and error outputs of commands are sent to the error window associated with
+the directory from which the command was run, which will be created if
+necessary.
+For example, in a window
+.B /module/sys.m
+executing
+.B pwd
+will produce the output
+.B /module
+in a (possibly newly-created) window labelled
+.BR /adm/+Errors ;
+in a window containing
+.B /appl/cmd/date.b
+executing
+.B "limbo date.b"
+will run
+.IR limbo (1)
+in
+.BR /appl/cmd ,
+producing output in a window labelled
+.BR /appl/cmd/+Errors .
+.SS "Mouse button 3
+Pointing at text with button 3 instructs
+.I acme
+to locate or acquire the file, string, etc. described by the indicated text and
+its context.
+This description follows the actions taken when
+button 3 is released after sweeping out some text.
+In the description,
+.I text
+refers to the text of the original sweep or, if it was null, the result of
+applying the same expansion rules that apply to button 2 actions.
+.PP
+If the text names an existing window,
+.I acme
+moves the mouse cursor to the selected text in the body of that window.
+If the text names an existing file with no associated window,
+.I acme
+loads the file into a new window and moves the mouse there.
+If the text is a file name contained in double quotes,
+.I acme
+loads the indicated include file from the directory appropriate to the
+suffix of the file name of the window holding the text.
+(The
+.B Incl
+command adds directories to the standard list.)
+.PP
+If the text begins with a colon, it is taken to be an address
+within the body of the window containing the text.
+The address is evaluated, the resulting text highlighted, and the mouse moved to it.
+Thus, in
+.IR acme ,
+one must type
+.B :/regexp
+or
+.B :127
+not just
+.B /regexp
+or
+.BR 127 .
+(There is an easier way to locate literal text; see below.)
+.PP
+If the text is a file name followed by a colon and an address,
+.I acme
+loads the file and evaluates the address. For example, clicking button 3 anywhere
+in the text
+.B file.c:27
+will open
+.BR file.c ,
+select line
+27, and put the mouse at the beginning of the line. The rules about Error
+files, directories, and so on all combine to make this an efficient way to
+investigate errors from compilers, etc.
+.PP
+If the text is not an address or file, it is taken to
+be literal text, which is then searched for in the body of the window
+in which button 3 was clicked. If a match is found, it is selected and the mouse is
+moved there. Thus, to search for occurrences of a word in a file,
+just click button 3 on the word. Because of the rule of using the
+selection as the button 3 action, subsequent clicks will find subsequent
+occurrences without moving the mouse.
+.PP
+In all these actions, the mouse motion is not done if the text is a null string
+within a non-null selected string in the tag, so that (for example) complex regular expressions
+may be selected and applied repeatedly to the
+body by just clicking button 3 over them.
+.SS "Chords of mouse buttons
+Several operations are bound to multiple-button actions.
+After selecting text, with button 1 still down, pressing button 2
+executes
+.B Cut
+and button 3 executes
+.BR Paste .
+After clicking one button, the other undoes
+the first; thus (while holding down button 1) 2 followed by 3 is a
+.B Snarf
+that leaves the file undirtied;
+3 followed by 2 is a no-op.
+These actions also apply to text selected by double-clicking because
+the double-click expansion is made when the second
+click starts, not when it ends.
+.PP
+Thus to copy a word a number of times, double click on the word with button 1 to highlight it leaving
+button 1 down, press and release button 2 to cut it and save it in the snarf buffer, press and
+release button 3 to paste it back and then release button 1. Now move the cursor to any selected
+place in the text, press button 1 down, then button 3 and the word is copied in.
+.PP
+Similarly lines may be deleted by double clicking at the beginning or end of the line and then
+pressing button 2 with button 1 still down.
+.PP
+Commands may be given extra arguments by a mouse chord with buttons 2 and 1.
+While holding down button 2 on text to be executed as a command, clicking button 1
+appends the text last pointed to by button 1 as a distinct final argument.
+For example, to search for literal
+.B text
+one may execute
+.B Look text
+with button 2 or instead point at
+.B text
+with button 1 in any window, release button 1,
+then execute
+.BR Look ,
+clicking button 1 while 2 is held down.
+.PP
+When an external command (e.g.
+.IR echo (1))
+is executed this way, the extra argument is passed as expected and an
+environment variable
+.B $acmeaddr
+is created that holds, in the form interpreted by button 3,
+the fully-qualified address of the extra argument.
+.SS "Support programs
+.I win
+creates a new
+.I acme
+window and runs a
+.I command
+(default
+.BR /dis/sh.dis )
+in it, turning the window into a shell window in which commands may be executed.
+Executing text in a
+.I win
+window with button
+2 is similar to using
+.BR Send .
+.PP
+Similarly
+.I winm
+creates a new window but runs the shell
+.BR /dis/mash.dis
+by default.
+.I adiff
+behaves as diff in finding the difference between two files but the listing uses
+filename:linenumber format to allow the user to simply click on this to be sent to that line
+in the file.
+.I agrep
+does for grep what adiff does for diff above.
+.I cd
+changes directory but when used in a win window for example, sends information to the
+window to display a new heading reflecting the new directory.
+.SS "Mail"
+In the directory
+.B /acme/mail
+there are two mail programs that may be used under acme. These
+.I Mail
+and
+.I Mailpop3
+can be run to display the user's current mail, read the mail, reply to mail, save or delete mail,
+send mail and write the user's mail box.
+.PP
+The former expects the user's mail box to be in the directory and file specified as its first argument,
+the latter uses the POP3 protocol to connect to a server for the user's mail and will prompt for a
+password when first run. Otherwise their behaviour is the same.
+.SS "Applications and guide files
+In the directory
+.B /acme
+live several subdirectories, each corresponding to a program or
+set of related programs that employ
+.I acme's
+user interface.
+Each subdirectory includes dis files and a
+.B readme
+file for further information.
+It also includes a
+.BR guide ,
+a text file holding sample commands to invoke the programs.
+The idea is to find an example in the guide that best matches
+the job at hand, edit it to suit, and execute it.
+.PP
+Whenever a command is executed by
+.IR acme ,
+the default search path includes the directory of the window containing
+the command.
+Also,
+.I acme
+binds the directory
+.B /acme/dis
+in front of
+.B /dis
+when it starts; this is where
+.IR acme -specific
+programs such as
+.I win
+reside.
+.SH EDITING
+This section explains the commands available when using acme's Edit command.
+.PP
+.SS Regular expressions
+Regular expressions are as in
+.IR regexp (6)
+with the addition of
+.BR \en
+to represent newlines.
+A regular expression may never contain a literal newline character.
+The empty
+regular expression stands for the last complete expression encountered.
+A regular expression
+matches the longest leftmost substring formally
+matched by the expression.
+Searching in the reverse direction is equivalent
+to searching backwards with the catenation operations reversed in
+the expression.
+.SS Addresses
+An address identifies a substring in a file.
+In the following, `character
+.IR n '
+means the null string
+after the
+.IR n -th
+character in the file, with 1 the
+first character in the file.
+`Line
+.IR n '
+means the
+.IR n -th
+match,
+starting at the beginning of the file, of the regular expression
+.LR .*\en? .
+All files always have a current substring, called dot,
+that is the default address.
+.SS Simple Addresses
+.PD0
+.TP
+.BI # n
+The empty string after character
+.IR n ;
+.B #0
+is the beginning of the file.
+.TP
+.I n
+Line
+.IR n ;
+.B 0
+is the beginning of the file.
+.TP
+.BI / regexp /
+.PD0
+.TP
+.BI ? regexp ?
+The substring that matches the regular expression,
+found by looking toward the end
+.RB ( / )
+or beginning
+.RB ( ? )
+of the file,
+and if necessary continuing the search from the other end to the
+starting point of the search.
+The matched substring may straddle
+the starting point.
+When entering a pattern containing a literal question mark
+for a backward search, the question mark should be
+specified as a member of a class.
+.PD
+.TP
+.B 0
+The string before the first full line.
+This is not necessarily
+the null string; see
+.B +
+and
+.B -
+below.
+.TP
+.B $
+The null string at the end of the file.
+.TP
+.B .
+Dot.
+.TP
+.B \&'
+The mark in the file.
+.TP
+\fL"regexp"\fP
+Preceding a simple address (default
+.BR . ),
+refers to the address evaluated in the unique file whose menu line
+matches the regular expression.
+.PD
+.SS Compound Addresses
+In the following,
+.I a1
+and
+.I a2
+are addresses.
+.TF a1+a2
+.TP
+.IB a1 + a2
+The address
+.I a2
+evaluated starting at the end of
+.IR a1 .
+.TP
+.IB a1 - a2
+The address
+.I a2
+evaluated looking in the reverse direction
+starting at the beginning of
+.IR a1 .
+.TP
+.IB a1 , a2
+The substring from the beginning of
+.I a1
+to the end of
+.IR a2 .
+If
+.I a1
+is missing,
+.B 0
+is substituted.
+If
+.I a2
+is missing,
+.B $
+is substituted.
+.TP
+.IB a1 ; a2
+Like
+.IB a1 , a2\f1,
+but with
+.I a2
+evaluated at the end of, and dot set to,
+.IR a1 .
+.PD
+.PP
+The operators
+.B +
+and
+.B -
+are high precedence, while
+.B ,
+and
+.B ;
+are low precedence.
+.PP
+In both
+.B +
+and
+.B -
+forms, if
+.I a2
+is a line or character address with a missing
+number, the number defaults to 1.
+If
+.I a1
+is missing,
+.L .
+is substituted.
+If both
+.I a1
+and
+.I a2
+are present and distinguishable,
+.B +
+may be elided.
+.I a2
+may be a regular
+expression; if it is delimited by
+.LR ? 's,
+the effect of the
+.B +
+or
+.B -
+is reversed.
+.PP
+It is an error for a compound address to represent a malformed substring.
+Some useful idioms:
+.IB a1 +-
+(\f2a1-+\fP)
+selects the line containing
+the end (beginning) of a1.
+.BI 0/ regexp /
+locates the first match of the expression in the file.
+(The form
+.B 0;//
+sets dot unnecessarily.)
+.BI ./ regexp ///
+finds the second following occurrence of the expression,
+and
+.BI .,/ regexp /
+extends dot.
+.SS Commands
+In the following, text demarcated by slashes represents text delimited
+by any printable
+character except alphanumerics.
+Any number of
+trailing delimiters may be elided, with multiple elisions then representing
+null strings, but the first delimiter must always
+be present.
+In any delimited text,
+newline may not appear literally;
+.B \en
+may be typed for newline; and
+.B \e/
+quotes the delimiter, here
+.LR / .
+Backslash is otherwise interpreted literally, except in
+.B s
+commands.
+.PP
+Most commands may be prefixed by an address to indicate their range
+of operation.
+Those that may not are marked with a
+.L *
+below.
+If a command takes
+an address and none is supplied, dot is used.
+The sole exception is
+the
+.B w
+command, which defaults to
+.BR 0,$ .
+In the description, `range' is used
+to represent whatever address is supplied.
+Many commands set the
+value of dot as a side effect.
+If so, it is always set to the `result'
+of the change: the empty string for a deletion, the new text for an
+insertion, etc. (but see the
+.B s
+and
+.B e
+commands).
+.br
+.ne 1.2i
+.SS Text commands
+.PD0
+.TP
+.BI a/ text /
+.TP
+or
+.TP
+.B a
+.TP
+.I lines of text
+.TP
+.B .
+Insert the text into the file after the range.
+Set dot.
+.PD
+.TP
+.B c\fP
+.br
+.ns
+.TP
+.B i\fP
+Same as
+.BR a ,
+but
+.B c
+replaces the text, while
+.B i
+inserts
+.I before
+the range.
+.TP
+.B d
+Delete the text in the range.
+Set dot.
+.TP
+.BI s/ regexp / text /
+Substitute
+.I text
+for the first match to the regular expression in the range.
+Set dot to the modified range.
+In
+.I text
+the character
+.B &
+stands for the string
+that matched the expression.
+Backslash behaves as usual unless followed by
+a digit:
+.BI \e d
+stands for the string that matched the
+subexpression begun by the
+.IR d -th
+left parenthesis.
+If
+.I s
+is followed immediately by a
+number
+.IR n ,
+as in
+.BR s2/x/y/ ,
+the
+.IR n -th
+match in the range is substituted.
+If the
+command is followed by a
+.BR g ,
+as in
+.BR s/x/y/g ,
+all matches in the range
+are substituted.
+.TP
+.BI m " a1
+.br
+.ns
+.TP
+.BI t " a1
+Move
+.RB ( m )
+or copy
+.RB ( t )
+the range to after
+.IR a1 .
+Set dot.
+.SS Display commands
+.PD 0
+.TP
+.B p
+Print the text in the range.
+Set dot.
+.TP
+.B =
+Print the file name and line address of the range.
+.TP
+.B =#
+Print the file name and character address of the range.
+.PD
+.SS File commands
+.PD0
+.TP
+.BI * " b " file-list
+Set the current file to the first file named in the list
+that
+.I acme
+has displayed.
+The list may be expressed
+.BI < "command"
+in which case the file names are taken as words (in the shell sense)
+generated by the command.
+.TP
+.BI * " B " file-list
+Same as
+.BR b ,
+except that file names not displayed are entered there,
+and all file names in the list are examined.
+.TP
+.BI * " D " file-list
+Delete the named files from the menu.
+If no files are named, the current file is deleted.
+It is an error to
+.B D
+a modified file, but a subsequent
+.B D
+will delete such a file.
+.PD
+.SS I/O Commands
+.PD0
+.TP
+.BI * " e " filename
+Replace the file by the contents of the named external file.
+Set dot to the beginning of the file.
+.TP
+.BI r " filename
+Replace the text in the range by the contents of the named external file.
+Set dot.
+.TP
+.BI w " filename
+Write the range (default
+.BR 0,$ )
+to the named external file.
+.TP
+.BI * " f " filename
+Set the file name and print the resulting menu entry.
+.PP
+If the file name is absent from any of these, the current file name is used.
+.B e
+always sets the file name;
+.B r
+and
+.B w
+do so if the file has no name.
+.TP
+.BI < " command
+Replace the range by the standard output of the command.
+.TP
+.BI > " command
+Send the range to the standard input of the command.
+.TP
+.BI | " command
+Send the range to the standard input, and replace it by
+the standard output, of the command.
+.TP
+.BI * " cd " directory
+Change working directory.
+If no directory is specified,
+.B $home
+is used.
+.PD
+.PP
+In any of
+.BR < ,
+.BR > ,
+or
+.BR | ,
+if the
+.I command
+is omitted the last
+.I command
+(of any type) is substituted.
+.SS Loops and Conditionals
+.PD0
+.TP
+.BI x/ regexp / " command
+For each match of the regular expression in the range, run the command
+with dot set to the match.
+Set dot to the last match.
+If the regular
+expression and its slashes are omitted,
+.L /.*\en/
+is assumed.
+Null string matches potentially occur before every character
+of the range and at the end of the range.
+.TP
+.BI y/ regexp / " command
+Like
+.BR x ,
+but run the command for each substring that lies before, between,
+or after
+the matches that would be generated by
+.BR x .
+There is no default regular expression.
+Null substrings potentially occur before every character
+in the range.
+.TP
+.BI * " X/ regexp / " command
+For each file whose menu entry matches the regular expression,
+make that the current file and
+run the command.
+If the expression is omitted, the command is run
+in every file.
+.TP
+.BI * " Y/ regexp / " command
+Same as
+.BR X ,
+but for files that do not match the regular expression,
+and the expression is required.
+.TP
+.BI g/ regexp / " command
+.br
+.ns
+.TP
+.BI v/ regexp / " command
+If the range contains
+.RB ( g )
+or does not contain
+.RB ( v )
+a match for the expression,
+set dot to the range and run the command.
+.PP
+These may be nested arbitrarily deeply, but only one instance of either
+.B X
+or
+.B Y
+may appear in a \%single command.
+An empty command in an
+.B x
+or
+.B y
+defaults to
+.BR p ;
+an empty command in
+.B X
+or
+.B Y
+defaults to
+.BR f .
+.B g
+and
+.B v
+do not have defaults.
+.PD
+.SS Miscellany
+.TF (empty)
+.TP
+.BI * " u " n
+Undo the last
+.I n
+(default 1)
+top-level commands that changed the contents or name of the
+current file, and any other file whose most recent change was simultaneous
+with the current file's change.
+Successive
+.BR u 's
+move further back in time.
+The only commands for which u is ineffective are
+.BR cd ,
+.BR u ,
+.B w
+and
+.BR D .
+If
+.I n
+is negative,
+.B u
+`redoes,' undoing the undo, going forwards in time again.
+.TP
+(empty)
+If the range is explicit, set dot to the range.
+If no address is specified (the
+command is a newline) dot is extended in either direction to
+line boundaries and printed.
+If dot is thereby unchanged, it is set to
+.B .+1
+and printed.
+.PD
+.SS Grouping and multiple changes
+Commands may be grouped by enclosing them in braces
+.BR {} .
+Commands within the braces must appear on separate lines (no backslashes are
+required between commands).
+Semantically, an opening brace is like a command:
+it takes an (optional) address and sets dot for each sub-command.
+Commands within the braces are executed sequentially, but changes made
+by one command are not visible to other commands (see the next
+paragraph).
+Braces may be nested arbitrarily.
+.PP
+When a command makes a number of changes to a file, as in
+.BR x/re/c/text/ ,
+the addresses of all changes to the file are computed in the original file.
+If the changes are in sequence,
+they are applied to the file.
+Successive insertions at the same address are catenated into a single
+insertion composed of the several insertions in the order applied.
+.SH FILES
+.TF /appl/acme/acme/*/src
+.TP
+.B $home/acme.dump
+default file for
+.B Dump
+and
+.BR Load ;
+also where state is written if
+.I acme
+dies unexpectedly.
+.TP
+.B /acme/*/guide
+template files for applications
+.TP
+.B /acme/*/readme
+informal documentation for applications
+.TP
+.B /appl/acme/acme/*/src
+source for applications
+.TP
+.B /acme/dis
+dis files for applications
+.SH SOURCE
+.B /appl/acme
+.br
+.B /appl/acme/acme/bin/src/win.b
+.SH SEE ALSO
+.IR acme (4)
+.br
+Rob Pike,
+.IR "Acme: A User Interface for Programmers" ", Volume 2"
+.SH BUGS
+With the
+.B -l
+option or
+.B Load
+command,
+the recreation of windows under control of external programs
+such as
+.I win
+is just to rerun the command; information may be lost.
--- /dev/null
+++ b/man/1/alphabet-abc
@@ -1,0 +1,141 @@
+.TH ALPHABET-ABC 1
+.SH NAME
+abc \- alphabet declarations
+.SH SYNOPSIS
+.EX
+load alphabet
+typeset /abc
+type /abc
+.EE
+.SH DESCRIPTION
+.B Grid
+is a typeset for
+.I alphabet
+(see
+.IR sh-alphabet (1))
+which enables
+allows direct interconnection of
+remote and local processing components. It defines one new type,
+.BR endpoint ,
+which represents
+a place in the network to which two parties can
+connect and exchange data.
+.PP
+In the following descriptions, if a type
+is not
+.B endpoint
+or a type defined in the root typeset (see
+.IR alphabet-main (1)),
+it is assumed to be of type
+.BR /string .
+.PP
+Modules currently provided within
+the
+.B /grid
+typeset include:
+.TP 10
+\f5farm [\f5-lnkavA\fP] \fIendpoint\fP \fIaddr\fP \fItasktype\fP [\fIarg\fP...] -> \fIendpoint\fP
+.B Farm
+connects to a grid labour exchange (see
+.IR scheduler (4))
+at
+.IR addr ,
+starts a new job of type
+.BR workflow ,
+and passes all the data read from
+.I endpoint
+to be processed by the currently available labour.
+The data is split into records, each one of which will be
+processed on a worker node by
+.IR tasktype ,
+with its associated
+.IR arg uments.
+Other than
+.BR -A ,
+which specifies unauthenticated access to the
+scheduler,
+the various options are all passed verbatim to
+.IR workflow :
+.B -l
+causes it to split its input on newline-separated records;
+.B -n
+specifies that no record separation is necessary on output;
+.B -k
+specifies that intermediate data for failed tasks should
+be kept around;
+.B -a
+specifies that intermediate data for all tasks should
+be kept around, and
+.B -v
+specifies that
+.I workflow
+should produce a wordy description of what it is doing.
+.TP
+\f5local\fP \fIendpoint\fP -> \fI/fd\fP
+.B Local
+reads everything from
+.IR endpoint ,
+and writes it to
+.IR fd .
+.TP
+\f5remote\fP [-a \fIaddr\fP] \fIfd\fP -> \fIendpoint\fP
+.B Remote
+is the inverse of
+.BR local :
+it reads data from
+.I fd
+and writes it to a newly created endpoint.
+If
+.B -a
+is given,
+.I addr
+specifies the network address of an endpoint server
+on which to create the new endpoint.
+.TP
+\f5rexec\fP [\f5-A\fP] \fIendpoint\fP \fIaddr\fP \fIcmd\fP -> \fIendpoint\fP
+.B Rexec
+connects to a remote execution server at
+.I addr
+(unauthenticated if
+.B -A
+is specified), and arranges to execute the
+.I alphabet
+expression
+.I cmd
+there. The expression should be compatible with usage
+.BR "fd -> fd" .
+Data from the argument
+.I endpoint
+will be piped through this expression, and
+made available as the resulting
+.I endpoint
+endpoint.
+.SH EXAMPLES
+The examples below that a local endpoint is available, and the following
+.I alphabet
+declarations:
+.EX
+ load alphabet
+ typeset /grid
+ type /string /endpoint /fd
+ import /grid/local /grid/remote
+ autoconvert fd endpoint remote
+.EE
+Set up a rendering pipeline:
+.EX
+ -{/read /tmp/somedata |
+ remote |
+ rexec tcp!node1!rexec "{(/fd); /filter $1 "{os render_stage1}} |
+ rexec tcp!node2!rexec "{(/fd); /filter $1 "{os render_stage2}} |
+ /create /tmp/somedata.result
+ }
+.EE
+.SH SOURCE
+.BR /appl/alphabet/grid.b ,
+.BR /appl/alphabet/gridtypes.b
+.br
+.B /appl/cmd/grid/*.b
+.SH SEE ALSO
+.IR sh-alphabet (1),
+.IR alphabet-main (1),
+.IR sh (1)
--- /dev/null
+++ b/man/1/alphabet-fs
@@ -1,0 +1,425 @@
+.TH ALPHABET-FS 1
+.SH NAME
+fs \- file-hierarchy traversal
+.SH SYNOPSIS
+.EX
+load alphabet
+typeset /fs
+type /fs/fs
+type /fs/entries
+type /fs/gate
+type /fs/selector
+.EE
+.SH DESCRIPTION
+.B Fs
+is a typeset for
+.I alphabet
+(see
+.IR sh-alphabet (1))
+which enables filtering of the contents of hierarchical filesystems.
+.I Fs
+defines four new types:
+.TP 10
+.B fs
+The complete contents of a filesystem.
+.TP
+.B entries
+Information about the entries in a filesystem without
+their content.
+.TP
+.B gate
+A condition that can be used with conditional verbs.
+A gate is open to entries satisfying particular
+criteria.
+.TP
+.B selector
+A comparator which compares two entries
+and selects one, both or neither of them.
+.PP
+In the following description of the verbs provided,
+an entry such as:
+.TP 10
+.B print \fIentries\fP \fR->\fP status
+.PP
+describes a verb
+.BR print ,
+which takes one argument of type
+.IR entries ,
+and the result of which is of type
+.BR status .
+If the type is not one of those described above,
+it should be taken to be of type
+.IR string .
+.PP
+All types and modules names are taken to be relative to
+the typeset root,
+.BR /fs .
+.PP
+Modules defined within
+.I fs
+include:
+.TP 10
+\f5and\fP \fIgate gate\fP [\fIgate\fP...] -> \fIgate\fP
+.B And
+is a gate that is open to an entry if all its arguments are open.
+.TP
+\f5bundle\fP \fIfs\fP -> \fIvoid\fP
+.B Bundle
+converts
+.I fs
+to an archival format and writes it to the standard output.
+.TP
+\f5compose\fP [\f5-d\fP] \fIop\fP -> \fIselector\fP
+.B Compose
+implements ``compositing''-style operators, useful when
+merging filesystems.
+.I Op
+specifies the operator, taking its name from
+the graphical Porter-Duff equivalent:
+.BR AinB ,
+.BR AinB ,
+.BR BinA ,
+.BR AoutB ,
+.BR BoutA ,
+.BR A ,
+.BR AoverB ,
+.BR AatopB ,
+.BR AxorB ,
+.BR B ,
+.BR BoverA ,
+or
+.BR BatopA.
+For instance,
+.B AinB
+gives the intersection of A and B;
+.B AatopB
+gives A whereever both A and B exist, and B otherwise.
+When used as a selector for
+.BR merge ,
+operators that exclude
+the union of A and B are not very useful, as they will
+exclude all common directories at the top level.
+Given the
+.B -d
+option, compose will allow through directories that
+would otherwise be excluded in this way, making
+operators such as
+.B AxorB
+(all that A does not hold in common with B)
+more useful, although accurate only for regular files.
+.TP
+\f5depth\fP \fIn\fP -> \fIgate\fP
+.B Depth
+is a gate open only to entries which are within
+.I n
+levels of the root of the filesystem.
+.TP
+\f5entries\fP \fIfs\fP -> \fIentries\fP
+.B Entries
+produces all the entries contained within
+.IR fs .
+.TP
+\f5filter\fP [\f5-d\fP] \fIfs\fP\fIgate\fP -> \fIfs\fP
+The result of
+.B filter
+is a filesystem from which all entries that will
+not pass through
+.IR gate ,
+and their descendents, have been removed.
+If the
+.B -d
+flag is given, only files are filtered \- directories bypass the gate.
+.TP
+\f5ls\fP [\f5-um\fP] \fIentries\fP -> \fIvoid\fP
+Print each entry in the style of
+.B ls -l
+(see
+.IR ls (1)).
+If the
+.B -u
+flag is given, the file access time rather than the file modification time
+will be printed. If the
+.B -m
+flag is given, the name of the user that last modified the file
+is printed too.
+.TP
+\f5exec\fP [\f5-pP\fP] [\f5-t\fP \fIcmd\fP] [\f5-n\fP \fIn\fP] \fIentries cmd\fP -> \fIvoid\fP
+Run its argument
+.I cmd
+for each entry in
+.I entries .
+If the
+.B -n
+flag is specified,
+.B exec
+will try to gather
+.I n
+entries together before invoking the command (default 1).
+The environent variable
+.B $file
+is set to the names of the entries that have been gathered.
+If the
+.B -p
+flag is given, environment variables are set giving information
+about the mode, owner, modification time and size of the entry
+(they are named after the equivalent field
+names in the
+.B Dir
+structure; see
+.IR sys-stat (2)).
+This option is only valid when
+.I n
+is 1.
+The
+.B -P
+flag causes all the other fields in the Dir structure to be included too.
+Note that the command is run in the same shell context each time,
+so environment variable set on one execution can
+be retrieved on the next. The
+.B -t
+flag can be used to specify a command which will be executed
+just before termination.
+.TP
+\f5match\fP [\f5-ar\fP] \fIpattern\fP -> \fIgate\fP
+.B Match
+is a gate that is open if the entry's filename
+matches the
+.IR pattern .
+If the
+.B -a
+flag is given, the whole path will be used
+for the match.
+If
+.B -r
+is specified, the pattern is evaluated as a regular expression,
+otherwise it is a shell-style pattern in the style of
+.IR filepat (2).
+.TP
+\f5merge\fP [\f5-1\fP] [\f5-c\fP \fIselector\fP] \fIfs fs\fP [\fIfs\fP...] -> \fIfs\fP
+Recursively merge the contents of its argument
+filesystems.
+.I Selector
+is consulted to see which entries are chosen for the result;
+if not given, entries are resolved in favour of the first filesystem
+(equivalent to
+.BR "{compose AoverB}").
+If the
+.B -1
+flag is given, merging takes place only in the top-level directory.
+.TP
+\f5mode\fP \fIspec\fP -> \fIgate\fP
+.B Mode
+is a gate that lets through entries whose file permissions
+satisfy
+.IR spec ,
+which is a string in the style of
+.IR chmod (1).
+If the
+.I op
+field is
+.BR + ,
+the specified permissions must be present; if
+.BR - ,
+they must be absent, and if
+.BR = ,
+they must be exactly as given.
+The directory and auth modes are specified with
+the characters ``\f5d\fP'' and ``\f5A\fP''
+respectively.
+.TP
+\f5not\fP \fIgate\fP -> \fIgate\fP
+.B Not
+is a gate open to an entry if its argument is not.
+.TP
+\f5or\fP \fIgate gate\fP [\fIgate\fP...] -> \fIgate\fP
+.B Or
+is a gate open to an entry if any argument is open.
+.TP
+\f5path\fP [\f5-x\fP] \fIpath\fP... -> \fIgate\fP
+.B Path
+is a gate open to an entry whose full pathname
+is an ancestor or a descendent of any
+.IR path.
+If
+.B -x
+is specified, the gate is open to any path
+.I except
+descendents of the paths given.
+.TP
+\f5pipe\fP [\f5-1pP\fP] \fIfs cmd\fP -> \fIstatus\fP
+.B Pipe
+is similar to exec, except that the contents of all files
+in
+.I fs
+are piped through
+.IR cmd .
+Unless the
+.B -1
+option is given,
+.I cmd
+is started once for each file, with
+.B $file
+set to its name, and other environment variables
+set according to the
+.B -p
+or
+.B -P
+options, as for
+.BR exec .
+If the
+.B -1
+option is specified,
+.I cmd
+is started once only \- all file data is piped through that.
+.TP
+\f5print\fP \fIentries\fP -> \fIfd\fP
+Print the path name of each entry to
+.IR fd .
+.TP
+\f5proto\fP [\f5-r\fP \fIroot\fP] \fIprotofile\fP -> \fIfs\fP
+Evaluate
+.I protofile
+as a
+.IR mkfs (8)
+.I proto
+file. If
+.I root
+is specified, it will be used as the root of the resulting
+.IR fs .
+.TP
+\f5query\fP \fIcmd\fP -> \fIgate\fP
+.B Query
+is a gate that runs
+.I cmd
+to determine whether it is open: an empty
+exit status from the command yields an open gate.
+The environment variable
+.B $file
+is set for the command to the path name of the entry that is being queried for.
+.TP
+\f5run\fP \fIcmd\fP -> \fIstring\fP
+.B Run
+runs
+.I cmd
+and substitutes the value of the environment variable
+.B $s
+after its invocation.
+.B $s
+must have exactly one element.
+.TP
+\f5select\fP \fIgate entries\fP -> \fIentries\fP
+Select only those entries within
+.I entries
+that will pass through
+.IR gate .
+Descendents of elided entries are not affected.
+.TP
+\f5setroot\fP [\f5-c\fP] \fIfs\fP \fIpath\fP -> \fIfs\fP
+.B Setroot
+sets the name of the root directory of
+.IR fs .
+If the
+.B -c
+flag is given, the elements in the root directory
+will be made explicit in the hierarchy (i.e. the
+name of the top directory will not contain any
+.B /
+characters).
+.TP
+\f5size\fP \fIentries\fP -> \fIfd\fP
+Print the sum of the size of all entries, in bytes to
+.IR fd .
+.TP
+\f5unbundle\fP \fIfd\fP -> \fIfs\fP
+.B Unbundle
+reads an archive as produced by
+.B bundle
+from
+.IR fd ;
+its result is the contents of the filesystem that was
+originally bundled.
+.TP
+\f5walk\fP \fIpath\fP -> \fIfs\fP
+.B Walk
+produces a filesystem that is the result of
+traversing all the files and directories underneath
+.IR path .
+.TP
+\f5write\fP \fIfs dir\fP -> \fIvoid\fP
+Write the contents of
+.I fs
+to the filesystem rooted at
+.I dir .
+If
+.I dir
+is empty,
+.I fs
+will be written to the root directory originally associated with fs.
+.SH EXAMPLES
+The examples below assume the following
+.I alphabet
+declarations:
+.EX
+ load alphabet
+ typeset /fs
+ type /string /fd /fs/fs /fs/entries /fs/gate
+ import /fs/size /fs/walk /fs/select /fs/mode /fs/merge
+ import /fs/compose /fs/exec /fs/bundle /fs/write /fs/unbundle
+ import /fs/print /fs/depth /fs/filter /fs/query
+ autoconvert string fs walk
+ autoconvert fs entries /fs/entries
+ autoconvert string gate /fs/match
+ autoconvert entries fd /fs/print
+ autoconvert fd /status {(/fd); /print $1 1}
+.EE
+Print the size of all files below the current directory:
+.EX
+ -{size .}
+.EE
+Show the names of all files in x that aren't in y:
+.EX
+ -{walk x | merge -c {compose -d AoutB} y | select {mode -d}}
+.EE
+Remove all files from /appl ending in
+.BR .dis :
+.EX
+ -{walk /appl | select '*.dis' | exec "{rm $file}}
+.EE
+Recursively copy the current directory to
+.BR /tmp/foo .
+.EX
+ -{write . /tmp/foo}
+.EE
+Interactively remove all regular files from one level of the current directory:
+.IP
+.EX
+ -{walk . |
+ filter {depth 1} |
+ select {mode -d} |
+ select {
+ query "{echo -n $file:; ~ `{read} y yes}
+ } |
+ exec "{rm $file}
+ }
+.EE
+.PP
+Create a new archive containing those files from below the current directory
+that were held in an old archive:
+.EX
+ -{merge -c {compose AinB} . {unbundle old.bundle} |
+ bundle |
+ /create new.bundle
+ }
+.EE
+.SH SOURCE
+.BR /appl/alphabet/fs.b ,
+.BR /appl/alphabet/fstypes.b
+.BR /appl/alphabet/auxi/fsfilter.b
+.br
+.B /appl/cmd/fs/*.b
+.br
+.SH SEE ALSO
+.IR sh-alphabet (1),
+.IR alphabet-main (1),
+.IR alphabet-fs (2),
+.IR sh (1)
--- /dev/null
+++ b/man/1/alphabet-grid
@@ -1,0 +1,141 @@
+.TH ALPHABET-GRID 1
+.SH NAME
+grid \- peer-to-peer data distribution
+.SH SYNOPSIS
+.EX
+load alphabet
+typeset /grid
+type /grid/endpoint
+.EE
+.SH DESCRIPTION
+.B Grid
+is a typeset for
+.I alphabet
+(see
+.IR sh-alphabet (1))
+which enables
+allows direct interconnection of
+remote and local processing components. It defines one new type,
+.BR endpoint ,
+which represents
+a place in the network to which two parties can
+connect and exchange data.
+.PP
+In the following descriptions, if a type
+is not
+.B endpoint
+or a type defined in the root typeset (see
+.IR alphabet-main (1)),
+it is assumed to be of type
+.BR /string .
+.PP
+Modules currently provided within
+the
+.B /grid
+typeset include:
+.TP 10
+\f5farm [\f5-lnkavA\fP] \fIendpoint\fP \fIaddr\fP \fItasktype\fP [\fIarg\fP...] -> \fIendpoint\fP
+.B Farm
+connects to a grid labour exchange (see
+.IR scheduler (4))
+at
+.IR addr ,
+starts a new job of type
+.BR workflow ,
+and passes all the data read from
+.I endpoint
+to be processed by the currently available labour.
+The data is split into records, each one of which will be
+processed on a worker node by
+.IR tasktype ,
+with its associated
+.IR arg uments.
+Other than
+.BR -A ,
+which specifies unauthenticated access to the
+scheduler,
+the various options are all passed verbatim to
+.IR workflow :
+.B -l
+causes it to split its input on newline-separated records;
+.B -n
+specifies that no record separation is necessary on output;
+.B -k
+specifies that intermediate data for failed tasks should
+be kept around;
+.B -a
+specifies that intermediate data for all tasks should
+be kept around, and
+.B -v
+specifies that
+.I workflow
+should produce a wordy description of what it is doing.
+.TP
+\f5local\fP \fIendpoint\fP -> \fI/fd\fP
+.B Local
+reads everything from
+.IR endpoint ,
+and writes it to
+.IR fd .
+.TP
+\f5remote\fP [-a \fIaddr\fP] \fIfd\fP -> \fIendpoint\fP
+.B Remote
+is the inverse of
+.BR local :
+it reads data from
+.I fd
+and writes it to a newly created endpoint.
+If
+.B -a
+is given,
+.I addr
+specifies the network address of an endpoint server
+on which to create the new endpoint.
+.TP
+\f5rexec\fP [\f5-A\fP] \fIendpoint\fP \fIaddr\fP \fIcmd\fP -> \fIendpoint\fP
+.B Rexec
+connects to a remote execution server at
+.I addr
+(unauthenticated if
+.B -A
+is specified), and arranges to execute the
+.I alphabet
+expression
+.I cmd
+there. The expression should be compatible with usage
+.BR "fd -> fd" .
+Data from the argument
+.I endpoint
+will be piped through this expression, and
+made available as the resulting
+.I endpoint
+endpoint.
+.SH EXAMPLES
+The examples below that a local endpoint is available, and the following
+.I alphabet
+declarations:
+.EX
+ load alphabet
+ typeset /grid
+ type /string /endpoint /fd
+ import /grid/local /grid/remote
+ autoconvert fd endpoint remote
+.EE
+Set up a rendering pipeline:
+.EX
+ -{/read /tmp/somedata |
+ remote |
+ rexec tcp!node1!rexec "{(/fd); /filter $1 "{os render_stage1}} |
+ rexec tcp!node2!rexec "{(/fd); /filter $1 "{os render_stage2}} |
+ /create /tmp/somedata.result
+ }
+.EE
+.SH SOURCE
+.BR /appl/alphabet/grid.b ,
+.BR /appl/alphabet/gridtypes.b
+.br
+.B /appl/cmd/grid/*.b
+.SH SEE ALSO
+.IR sh-alphabet (1),
+.IR alphabet-main (1),
+.IR sh (1)
--- /dev/null
+++ b/man/1/alphabet-main
@@ -1,0 +1,240 @@
+.TH ALPHABET-MAIN 1
+.SH NAME
+main \- operators on the basic Alphabet types
+.SH SYNOPSIS
+.EX
+load alphabet
+type /string
+type /fd
+type /wfd
+type /status
+type /cmd
+.br
+.SH DESCRIPTION
+.I Main
+refers to operators defined
+.IR Alphabet 's
+(see
+.IR sh-alphabet (1))
+root typeset
+.RB ( / ).
+.PP
+In the following description of the modules provided,
+an entry such as:
+.TP 10
+.B echo \fIstring\fP \fR->\fP fd
+.PP
+describes a verb
+.BR echo ,
+which takes one argument of type
+.IR string ,
+and the result of which is of type
+.BR fd .
+If the type is not one of those described above,
+it should be taken to be of type
+.IR string .
+.PP
+All types and modules names are taken to be relative to
+the typeset root,
+.BR / .
+.PP
+Modules defined within
+.I main
+include:
+.TP 10
+\f5auth\fP [\f5-v\fP] [\f5-k\fP \fIkeyfile\fP] [\f5-C\fP \fIalg\fP] \fIwfd\fP -> \fIwfd\fP
+.B Auth
+authenticates to a server connected to its argument
+.IR wfd ,
+and optionally adds encryption to the stream.
+If
+.I keyfile
+is given, it gives the filename of a key file (by default
+.BI /usr/ user /keyring/default
+is used).
+If
+.I alg
+is given, it specifies the encryption/hash algorithm to
+push (e.g.
+.BR rc4_256/md5 ).
+If the
+.B -v
+flag is given,
+.B auth
+will print the name of the authenticated user to its diagnostic stream.
+.TP
+\f5cat\fP [\fIfd\fP...] -> \fIfd\fP
+.B Cat
+reads all the data from each
+.I fd
+in sequence
+and writes it to its resulting
+.IR fd .
+.TP
+\f5create\fP \fIfd\fP \fIf\fP -> \fIstatus\fP
+.B Create
+creates a file named
+.I f
+and writes to it all the data from
+.IR fd .
+.I Status
+will be empty if the writing has completed successfully.
+.TP
+\f5dial\fP \fIaddr\fP -> \fIwfd\fP
+.B Dial
+makes a connection to network address
+.IR addr
+(see
+.IR dial (2)
+for the address format),
+and returns the resulting connection.
+.TP
+\f5echo\fP [-\fIn\fP] \fIstring\fP -> \fIfd\fP
+.B Echo
+writes its argument
+.I string
+to its resulting
+.IR fd .
+If the
+.B -n
+option is given, no newline will be appended.
+.TP
+\f5export\fP \fIdir\fP -> \fIwfd\fP
+.B Export
+exports the namespace rooted at
+.I dir
+and serves it as a styx service on
+.IR wfd .
+.TP
+\f5fd\fP \fIn\fP -> \fIwfd\fP
+.B Fd
+takes file descriptor
+.IR n ,
+and makes it available for reading and/or writing
+as
+.IR wfd .
+.TP
+\f5filter\fP \fIfd\fP \fIcmd\fP \fIarg\fP... -> \fIfd\fP
+.B Filter
+starts the shell command
+.IR cmd ,
+and pipes through this all the data from its
+argument
+.I fd
+to its resulting
+.IR fd .
+The provided
+.IR arg uments
+are accessible in the shell command as
+.BR $* .
+.TP
+\f5mount\fP [\f5-abc\fP] [\f5-x\fP \fIaname\fP] \fIwfd\fP \fIdir\fP -> \fIstatus\fP
+.B Mount
+mounts a connection to a styx server (\fIwfd\fP)
+onto
+.IR dir .
+The meaning of the
+.BR -a ,
+.BR -b ,
+and
+.B -c
+flags is the same as for
+.IR mount (1).
+.IR Aname ,
+if given, gives the attach name that will be passed with the mount request.
+'\".TP
+'\"\f5par\fP \fIstatus\fP... -> \fIstatus\fP
+'\".B Par
+'\"allows all its arguments to run in parallel.
+'\"Its exit status is that of the last argument that
+'\"returned a non-clean status.
+.TP
+\f5parse\fP \fIstring\fP -> \fIcmd\fP
+.B Parse
+parses
+.I string
+as a shell command or alphabet expression,
+and returns the result.
+.TP
+\f5print\fP \fIfd\fP \fIn\fP -> \fIstatus\fP
+.B Print
+writes all the data from
+.I fd
+to file descriptor
+.IR n .
+.TP
+\f5pretty\fP \fIcmd\fP -> \fIstring\fP
+.B Pretty
+returns a string representation of the alphabet expression
+.IR cmd
+which is intended to be easier to read.
+.TP
+\f5read\fP \fIf\fP -> \fIfd\fP
+.B Read
+reads the data from file
+.I f
+and writes it to its resulting
+.IR fd .
+.TP
+\f5rewrite\fP [\f5-d\fP \fIdsttype\fP] \fIcmd\fP \fIcmd\fP -> \fIcmd\fP
+.B Rewrite
+rewrites an alphabet expression to its canonical form,
+applying all auto-conversions, expanding all definitions,
+expanding pipe notation and checking that all types are compatible.
+The first
+.I cmd
+argument
+gives the
+.I alphabet
+expression to be rewritten;
+the second
+.I cmd
+should contain shell commands acceptable to
+.IR sh-alphabet (1),
+declaring all the modules used in the expression.
+If
+.I dsttype
+is given, it specifies the return type of the final expression;
+auto-conversions will be applied to attain this type, if possible.
+'\".TP
+'\"\f5seq\fP [\f5-ao\fP] \fIstatus\fP... -> \fIstatus\fP
+'\".B Seq
+'\"allows each of its arguments to run in sequence.
+'\"If the
+'\".B -a
+'\"flag is given, the first non-clean status it encounters
+'\"will cause it to terminate all subsequent arguments.
+'\"If the
+'\".B -o
+'\"flag is given, the first
+'\".I clean
+'\"status does the same.
+'\"Note that some commands (e.g.
+'\".BR create )
+'\"do some work regardless of sequence.
+'\"The resulting status is that of the last command
+'\"that was not terminated.
+.TP
+\f5unparse\fP \fIcmd\fP -> \fIstring\fP
+.B Unparse
+is the inverse operation to
+.BR parse :
+it converts
+.I cmd
+to a string, and returns the result.
+.TP
+\f52fd\fP \fIwfd\fP -> \fIfd\fP
+.B 2fd
+converts the read-write file
+.I wfd
+to the
+read-only
+.IR fd .
+.SH SOURCE
+.BR /appl/alphabet/alphabet.b
+.br
+.B /appl/alphabet/main/*.b
+.SH SEE ALSO
+.IR sh-alphabet (1),
+.IR alphabet-main (2),
+.IR sh (1)
--- /dev/null
+++ b/man/1/ar
@@ -1,0 +1,163 @@
+.TH AR 1
+.SH NAME
+ar \- archive maintainer
+.SH SYNOPSIS
+.B ar
+.I key
+[
+.I posname
+]
+.I afile
+[
+.I file ...
+]
+.SH DESCRIPTION
+.I Ar
+maintains groups of files
+combined into a single archive file,
+.IR afile .
+The main use of
+.I ar
+is to produce and manipulate UNIX archive files, for instance to create
+program packages for Debian Linux.
+Note that only
+.IR iar (10.1)
+can manage archives used as object file libraries by the Inferno and Plan 9 loaders.
+.PP
+.I Key
+is one character from the set
+.BR drqtpmx ,
+optionally concatenated with
+one or more of
+.BR vuaibclo .
+The
+.I files
+are constituents of the archive
+.IR afile .
+The meanings of the
+.I key
+characters are:
+.TP
+.B d
+Delete
+.I files
+from the archive file.
+.TP
+.B r
+Replace
+.I files
+in the archive file, or add them if missing.
+Optional modifiers are
+.RS
+.PD0
+.TP
+.B u
+Replace only files with
+modified dates later than that of
+the archive.
+.TP
+.B a
+Place new files after
+.I posname
+in the archive rather than at the end.
+.TP
+.BR b " or " i
+Place new files before
+.I posname
+in the archive.
+.RE
+.PD
+.TP
+.B q
+Quick. Append
+.I files
+to the end of the archive without checking for duplicates.
+Avoids quadratic behavior in
+.LR "for (i in *.v) ar r lib.a $i" .
+.TP
+.B t
+List a table of contents of the archive.
+If names are given, only those files are listed.
+.TP
+.B p
+Print the named files in the archive.
+.TP
+.B m
+Move the named files to the end or elsewhere,
+specified as with
+.LR r .
+.TP
+.B o
+Preserve the access and modification times of files
+extracted with the
+.B x
+command.
+.TP
+.B x
+Extract the named files.
+If no names are given, all files in the archive are
+extracted.
+In neither case does
+.B x
+alter the archive file.
+.TP
+.B v
+Verbose.
+Give a file-by-file
+description of the making of a
+new archive file from the old archive and the constituent files.
+With
+.BR p ,
+precede each file with a name.
+With
+.BR t ,
+give a long listing of all information about the files,
+somewhat like a listing by
+.IR ls (1),
+showing
+.br
+.ns
+.IP
+.B
+ mode uid/gid size date name
+.TP
+.B c
+Create.
+Normally
+.I ar
+will create a new archive when
+.I afile
+does not exist, and give a warning.
+Option
+.B c
+discards any old contents and suppresses the warning.
+.SH EXAMPLE
+.TP
+.L
+ar cr arch.a manifest *.tar.gz
+Replace the contents of
+.L arch.a
+with the
+.B manifest
+file and all the
+.IR gzip (1)'d
+.I tar
+files in the current directory.
+.SH FILES
+.TF /tmp/art.*.*
+.TP
+.B /tmp/art.*.*
+temporaries
+.SH SOURCE
+.B /appl/cmd/ar.b
+.SH "SEE ALSO"
+.IR 2l (10.1),
+.IR iar (10.1),
+.IR ar (10.6)
+.SH BUGS
+If the same file is mentioned twice in an argument list,
+it may be put in the archive twice.
+.br
+The file format used by this command is taken from UNIX, and
+makes some invalid assumptions,
+for instance that user IDs are numeric.
--- /dev/null
+++ b/man/1/asm
@@ -1,0 +1,48 @@
+.TH ASM 1
+.SH NAME
+asm, disdump \- Dis assembler, Dis disassembler
+.SH SYNOPSIS
+.B asm
+.RB [ -l ]
+.I file
+.br
+.B disdump
+.IR file ...
+.SH DESCRIPTION
+.I Asm
+reads one Dis assembly language
+.I file
+and translates it
+into instructions for the Dis virtual machine.
+The output is written to a file whose name is created
+by taking the last element
+of the input file, stripping any extension, and appending
+.B \&.dis
+For example, the output file for
+.B abc
+would be
+.BR abc.dis ;
+the output file for
+.BR dir/def.s ,
+would be
+.BR def.dis .
+.PP
+The assembler has one option:
+.TP
+.B -l
+Generate a listing, showing the generated object code.
+.PP
+.I Disdump
+prints to the standard output the Dis virtual machine
+instructions in each of its Dis
+.I file
+arguments.
+.SH SOURCE
+.B /appl/cmd/asm
+.br
+.B /appl/cmd/disdump.b
+.SH "SEE ALSO"
+.IR emu (1),
+.IR limbo (1)
+.PP
+``The Dis Virtual Machine'' in Volume 2.
--- /dev/null
+++ b/man/1/auplay
@@ -1,0 +1,120 @@
+.TH AUPLAY 1
+.SH NAME
+auplay, auhdr, raw2iaf, wav2iaf \- basic audio output and conversion
+.SH SYNOPSIS
+.B auplay
+.I file
+\&...
+.PP
+.B auhdr
+.I file
+\&...
+.PP
+.B raw2iaf
+[
+.I option
+\&...
+] [
+.B -o
+.I output
+]
+.I input
+.PP
+.B wav2iaf
+[
+.I input
+]
+.PP
+.B wav2iaf
+.SH DESCRIPTION
+.I Auplay
+plays each
+.I file
+in turn on the audio device
+.B /dev/audio
+(see
+.IR audio (3)),
+setting the device's characteristics in
+.B /dev/audioctl
+to match those of the
+.IR file .
+It uses
+.I stream
+(see
+.IR sys-read (2))
+to stream the data to the device at high priority.
+All files played must be in `Inferno audio format',
+as defined by
+.IR audio (6).
+.PP
+.I Auhdr
+writes the header of each Inferno audio
+.I input
+file to the standard output.
+The header describes the data in a form that can be written directly to
+.BR /dev/audioctl
+to set the device's characteristics.
+.PP
+.I Raw2iaf
+converts the
+.I input
+file, adds an appropriate header to describe the data
+in the Inferno format, and writes the result to the
+.I output
+file.
+The options tell how the bytes in the input file should be interpreted:
+.TP
+.B -8
+rate is 8000 Hz
+.TP
+.B -1
+rate is 11025 Hz
+.TP
+.B -2
+rate is 22050 Hz
+.TP
+.B -4
+rate is 44100 Hz
+.TP
+.B -m
+mono (one channel)
+.TP
+.B -s
+stereo (two channels)
+.TP
+.B -b
+each sample in each channel is one byte (unsigned)
+.TP
+.B -w
+each sample in each channel is 16-bits (little-endian)
+.TP
+.B -a
+input is a-law encoded
+.TP
+.B -u
+input is \(*m-law encoded
+.TP
+.B -p
+input is PCM encoded
+.PP
+.I Wav2iaf
+reads the
+.I input
+file, which must be in Windows WAV format and encoded using PCM,
+and converts the data to Inferno format
+on the standard output.
+.SH SOURCE
+.B /appl/cmd/auplay.b
+.br
+.B /appl/cmd/raw2iaf.b
+.br
+.B /appl/cmd/wav2iaf.b
+.SH SEE ALSO
+.IR sys-read (2),
+.IR audio (3),
+.IR audio (6)
+\" sets rate, chans, bits, enc
+.\" raw2iaf: -8 8000 -1 11025 -2 22050 -4 44100 -m [chan=1] -s [chan=2] -b [byte] -w [16-bit] -a [alaw] -u [ulaw] -p [pcm] [-o output|-] [input|-]
+.\" %s -8124 -ms -bw -aup -o out in
+.\" wav2iaf [infile]
+
--- /dev/null
+++ b/man/1/avr
@@ -1,0 +1,47 @@
+.TH AVR 1
+.SH NAME
+avr \- Atmel AVR support
+.SH SYNOPSIS
+.B avr/burn
+.RB [ -e ]
+.RB [ -r ]
+[
+.BI "-d " device
+]
+.I file.srec
+.SH DESCRIPTION
+Currently there is just one Inferno application to support Atmel AVRs
+but others should appear.
+.PP
+.I Burn
+initialises or verifies the contents of an Atmel ATmega128 AVR.
+The programming board must be connected to a serial port (see
+.IR eia (3)),
+.B /dev/eia0
+by default.
+.I File.srec
+is a file containing the desired flash contents in Motorola S-record format,
+as produced by
+.IR ms2 (10.1).
+By default,
+.I burn
+erases the AVR chip (both flash and EEPROM), then loads the flash with the contents of
+.IR file.srec .
+The
+.B -e
+option stops
+.I burn
+from erasing first, allowing additional code or data to be loaded (but only into an already-erased region).
+If the
+.B -r
+option is given,
+.I burn
+instead compares the contents of the AVR with the data in
+.IR file.srec .
+.I Burn
+supports the MIB510 programming board from Crossbow Technology Inc.
+.SH SOURCE
+.B /appl/cmd/avr/burn.b
+.SH "SEE ALSO"
+.IR eia (3),
+.IR ms2 (10.1)
--- /dev/null
+++ b/man/1/basename
@@ -1,0 +1,40 @@
+.TH BASENAME 1
+.SH NAME
+basename \- strip file name affixes
+.SH SYNOPSIS
+.B basename
+[
+.B -d
+]
+.I string
+[
+.I suffix
+]
+.SH DESCRIPTION
+.I Basename
+deletes any prefix ending in slash
+.RB ( / )
+and the
+.IR suffix ,
+if present in
+.IR string ,
+from
+.IR string ,
+and prints the result on the standard output.
+.PP
+The
+.B -d
+option instead prints the directory component,
+that is,
+.I string
+up to but not including the final slash.
+If the string contains no slash,
+the current directory name
+.L .
+is printed.
+.SH SOURCE
+.B /appl/cmd/basename.b
+.SH SEE ALSO
+.IR cleanname (1),
+.IR pwd (1),
+.IR names (2)
--- /dev/null
+++ b/man/1/bind
@@ -1,0 +1,283 @@
+.TH BIND 1
+.SH NAME
+bind, mount, unmount \- change name space
+.SH SYNOPSIS
+.B bind
+[
+.I option ...
+]
+.I source target
+.PP
+.B mount
+[
+.I option ...
+]
+.I source target
+[
+.I spec
+]
+.PP
+.B unmount
+[
+.I source
+]
+.I target
+.SH DESCRIPTION
+The
+.IR bind
+and
+.IR mount
+commands modify the file name space of the current process
+and other processes in the same name space group
+(see
+.IR sys-pctl (2)).
+For both calls,
+.I target
+is the name of an existing file or directory in the
+current name space where the modification is to be made.
+.PP
+For
+.IR bind ,
+.I source
+is the name of an existing file or directory in the current name space.
+After a successful
+.IR bind ,
+the file name
+.I target
+is an alias for the object originally named by
+.IR source ;
+if the modification doesn't hide it,
+.I source
+will also still refer to its original file.
+The evaluation of
+.I source
+(see
+.IR sys-intro (2))
+happens at the time of the
+.IR bind ,
+not when the binding is later used.
+.PP
+Both
+.I source
+and
+.I target
+files must be of the same type: either both directories or both files.
+.PP
+For
+.IR mount,
+.I source
+can be a
+shell command,
+a network address,
+or a file name.
+If
+.I source
+is surrounded by brace characters
+.RB ( {
+and
+.BR } ),
+it is invoked as a
+.IR sh (1)
+command and its standard input is mounted (no
+authentication takes place in this case).
+If
+.I source
+contains an exclamation mark
+.RB ( ! ),
+or there is no file of that name,
+it is assumed to be a network address for a machine acting
+as a file server.
+This argument should then conform to the conventions
+described in
+.IR dial (2).
+Otherwise
+.I source
+should be the name of a file that when opened gives a connection
+to a file server, something serving the 9P protocol
+described in
+.IR intro (5),
+formerly called `Styx'.
+The optional
+.I spec
+argument to
+.I mount
+is passed in the
+.IR attach (5)
+message and selects amongst different file trees offered by the server.
+.PP
+The effects of
+.I bind
+and
+.I mount
+can be undone by
+.IR unmount .
+If two arguments are given to
+.IR unmount ,
+the effect is to undo a
+.I bind
+or
+.I mount
+with the same arguments. If only one argument is given, everything bound to or mounted on
+.I target
+is unmounted.
+.PP
+By default,
+.I bind
+and
+.IR mount
+replace the
+.I target
+file by the new one,
+.IR source .
+Henceforth, an evaluation of the pathname
+.I target
+will be translated to the new file.
+If they are directories (for
+.IR mount ,
+this condition is true by definition),
+.I target
+becomes a
+.I "union directory"
+consisting of one directory (the
+.IR source
+directory).
+.PP
+A union directory unites the contents of the source and target directories.
+If the same name appears in both directories, the name used is the one in the
+directory that is bound before the other.
+In particular, if the directories have subdirectories of the same name, only
+the contents of the subdirectory in the top directory will be seen.
+If the subdirectory contents are themselves to be united, that must be done
+first in a separate
+.I bind
+or
+.IR mount .
+.PP
+Note that the
+.B #
+character in the name of a kernel device
+must be quoted when used in a
+.I bind
+or
+.I unmount
+command, or the shell will take it as the start of a comment.
+.PP
+Options control aspects of the modification to the name space:
+.TP
+.B -b
+Both files must be directories.
+Add the
+.IR source
+directory to the beginning
+of the union directory represented by the
+.IR target
+directory.
+.TP
+.B -a
+Both files must be directories.
+Add the
+.IR
+source
+directory to the end
+of the union directory represented by the
+.IR target
+directory.
+.TP
+.B -c
+This can be used in addition to any of the above to permit
+creation in a union directory.
+When a new file is created in a union directory,
+it is placed in the first element of the union that has been
+bound or mounted with the
+.B -c
+option.
+If that directory has not got write permission,
+the create fails.
+.TP
+.B -q
+Exit quietly without printing a diagnostic if the bind or mount fails.
+.TP
+.B -A
+For
+.I mount
+only. Do not authenticate the connection to the server before proceeding with
+.IR mount .
+Otherwise the connection is authenticated by
+.IR security-auth (2).
+.TP
+.BI -C " alg"
+For
+.I mount
+only,
+specify the algorithm,
+.IR alg ,
+to be used following authentication for digesting or encryption. See
+.IR ssl (3)
+for the supported algorithms.
+The default is
+.BR none :
+.IR ssl (3)
+is not used after authentication.
+.TP
+.BI -k " kfile "
+For mount only, specify the keyfile to be used when authenticating.
+The default is
+.BI /usr/ user /keyring/default .
+See
+.IR keyring-auth (2)
+for more details.
+(If the
+.B -9
+option is given, this option is interpreted differently: see below.)
+.TP
+.B -9
+For
+.I mount
+only, and only when hosted on Plan 9.
+.I Source
+is a Plan 9 file server; use Plan 9's
+.I factotum
+as authentication agent to authenticate the mount.
+(Note that a Plan 9 file service that is known not to authenticate can be mounted from
+any Inferno host, by using the
+.B -A
+option to suppress Inferno authentication.)
+The existing Plan 9 file servers do not encrypt connections, so the
+.B -C
+option is ignored.
+The value of the
+.B -k
+option is added to the key specification for
+.IR factotum (4)
+for authentication.
+.TP
+.B -P
+When
+.I source
+is a network address, use
+.IR styxpersist (2)
+to try to simulate a permanent connection, even should the server reboot.
+Note the caveats on that page.
+.TP
+.B -o
+For
+.I mount
+only,
+the file server serves the 1995 version of Inferno's Styx protocol, and
+.I mount
+inserts a process that translates to the current version.
+.SH SOURCE
+.B /appl/cmd/bind.b
+.br
+.B /appl/cmd/mount.b
+.br
+.B /appl/cmd/unmount.b
+.SH SEE ALSO
+.IR sh (1),
+.IR dial (2),
+.IR keyring-auth (2),
+.IR security-auth (2),
+.IR sys-intro (2),
+.IR sys-bind (2),
+.IR intro (3),
+.IR getauthinfo (8)
--- /dev/null
+++ b/man/1/blur
@@ -1,0 +1,74 @@
+.TH BLUR 1
+.SH NAME
+blur \- an example program to demonstrate splitting a task over several machines.
+.SH SYNOPSIS
+.TP 40
+.B grid/demo/blur [imagefile]
+- master process
+.TP
+.B grid/demo/blur
+- slave process
+.SH DESCRIPTION
+.I Blur
+is a small program that works in two parts to manipulate an
+.IR image (6).
+The master process takes an image file as an argument and displays the image in a window on screen whilst waiting for and displaying results from the slave processes. Each slave process takes a block of the image at a time and blurs it, reduces the contrast and overlays the result of a simple edge detection analysis.
+.PP
+The only requirement for a master and slave process to work together is that they both have a common
+.B /tmp
+directory. Within this a
+.B /blur
+directory is created and used by both processes. All communication and synchronisation is done through files in this directory. There can be many slave processes running concurrently in order to improve performance.
+
+.SH COMMUNICATION
+All the communication takes place through files in the
+.B /tmp/blur
+directory which is common to all the processses. Once the master process has started, it creates:
+.TP 17
+.B image.bit
+the image being processed
+.TP
+.B data.dat
+processing parameters e.g. block size, blur radius etc
+.TP
+.B working
+tells slave processes to continue reading
+.B todo/
+directory
+.TP
+.B todo/
+contains files showing which blocks still need processing
+.PP
+Within the
+.B todo/
+directory, the master process creates a file for each block to be processed. Starting at
+.BR block.0.a ,
+the name of each file denotes the block number and the version id. The version id is used to indicate the current version of a block being worked on. This is to allow the master process to ask another slave process to work on a block if it believes the current one has crashed or is taking too long. Once a block has been processed, the master removes the file from
+.BR todo/ .
+.PP
+Each slave process reads the list of files in
+.B todo/
+and for each block in turn, attempts to create a directory with the same name e.g.
+.B block.1.a/
+in
+.BR /tmp/blur .
+It is not possible to create a directory if it already exists and as the slave will only process blocks for which it
+.I has
+been able to create a directory, no two slave processes can be simultaneously working on the same block. Once a slave has managed to create a directory, it processes the relevant block of the image and writes the result to
+.B img.bit
+in the directory. Having completed a block, the slave creates a file called
+.B done
+in order to let the master process know that it can read the completed result.
+.PP
+The master process keeps track of all the blocks being processed and if any of them have not been completed after a certain time, it creates a new file for that block in
+.B todo/
+with a new version id. This guarantees that all blocks will be processed as long as at least one working slave process remains. Once all the blocks have been processed, the master process removes all the files created in
+.BR /tmp/blur .
+Each slave, upon seeing that the
+.B working
+file has gone, will then exit.
+
+.SH SOURCE
+.B /appl/grid/demo/blur.b
+.br
+.B /appl/grid/demo/block.b
--- /dev/null
+++ b/man/1/brutus
@@ -1,0 +1,120 @@
+.TH BRUTUS 1
+.SH NAME
+brutus \- screen editor with support for SGML
+.SH SYNOPSIS
+.B wm/brutus
+[
+.I file
+]
+.SH DESCRIPTION
+.I Brutus
+is a multi-file editor for UTF format text files.
+.PP
+When editing multiple files, each file appears in its own window.
+Button 1 can be used to make a window current. Within the current
+window, button 1 selects text.
+Double clicking selects text up to the boundaries of words, lines,
+quoted text or bracketed text depending upon the text at the point of the
+double click. Double clicking at the start of a line
+selects the entire line. Double clicking just inside various forms of
+brace selects text up to the matching brace, correctly handling nested braces.
+Button 2 displays a menu of editing commands:
+.TF snarf
+.TP
+.B cut
+Delete the selected text and save it in the snarf buffer.
+.TP
+.B paste
+Replace the selected text by the contents of the snarf buffer.
+.TP
+.B snarf
+Save the selected text in the snarf buffer.
+.TP
+.B look
+Search forwards and select the next occurrence of the selected text.
+.PD
+.PP
+Mouse chording is implemented, as in
+.IR acme (1).
+Dragging a selection with button-1 held down and then also clicking
+button-2 cuts the selected text into the Snarf buffer.
+Clicking button-3 instead of button-2 replaces the selected text with the contents
+of the Snarf buffer.
+.PP
+Clicking button 3 extracts the whitespace-bounded string around the point of the
+click and plumbs it to the appropriate application (see
+.IR plumber (8)).
+.PP
+A
+.I brutus
+console window is always displayed from which new files may be opened
+or from which existing open files may be selected.
+Typing
+.IP
+.EX
+.BI / word
+.EE
+.PP
+in the console window will search for the character sequence
+.I word
+in the file associated with the current window. Typing
+.IP
+.EX
+.BI ? word
+.EE
+.PP
+in the console window will search backwards for the character sequence
+.IR word .
+If text has been selected in the current window the search begins from the
+end of the selection if searching forwards and the beginning of the selection if
+searching backwards.
+If no text has been selected the search begins from the current insertion point.
+Typing
+.IP
+.EX
+.I linenumber
+.EE
+.PP
+in the console window selects all the text on line
+.I linenumber
+and moves the window to show the selected text.
+.SS SGML
+If the first line of a file is exactly:
+.IP
+.EX
+<SGML>
+.EE
+.PP
+it is assumed to be in SGML format and the contents are displayed according
+to some predefined formatting rules. Tags of the form
+.BI < font . size >
+are recognised and used to control the visual appearance
+of text. The
+.I font
+may be one of:
+.BR Roman ,
+.BR Italic ,
+.BR Bold ,
+and
+.B Type
+giving normal, italicised, emboldened, and constant width text.
+The
+.I size
+may be one of
+.BR 6 ,
+.BR 8 ,
+.BR 10 ,
+.BR 12 ,
+or
+.BR 16 ,
+and determines the point size of the displayed text.
+.SH PLUMBING
+.B wm/brutus
+listens for
+.B edit
+messages and plumbs text selected by button 3
+.SH SOURCE
+.B /appl/wm/brutus.b
+.SH SEE ALSO
+.IR acme (1),
+.IR cook (1)
--- /dev/null
+++ b/man/1/cal
@@ -1,0 +1,46 @@
+.TH CAL 1
+.SH NAME
+cal \- print calendar
+.SH SYNOPSIS
+.B cal
+[
+.I month
+]
+[
+.I year
+]
+.SH DESCRIPTION
+.I Cal
+prints a calendar.
+.I Month
+is either a number from 1 to 12,
+a lower case month name,
+or a lower case three-letter prefix of a month name.
+.I Year
+can be between 1
+and 9999.
+If either
+.I month
+or
+.I year
+is omitted, the current month or year is used.
+If only one argument is given, and it is a number larger than 12,
+a calendar for all twelve months of the given year is produced;
+otherwise a calendar for just one month is printed.
+The calendar
+produced is that for England and her colonies.
+.PP
+Try
+.EX
+ cal sep 1752
+.EE
+.SH SOURCE
+.B /appl/cmd/cal.b
+.SH BUGS
+The year is always considered to start in January even though this
+is historically naive.
+.br
+Beware that
+.L "cal 90"
+refers to the early Christian era,
+not the 20th century.
--- /dev/null
+++ b/man/1/calc
@@ -1,0 +1,272 @@
+.TH CALC 1
+.SH NAME
+calc \- calculator language
+.SH SYNOPSIS
+.B calc
+[
+.B -s
+] [
+.I file
+]
+.PP
+.B calc
+[
+.B -s
+] [
+.I expression
+]
+.SH DESCRIPTION
+.I Calc
+interprets a simple language for floating-point arithmetic
+with Limbo-like syntax and
+functions.
+.PP
+If no
+.I file
+or
+.I expression
+is given
+.I calc
+interprets the standard input.
+.PP
+.I Calc
+input consists of
+.I expressions
+and
+.IR statements .
+Expressions are evaluated and their results printed.
+Statements, typically assignments and function
+definitions, produce no output unless they explicitly call
+.IR print .
+.PP
+Comments begin with # and extend to the end of the line as in Limbo.
+.PP
+Numbers may have a base specified using C or Limbo syntax.
+.PP
+Variable names have the usual syntax, including
+.LR _ .
+They may be introduced without a declaration and have an initial default value
+of 0.0.
+.PP
+The predefined variable
+.B degrees
+can be set to specify angles in degrees rather than radians in the trigonometric functions below. It is initially 0 (angles in radians by default).
+.PP
+The predefined variable
+.B printbase
+can be set to any integer between 2 and 36 inclusive to specify
+the base of all values output.
+.PP
+The constants
+.BR e ,
+.BR Pi (π) ,
+.BR Phi (φ) ,
+.BR Gamma (γ) ,
+.BR Infinity (∞) ,
+and
+.BR Nan (NaN)
+are predefined.
+.PP
+Expressions are formed with these Limbo-like operators, listed by
+decreasing precedence.
+.TP
+.B ! ~ + - ++ --
+.TP
+.B **
+.TP
+.B * / % //
+.TP
+.B + -
+.TP
+.B << >>
+.TP
+.B > >= < <= <->
+.TP
+.B == != -> <-
+.TP
+.BR & " " " " ↑
+.TP
+.B ^
+.TP
+.BR | " " " " ↓
+.TP
+.B &&
+.TP
+.B ||
+.TP
+.B ? :
+.TP
+.B = := += -= *= /= %= //= &= ^= |= <<= >>=
+.TP
+.B ,
+.PP
+If the
+.B -s
+flag is given, a strict interpretation of the declaration rules are enforced - all variables must be declared and initialized first using the
+.B :=
+operator. Otherwise undeclared variables are declared and initialized to 0.0 in the
+current scope. In either case,
+.B :=
+always forces a new declaration.
+.PP
+The extra non-Limbo operators are factorial (! when postfix), integer division (//),
+conditional (? and :) comma (,), logical equivalence (<->), implication (->), reverse implication (<-), nand (↑) and nor (↓).
+.PP
+Unary operators, assignment operators, **, ? and : are right associative as usual.
+.PP
+The comma operator may be replaced by white space in expressions.
+.PP
+Built in functions are
+.BR abs ,
+.BR acos ,
+.BR acosh ,
+.BR asin ,
+.BR asinh ,
+.BR atan ,
+.BR atanh ,
+.BR atan2 ,
+.BR cbrt ,
+.BR ceiling ,
+.BR cos ,
+.BR cosh ,
+.BR erf ,
+.BR exp ,
+.BR floor ,
+.BR frac ,
+.BR gamma (Γ) ,
+.BR int ,
+.BR log ,
+.BR log10 ,
+.BR max ,
+.BR min ,
+.BR pow ,
+.BR rand ,
+.BR round ,
+.BR sign ,
+.BR sin ,
+.BR sinh ,
+.BR sqrt ,
+.BR tan ,
+and
+.BR tanh .
+.PP
+Functions of one argument may be written without brackets:
+.sp
+.EX
+ sin 45
+ sqrt 2
+.EE
+.sp
+These behave as unary operators with the highest precedence.
+.PP
+Sum and product operators are available using sigma (Σ) and pi (Π).
+For example
+.sp
+.EX
+ sigma(i = 0, 100, 1/i!)
+.EE
+.sp
+gives the value 2.7182818284590455 .
+.PP
+Simple definite integration can be done:
+.sp
+.EX
+ integral(x = -1.96, 1.96, exp(-0.5*x*x)/sqrt(2*Pi))
+.EE
+.sp
+outputs 0.9500042096998785 .
+∫ may be used in place of integral.
+.PP
+For the sake of completeness, the derivative of a function at a given
+point can be calculated:
+.sp
+.EX
+ differential(x=1, x*x+5*x+6)
+.EE
+.sp
+gives 7.
+Δ may be used in place of differential.
+.PP
+There is limited support for the solution of equations.
+For example
+.sp
+.EX
+ solve(x**2-5*x+6==0)
+.EE
+.sp
+outputs the values 2 and 3. The value returned by
+.B solve
+is the largest of the roots. To specify the variable to solve for, if
+ambiguous, simply add it as a second parameter as in, for example,
+.sp
+.EX
+ solve(x**2-5*x+6==y**3+z, x)
+.EE
+.sp
+This will substitute the current values of
+.B y
+and
+.B z
+and solve for
+.B x.
+To tune the solution process, the predefined variables
+.B solvelimit
+(default value 100) and
+.B solvestep
+(default value 1) are available.
+The former specifies the maximum absolute solution
+to search for. The latter
+specifies the interval increment to apply when searching
+for sign changes.
+.PP
+.B Print
+prints a list of expressions that may include
+string constants such as
+\fL"hello\en"\f1.\fP
+.PP
+.B Read
+reads in a list of values interactively. The list of variables to assign
+these values should follow.
+.PP
+Other files may be read in using the Limbo include statement.
+.PP
+Control flow statements are
+.BR break ,
+.BR continue ,
+.BR exit ,
+.BR return ,
+.BR if - else ,
+.BR while ,
+.BR do - while ,
+and
+.BR for ,
+with braces for grouping.
+.PP
+The use of semi-colon and newline is optional.
+.PP
+Functions are introduced by the keyword
+.BR fn .
+.SH EXAMPLE
+.EX
+fn ack(a, b)
+{
+ n = n+1
+ if(a == 0)
+ return b+1;
+ if(b == 0)
+ return ack(a-1, 1);
+ return ack(a-1, ack(a, b-1));
+}
+
+for(i = 0; i < 4; i++)
+ for(j = 0; j < 4; j++){
+ n = 0
+ print "ack(", i, ",", j, ")=", ack(i, j), "\en"
+ print n, " calls", "\en"
+ }
+.EE
+.SH SOURCE
+.B /appl/cmd/calc.b
+.SH "SEE ALSO"
+.IR fc (1),
+.IR math-intro (2)
--- /dev/null
+++ b/man/1/calendar
@@ -1,0 +1,47 @@
+.TH CALENDAR 1
+.SH NAME
+calendar \- calendar and diary
+.SH SYNOPSIS
+.B wm/calendar
+[
+.IR mntdir | datafile
+]
+.br
+.SH DESCRIPTION
+.B Calendar
+is a simple calendar and diary program.
+Its optional argument specifies either a directory
+on which has been mounted a
+.I rawdbfs
+(see
+.IR dbfs (4))
+filesystem, or a file in which to store schedule entries
+(which must already exist). In the latter case,
+.I calendar
+starts up an instance of
+.I rawdbfs
+to serve the file. The default argument to
+.I calendar
+is
+.BR /mnt/schedule .
+If two instances of calendar
+are using the same datafile, care should be taken to run
+.I rawdbfs
+.I before
+running the
+.I calendar
+programs, otherwise the data file will be corrupted.
+.SH EXAMPLE
+Start
+.I calendar
+using
+.B $home/cal
+for the data entries:
+.EX
+ rawdbfs $home/cal /mnt/schedule
+ wm/calendar
+.EE
+.SH SOURCE
+.B /appl/wm/calendar.b
+.SH SEE ALSO
+.IR dbfs (4)
--- /dev/null
+++ b/man/1/cat
@@ -1,0 +1,49 @@
+.TH CAT 1
+.SH NAME
+cat \- concatenate files
+.SH SYNOPSIS
+.B cat
+[
+.B -
+]
+[
+.I file ...
+]
+.SH DESCRIPTION
+.I Cat
+reads each
+.I file
+in turn and writes it on the standard output.
+Thus
+.IP
+.EX
+cat file
+.EE
+.PP
+prints the file to standard output, and the following
+.IP
+.EX
+cat file1 file2 >file3
+.EE
+.PP
+concatenates two files onto a third.
+.PP
+If no
+.I file
+is given, or where
+.B \-
+is given as an argument,
+.I cat
+reads from the standard input.
+Output is buffered in blocks matching the input.
+.SH SOURCE
+.B /appl/cmd/cat.b
+.SH "SEE ALSO"
+.IR cp (1),
+.IR stream (1)
+.SH BUGS
+Beware of
+.B "cat a b >a"
+and
+.B "cat a b >b"
+which destroy input files before reading them.
--- /dev/null
+++ b/man/1/cd
@@ -1,0 +1,32 @@
+.TH CD 1
+.SH NAME
+cd \- change working directory
+.SH SYNOPSIS
+.B cd
+[
+.I directory
+]
+.SH DESCRIPTION
+.I Cd
+changes the working directory for the shell and all processes in its
+name space group (see
+.IR sys-pctl (2))
+to
+.IR directory .
+If no argument is given,
+.I cd
+attempts to change to
+.BI /usr/ user
+where
+.I user
+is the name read from
+.BR /dev/user .
+.SH FILES
+.B /dev/user
+.SH SOURCE
+.B /appl/cmd/cd.b
+.SH "SEE ALSO"
+.IR pwd (1),
+.IR sys-chdir (2),
+.IR sys-pctl (2),
+.IR cons (3)
--- /dev/null
+++ b/man/1/charon
@@ -1,0 +1,442 @@
+.TH CHARON 1
+.SH NAME
+charon \- web browser
+.SH SYNOPSIS
+.B charon
+[
+.BI - option
+.RI [ value ]
+]
+.RI [ url ]
+.SH DESCRIPTION
+.I Charon
+is the Inferno graphical web browser, supporting a variety of web standards for
+the download, viewing, automation and navigation of web based information and images.
+.PP
+The browser runs under the
+.IR wm (1)
+window manager, or directly on the
+.IR draw (3)
+and
+.IR cons (3)
+devices.
+When
+.I charon
+starts, it checks to see if
+.I wm
+is running; if it is then
+.I charon
+creates a new
+.I wm
+window for its display, otherwise it uses the whole area of the display device.
+.PP
+.I Charon
+implements an image cache to help reduce the overhead of revisiting pages.
+The image cache resides in memory for the duration of a session.
+The cache is managed by discarding least recently used images once the cache bounds
+have been reached.
+Currently,
+.I charon
+does not provide a general purpose web cache; all other resources have to be reloaded
+when needed.
+.SS Navigation
+.I Charon
+provides navigation controls familiar to any web-surfer:
+back, forward, reload, home, stop and URL entry.
+Navigation of web-based information is by means of following HTML
+.IR links,
+this is done by clicking on them using mouse button-1, or the touch-screen.
+Clicking mouse button-2 on a link causes its address to be displayed in the
+.I status
+line of
+.IR charon 's
+display.
+Navigation to other information is achieved by clicking on the URL entry
+field and typing the address of the resource, followed by the Enter key.
+.PP
+The retrieval and processing of the current page
+is immediately terminated by clicking the Stop button.
+.PP
+As resources are browsed, a history of their web addresses (URLs) is built up.
+At any time you can navigate forwards and backwards through this list using
+the Forward and Back buttons.
+Additionally, clicking the History button, displays the entire history list as a set of
+.I links
+enabling the user to quickly jump to any position in the list.
+.PP
+Sometimes, it is not possible to retrieve all of the components of a web document at the time
+that it is requested.
+Often this is because the remote server is very busy or not available.
+This can result in the presentation of the document being incomplete or even corrupted.
+Clicking the Reload button causes
+.I charon
+to attempt to retrieve the current document and all of its components again.
+.PP
+.I Charon
+displays a progress panel to indicate the download status of each of the components of the
+current document.
+The progress panel is displayed at the bottom of the
+.I charon
+window.
+Each component of the current document is represented by a rectangular block in the
+progress panel.
+As the download of a component progresses, its corresponding block is gradually filled in.
+If an error occurs while downloading or processing the component, its block is coloured red.
+The component address and amount downloaded, or reason for failure, can
+be obtained by clicking mouse button-1 on its progress block.
+.SS "Web Standards"
+Standards are the life-blood of the World-Wide-Web;
+without them, the web could not exist.
+Web standards are under constant review with revised editions and complete new standards
+being published all of the time.
+This section lists the standards supported by
+.I charon
+at the time of writing this manual entry.
+The version of the standard is given, if appropriate, alongside any comments on its
+implementation.
+.PP
+.TP 15
+Protocols
+HTTP versions 1.0 and 1.1
+.IP
+HTTPS: SSL Protocol versions 2.0 and 3.0.
+X.509.v3 server certificates.
+.IP
+FTP:
+.I charon
+supports retrieval of plain text files only, directory listings are not generated.
+.IP
+FILE:
+.I Charon
+attempts to determine the file type by a combination of the filename extension and
+examination of the first few bytes of the file. Directory listings are not generated.
+.TP
+HTML
+It is intended that
+.I charon
+supports HTML version 3.2, but in reality there is
+no single standard!
+.I Charon
+attempts to be as close as possible to Netscape Navigator Version 3 in terms of its
+markup support.
+Obvious bugs in Navigator 3 and
+the Netscape security model have not been adopted.
+.TP
+JavaScript
+.I Charon
+implements ECMAscript-262 2nd Edition, which is roughly equivalent to JavaScript1.1.
+The ECMA-262 standard does not define the
+.I host
+objects and classes that should implemented by the browser.
+.I Charon
+implements the set of host objects and classes of Netscape Navigator version 3.
+.TP
+Encodings
+US_Ascii, ISO_8859_1, UTF_8, Unicode (big-endian)
+.TP
+Images
+GIF87a and GIF89a - animated GIFs always loop.
+.br
+JPEG, XBitmap,
+Inferno BIT
+.IR image (6)
+format.
+.SS Configuration
+While using
+.IR charon ,
+a sub-set of the configuration options can be modified.
+Clicking the Configuration button displays a config popup window, enabling the user
+to modify the current values of the available options.
+.PP
+The full set of configuration options can be modified on the command line or in
+a configuration file.
+Comand line options are processed after the configuration file.
+The configuration file is loaded from
+.BI /usr/ user /charon/config
+where
+.I user
+is obtained by reading the file
+.BR /dev/user .
+If this file does not exist, the file
+.B /services/config/charon.cfg
+is read instead.
+Options are processed in order; some options override settings affected
+by others and so the order in which they are used is important.
+.PP
+Options are specified using a
+.IR key ,
+.I value
+pair.
+On the command line this takes the form:
+.IP
+.BI - key
+.I value
+.PP
+Where
+.BI - key
+and
+.I value
+are individual items in the argument list to
+.IR charon .
+.PP
+In the config file options take the form:
+.IP
+.IB key = value
+.PP
+Where
+.I value
+is the remainder of the input line after the
+.BR ` = '
+character.
+Any text lines in the config file that start with a
+.RB ` # '
+character are ignored as comment lines.
+.SH OPTIONS
+.TF 10
+.TP
+.B userdir
+The directory where
+.I charon
+expects to find its configuration files such as, bookmark and cookie files.
+The default value is
+.BI /usr/ user /charon/
+where
+.I user
+is obtained by reading the file
+.BR /dev/user .
+.TP
+.B starturl
+Specifies the URL of the first document to be displayed by
+.I charon
+at startup.
+The default value is
+.B file://localhost/services/webget/start.html
+.TP
+.B homeurl
+Specifies the URL of the document to retrieve when the Home button is clicked.
+The homeurl can only be changed if the
+.B change_homeurl
+option is enabled.
+Setting
+.B homeurl
+also set the value of the
+.B starturl
+option.
+The default value is
+.B file://localhost/services/webget/start.html
+.TP
+.B change_homeurl
+Enables editing of the Home URL in the configuration popup window.
+A non-zero integer value enables this option, all other values disable it
+This option also enables the
+.B homeurl option.
+The default value is 1.
+.TP
+.B helpurl
+Specifies the URL of the document to retrieve when the Help button is clicked.
+The default value is
+.B file://localhost/services/webget/help.html
+.TP
+.B httpproxy
+Specifies the host name and port of a web proxy server.
+The address is given in the form of a URL, where the optional port number
+can be specified after the server name by separating them by a colon
+.RB ` : '.
+The default value is the empty string, specifying that no web proxy server should be used.
+.TP
+.BI noproxy " or " noproxydoms
+Specifies a list of network domains for which a web proxy should not be used.
+The domains in the list can be separated by semicolon, comma, space or tab characters.
+The default value is the empty list.
+.TP
+.B usessl
+Extends SSL support.
+Accepted values are
+.RB `` v2 ''
+and
+.RB `` v3 ''.
+Initially SSL support is configured off.
+Enabling version 1 or version 2 support restricts SSL support to that specific version.
+Specifying the option twice, once with each of the options, enables dual version
+SSL support whereby the remote server is probed to determine which version it supports.
+Some servers only support one of the versions and may not tolerate the special
+version2/3 probe.
+.TP
+.B buttons
+Specifies the set of buttons that appear on the window manager title-bar.
+The buttons are given as a list of button names separated by comma, space or tab characters.
+Valid button names are
+.BR help ,
+.B resize
+and
+.BR hide .
+The default value is for all buttons to be displayed.
+.TP
+.BI defaultwidth " or " width
+Set the initial window width.
+This option is only meaningful when running under the window manager.
+If the specified width exceeds the screen width then the screen width is used.
+The default value is 630.
+.TP
+.BI defaultheight " or " height
+Set the initial height of the main display panel, this does not include the height
+of the control and progress panels.
+This option is only meaningful when running under the window manager.
+If the total height of the
+.I charon
+window exceeds the screen height, the main display panel height will be reduced to fit.
+The default value is 450.
+.TP
+.BI x " and/or " y
+Set the initial window position.
+These options are only meaningful when running under the window manager.
+The default value for both options is 0.
+.TP
+.B imagelvl
+Specify how to handle image components of a document.
+This option takes a numeric argument.
+A value of 0 prevents images from being downloaded or displayed.
+A value of 1 will download and display images but not animate GIFS - only the first
+frame of an animated GIF will be displayed.
+A value of 2 or more enables full image processing.
+The default value enables full image processing.
+.TP
+.B imagecachenum
+Specify the maximum number of images that can remain resident in the image cache.
+The default value is 60.
+.TP
+.B imagecachemem
+Specify the maximum amount of image memory available to the image cache in bytes.
+The cache is managed such that neither the
+.B imagecachenum
+nor
+.B imagecachemem
+limits are exceeded.
+The image cache tries to ensure that no more than 80% of available system image memory
+is taken by the cache, irrespective of the value of this option.
+The default value is 80% of the system image memory that was available
+.I when charon was started.
+.TP
+.B docookies
+Enable cookie handling.
+A non-zero numeric value enables cookie handling, all other values disable it.
+The cookie cache is maintained in the
+.B cookies
+file in the
+.I userdir
+directory.
+The default value is 0, cookie handling disabled.
+.TP
+.B doscripts
+Enable JavaScript support.
+A non-zero numeric value enables JavaScript, all other values disable it.
+The default value is 0, JavaScript processing disabled.
+.TP
+.B showprogress
+A non-zero numeric value results in the progress panel being displayed.
+All other values hide the progress panel, leaving more vertical space for the main
+display area.
+The default value is 1, causing the progress panel to be displayed
+.TP
+.B http
+Set the version of HTTP to use when communicating with web servers.
+Supported versions are 1.0 and 1.1.
+Any value other than 1.1 results in HTTP1.0 being used.
+The default value is 1.0.
+.TP
+.B nthreads
+Specifies the maximum number of concurrent downloads of document components.
+Generally, if this number is higher, pages will complete faster as
+.I charon
+will not have to wait for the download of one component to complete before another
+can be started.
+The downside is that a higher number of concurrent downloads will use more memory
+during the download process.
+The default value is 4.
+.SH FILES
+.TF /services/config/charon.cfg
+.TP
+.B /services/config/charon.cfg
+The default configuration file.
+.TP
+.IB userdir /config
+The
+.I user
+specific configuration file.
+.I userdir
+is given by the value of the
+.B userdir
+option.
+.TP
+.IB userdir /cookies
+The cookie cache.
+.I userdir
+is given by the value of the
+.B userdir
+option.
+.TP
+.B /services/webget/start.html
+The default start page.
+.TP
+.B /services/webget/help.html
+The default help page.
+.SH SOURCE
+.TF /appl/lib/ecmascript/
+.TP
+.B /appl/charon/
+The main
+.I charon
+source files.
+.TP
+.B /appl/lib/ecmascript/
+Javascript (ECMA-262) implementation.
+.SH BUGS
+.I Charon
+has more than its fair share of real bugs.
+The following list documents the problems that are most likely to be
+encountered.
+.PP
+.I Charon
+implements its table layout as per the algorithm described in rfc1942.
+This sometimes results in table-based documents being laid out differently to other
+browsers.
+.PP
+JavaScript is a source of many problems.
+Many scripts do not specify the language version they employ.
+Additionally different language versions and browsers imply
+a different set of
+.I host
+objects and classes.
+Such differences often give rise to syntax or null reference errors.
+This whole situation places a great burden on the script author to write
+safe and compliant scripts; unfortunately authors
+are rarely aware of this burden!
+.PP
+The following elements of JavaScript1.1 are not fully implemented:
+.PP
+.BR Document.applets ,
+.B Document.embeds
+.I and
+.BR Document.plugins :
+Java Applets are not supported, the arrays are always empty.
+.PP
+.BR Document.onunload :
+The property exists and can be assigned to, but the event is never raised.
+.PP
+.BR Window.open() :
+A new window is never opened. If a URL is specified for the new window, the
+current document will be replaced with that of the new URL.
+.PP
+Other annoyances include:
+.PP
+Window resize forces a complete document reload.
+.PP
+Frames in a frameset are processed one at a time, not concurrently.
+.PP
+It is not possible to save downloaded data to file. This is particularly annoying
+for MIME types that
+.I charon
+does not support.
+.PP
+The history list can get confused, especially when following links in framesets
+before the complete frameset has been downloaded.
--- /dev/null
+++ b/man/1/chgrp
@@ -1,0 +1,44 @@
+.TH CHGRP 1
+.SH NAME
+chgrp \- change file's group or owner
+.SH SYNOPSIS
+.B chgrp
+[
+.B -uo
+]
+.I id
+.I file ...
+.SH DESCRIPTION
+.I Chgrp
+changes the group ownership of each
+.I file
+to the given
+.IR id ,
+if the file's server
+permits it.
+The
+.B -u
+and
+.B -o
+options are equivalent
+and cause
+.I chgrp
+to change file ownership instead,
+if the file's server permits it.
+.PP
+Normally, a file's group can be changed by the file's owner, if the
+owner is a member of the new group, or by the leader of both
+the file's current group and the new group,
+but various underlying devices, file servers and host operating systems
+might not permit the operation at all.
+Group and ownership changes allowed by a given device are documented by
+the device's manual page.
+See
+.IR sys-stat (2)
+for the variations amongst host operating systems.
+.SH SOURCE
+.B /appl/cmd/chgrp.b
+.SH SEE ALSO
+.IR chmod (1),
+.IR ls (1)
+.IR sys-stat (2)
--- /dev/null
+++ b/man/1/chmod
@@ -1,0 +1,105 @@
+.TH CHMOD 1
+.SH NAME
+chmod \- change file mode (permissions)
+.SH SYNOPSIS
+.B chmod
+.I mode
+.I file ...
+.SH DESCRIPTION
+.I Chmod
+changes the mode (permissions) of each
+.I file
+according to
+.IR mode ,
+which may be an octal number or a symbolic change to the existing mode.
+.PP
+A
+.I mode
+can be numerically formed as the
+.SM OR
+of the following octal values (a leading
+.B 8r
+is ignored):
+.TF 0000
+.TP
+0400
+read by owner
+.TP
+0200
+write by owner
+.TP
+0100
+execute (search in directory) by owner
+.TP
+0070
+read, write, execute (search) by group
+.TP
+0007
+read, write, execute (search) by others
+.PD
+.PP
+A symbolic
+.I mode
+has the form:
+.IP
+.RI [ who ]
+.I op permission
+.PP
+The
+.I who
+part is a combination of the letters
+.B u
+(for user's permissions),
+.B g
+(group) and
+.B o
+(other).
+The letter
+.B a
+stands for
+.BR ugo .
+If
+.I who
+is omitted, the default is
+.BR a .
+.PP
+The
+.I op
+field can be:
+.B +
+to add
+.I permission
+to the file's mode,
+.B -
+to take away
+.IR permission ,
+.B =
+to assign
+.I permission
+absolutely (all other bits being reset).
+.PP
+The
+.I permission
+field is any combination of the letters
+.B r
+(read),
+.B w
+(write),
+.B x
+(execute),
+.B a
+(append only),
+.B l
+(exclusive access), and
+.B t
+(temporary, not archived).
+.SH SOURCE
+.B /appl/cmd/chmod.b
+.PP
+.SH "SEE ALSO"
+.IR chgrp (1),
+.IR ls (1),
+.IR sys-stat (2)
+.SH BUGS
+The interpretation of the modes is limited on some host operating systems,
+particularly variants of Windows.
--- /dev/null
+++ b/man/1/cleanname
@@ -1,0 +1,37 @@
+.TH CLEANNAME
+.SH NAME
+cleanname \- clean a path name
+.SH SYNOPSIS
+.B cleanname
+[
+.BI -d " dir"
+]
+.I name
+\&...
+.SH DESCRIPTION
+.I Cleanname
+tidies up each file
+.I name
+it is given and prints the result on standard output.
+It removes redundant slashes and interprets
+.L .
+and
+.L ..
+directory names lexically.
+If the
+.B -d
+option is given, each
+.I name
+that does not not start with
+.B /
+or
+.B #
+will be prefixed by
+.IB dir /
+before processing.
+.SH SOURCE
+.B /appl/cmd/cleanname.b
+.SH SEE ALSO
+.IR basename (1),
+.IR pwd (1),
+.IR names (2)
--- /dev/null
+++ b/man/1/cmp
@@ -1,0 +1,50 @@
+.TH CMP 1
+.SH NAME
+cmp \- compare two files
+.SH SYNOPSIS
+.B cmp
+[
+.B \-lsL
+]
+.I file1 file2
+[
+.I offset1
+[
+.I offset2
+]
+]
+.SH DESCRIPTION
+The two files are
+compared.
+A diagnostic results if the contents differ, otherwise
+there is no output.
+By default,
+.B cmp
+prints the byte number of the first differing byte.
+.PP
+The options are:
+.TP
+.B -l
+Print the byte number (decimal) and the
+differing bytes (hexadecimal) for each difference.
+.TP
+.B -s
+Print nothing for differing files,
+but set the exit status.
+.TP
+.B -L
+Print the line number of the first differing byte.
+.PP
+If offsets are given,
+comparison starts at the designated byte position
+of the corresponding file.
+Offsets that begin with
+.B 0x
+are hexadecimal;
+with
+.BR 0 ,
+octal; with anything else, decimal.
+.SH SOURCE
+.B /appl/cmd/cmp.b
+.SH "SEE ALSO"
+.IR diff (1)
--- /dev/null
+++ b/man/1/collab
@@ -1,0 +1,84 @@
+.TH COLLAB 1
+.SH NAME
+collab: connect \- connect to collaborative files and services
+.SH SYNOPSIS
+.B collab/connect
+[
+.BI -C " alg"
+] [
+.BI -k " keyfile"
+] [
+.B -v
+] [
+.I netaddress
+[
+.I localdir
+] ]
+.SH DESCRIPTION
+.I Connect
+dials network address
+.I netaddr
+(default:
+.BR "net!$collab!9999" ),
+which should be served by an instance of
+.IR collabsrv (8),
+and mounts the resulting connection on
+.BR /n/remote ;
+it then binds
+.BR /n/remote/collab
+on
+.I localdir
+(default:
+.BR /n/ftree/collab ).
+.PP
+The resulting hierarchy under
+.B /n/remote
+is determined by the site configuration, but usually includes the
+directory
+.BR /n/remote/services ,
+which gives access to the server side of collaborative activities, as described in
+.IR collabsrv (8),
+and the directory
+.BR /n/remote/collab ,
+which contains the file hierarchy that contains all collaborative resources offered to a client device.
+.PP
+If an instance of
+.IR wm-ftree (1)
+is running in the same name space, then
+after mounting the connection and adjusting the name space,
+.IR connect
+tells it that the name space has changed,
+so any displayed view of it can be updated.
+.PP
+.I Connect
+accepts the following options:
+.TP
+.BI -C " alg"
+Specify the algorithm,
+.IR alg ,
+to be used following authentication for digesting or encryption. See
+.IR ssl (3)
+for the supported algorithms.
+The default is
+.BR none :
+.IR ssl (3)
+is not used after authentication.
+.TP
+.BI -k " kfile "
+Specify the keyfile to be used when authenticating.
+The default is
+.BI /usr/ user /keyring/ netaddr ,
+if that exists, and otherwise
+.BI /usr/ user /keyring/default .
+See
+.IR keyring-auth (2)
+for more details.
+.TP
+.B -v
+Causes
+.I connect
+to chat about its actions on standard output.
+.SH SOURCE
+.B /appl/collab/connect.b
+.SH SEE ALSO
+.IR collabsrv (8)
--- /dev/null
+++ b/man/1/collab-clients
@@ -1,0 +1,202 @@
+.TH COLLAB-CLIENTS 1
+.SH NAME
+collab: chat, poll, poller, whiteboard \- collaborative activities
+.SH SYNOPSIS
+.B collab/clients/chat
+[
+.I servicedir
+]
+.I chatroom
+.PP
+.B collab/clients/poll
+[
+.B -d
+]
+[
+.I servicedir
+]
+.I station
+.PP
+.B collab/clients/poller
+[
+.B -d
+]
+[
+.I servicedir
+]
+.I station
+.PP
+.B collab/clients/whiteboard
+[
+.I servicedir
+]
+.I id
+.SH DESCRIPTION
+These commands are
+.IR wm (1)
+programs that are clients of the services of
+.IR collabsrv (8).
+It must therefore be running in the network for any of them
+to be usable.
+Furthermore,
+.IR collabsrv 's
+service directory must appear somewhere in the client's name space,
+for instance by using
+.IR connect (1),
+although plain
+.I mount
+(see
+.IR bind (1))
+can also be used.
+In all cases,
+the optional parameter
+.I servicedir
+names the service directory
+(default:
+.BR /n/remote/services ).
+Finally,
+.I collabsrv
+must be configured to provide the service.
+.PP
+.I Chat
+is a simple multi-user chat program.
+Each user that wishes to chat starts
+.I chat
+naming the desired
+.IR chatroom ,
+which is an identifying string agreed amongst the clients.
+(It is often convenient to use the path name of a shared file.)
+.I Chat
+attempts to enter the given
+.IR chatroom .
+It announces the results of the connection, and if successful,
+displays subsequent chat room messages.
+Its window provides a scrollable text area that forms a transcript
+of the current conversation, and a single line of editable text at the bottom
+of the window for sending messages.
+Messages sent by others appear in the transcript tagged with the sender's name.
+When the user types a new line (return, enter) in the text entry area,
+.I chat
+sends the text to all the members of the chat room,
+and it subsequently appears in the user's own transcript,
+tagged with
+.B <you>
+in place of the user's name.
+.I Chat
+also notes in the transcript the arrival and departure of other users.
+.PP
+.I Poll
+and
+.I poller
+together enable simple real-time polls.
+One user runs
+.IR poller ,
+which activates the given polling
+.IR station .
+The other users can subsequently join using
+.IR poll ,
+naming the same
+.IR station ,
+and can come and go as they please as long
+as the
+.I poller
+remains.
+The polling station closes when the
+.I poller
+leaves.
+.PP
+.I Poller
+drives the interaction for a sequence of one or more real-time polls.
+It is assumed that the poller is in the same room as those polled, allowing the
+questions and answers to be read out each time, as in quiz shows and exit polls.
+Alternatively, something like
+.I chat
+could be used to pose questions to a distant audience.
+For each poll, the polling user selects, in
+.IR poller 's
+window, the number of possible answers (2, 3, or 4) using radio buttons,
+and hits the
+.B Start
+button.
+A bar chart shows results as they come in: each bar shows the percentage of those polled
+(thus far) that have selected the corresponding alternative.
+Once the polling user hits
+.BR Stop ,
+no further results are accepted, and the bar chart represents the final result.
+The
+.B \-d
+option causes
+.I poller
+to display a debugging transcript of the messages it receives.
+.PP
+Each user being polled runs
+.IR poll ,
+and initially
+sees an array of radio buttons with labels
+.BR A ,
+.BR B ,
+.BR C
+and
+.BR D .
+They remain disabled until the
+.I poller
+hits
+.BR Start ,
+at which point
+.I poll
+enables as many radio buttons as allowed by the poller for this round.
+If the user selects a button,
+.I poll
+immediately send the selection to the polling station
+(and thus to the
+.IR poller ),
+and disables all the buttons, although the user's selection remains marked.
+All buttons are also disabled when the
+.I poller
+says to stop,
+whether or not a choice has been made.
+Buttons are enabled again at the start of the next question.
+The
+.B \-d
+option causes
+.I poll
+to display a debugging transcript.
+.PP
+.I Whiteboard
+allows several users to draw on the shared canvas with the given
+.IR id ,
+which is an identifying string agreed amongst the clients.
+The whiteboard window
+contains a canvas to be drawn on with stylus, or mouse button 1.
+Strokes drawn in a given
+.I whiteboard
+appear in all others with the
+same board
+.IR id .
+There are two controls at the bottom of the window:
+the lower left-hand corner has a small pop-up menu of brush shapes,
+including one for erasing; and a long coloured button showing the current drawing colour that
+pops up a choice of drawing colour from a palette.
+Artists can come and go as they please, but
+the drawing vanishes for ever when the last artist leaves the whiteboard.
+.SH FILES
+.TF /n/remote/services
+.TP
+.B /n/remote
+default mount point of collaborative resources
+.br
+.TP
+.B /n/remote/services
+.IR collabsrv (8)
+collaborative activity services directory
+.SH SOURCE
+.B /appl/collab/clients/chat.b
+.br
+.B /appl/collab/clients/poll.b
+.br
+.B /appl/collab/clients/poller.b
+.br
+.B /appl/collab/clients/whiteboard.b
+.SH SEE ALSO
+.IR connect (1),
+.IR collabsrv (8)
--- /dev/null
+++ b/man/1/comm
@@ -1,0 +1,46 @@
+.TH COMM 1
+.SH NAME
+comm \- select or reject lines common to two sorted files
+.SH SYNOPSIS
+.B comm
+[
+.B -123
+]
+.I file1 file2
+.SH DESCRIPTION
+.I Comm
+reads lines from
+.I file1
+and
+.IR file2 ,
+which are in lexicographical order,
+and produces a three column output: lines only in
+.IR file1 ;
+lines only in
+.IR file2 ;
+and lines in both files.
+The file name
+.L -
+means the standard input.
+.PP
+Each option digit
+.LR 1 ,
+.LR 2 ,
+or
+.LR 3
+suppresses printing of the corresponding
+column.
+.SH EXAMPLE
+.TP
+.EX
+comm -12 file1 file2
+.EE
+.IP
+Print lines common to two sorted files.
+.SH SOURCE
+.B /appl/cmd/comm.b
+.SH "SEE ALSO"
+.IR sort (1),
+.IR cmp (1),
+.IR diff (1),
+.IR uniq (1)
--- /dev/null
+++ b/man/1/cook
@@ -1,0 +1,97 @@
+.TH COOK 1
+.SH NAME
+cook \- SGML converter
+.SH SYNOPSIS
+.B cook
+[
+.B -f
+.I format
+] [
+.B -o
+.I outfile
+] [
+.I infile
+]
+.SH DESCRIPTION
+.B Cook
+reads a file in SGML format and produces an interpretation of the file in
+either LaTex or HTML format on standard output.
+.PP
+If no
+.I infile
+argument is present, the standard input is read.
+If an
+.I outfile
+argument is present, the results are written to that file instead
+of standard output.
+The
+.I format
+argument must be either
+.B html
+to produce HTML format output or one of:
+.BR latex ,
+.BR latexbook ,
+.BR latexpart ,
+.BR latexproc ,
+or
+.B latexslides
+to produce LaTex output.
+.PP
+The
+.B latexpart
+format assumes that the resulting output is to be included in
+the body of a controlling LaTex document. The other LaTex
+format options result in the generation of various LaTex
+wrapping commands.
+.PP
+.B Cook
+was designed to operate on the output of the
+.B Brutus
+editor (See
+.IR brutus (1)
+) and so its mapping of SGML tags is closely linked to those
+generated by
+.IR brutus .
+.PP
+The following tags are recognised:
+.BR Author ,
+.BR Bold. "\fIn\fR,"
+.BR Caption ,
+.BR Example ,
+.BR Exercise ,
+.BR Extension ,
+.BR Float ,
+.BR Heading ,
+.BR Index ,
+.BR Index-topic ,
+.BR Italic. "\fIn\fR,"
+.BR Label ,
+.BR Label-ref ,
+.BR List ,
+.BR List-elem ,
+.BR No-fill ,
+.BR Par ,
+.BR Roman. "\fIn\fR,"
+.BR SGML ,
+.BR Title ,
+and
+.BR Type. "\fIn\fR,"
+where
+.I n
+is a character point size and must be one of:
+.BR 6 ,
+.BR 8 ,
+.BR 10 ,
+.BR 12 " or"
+.BR 16 .
+.SH FILES
+.B /dis/wm/brutus/
+.SH SOURCE
+.B /appl/cmd/cook.b
+.SH SEE ALSO
+.IR brutus (1)
+.SH DIAGNOSTICS
+.BR "Not an SGML file" :
+The first line of the input file must contain the SGML tag
+.B <SGML>
+and nothing else.
--- /dev/null
+++ b/man/1/cp
@@ -1,0 +1,134 @@
+.TH CP 1
+.SH NAME
+cp, fcp \- copy files
+.SH SYNOPSIS
+.B cp
+[
+.B -gux
+]
+.I fromfile tofile
+.br
+.B cp
+[
+.B -gux
+]
+.I fromfile
+\&...
+.I todir
+.br
+.B cp -r
+[
+.B -gux
+]
+.I fromdir
+\&...
+.I todir
+.PP
+.B
+fcp
+[
+.BI -R " nr"
+] [
+.BI -W " nw"
+]
+.I fromfile tofile
+.br
+.B fcp
+[
+.BI -R " nr"
+] [
+.BI -W " nw"
+]
+.I fromfile
+\&...
+.I todir
+.br
+.B fcp -r
+[
+.BI -R " nr"
+] [
+.BI -W " nw"
+]
+.I fromdir
+\&...
+.I todir
+.SH DESCRIPTION
+In the first form,
+.I fromfile
+is any name and
+.I tofile
+is any name except an existing directory.
+In the second form, the commands copy one or more
+.I fromfiles
+into
+.I dir
+under their original file names, as if by a sequence of commands in the first form. For example:
+.IP
+.B "cp f1 f2 dir"
+.PP
+is equivalent to:
+.IP
+.B "cp f1 dir/f1; cp f2 dir/f2"
+.PP
+.I Cp
+copies the contents of plain (non-directory) file
+.I fromfile
+to
+.IR tofile .
+The mode and owner of
+.I tofile
+are preserved if it already exists; the permissions of
+.I fromfile
+is used otherwise.
+The
+.B -x
+option sets the full mode and modified time of
+.I file2
+from
+.IR file1 ;
+.B -g
+sets the group id; and
+.B -u
+sets the group id and user id (which is usually only possible if the file server is in an administrative mode).
+.PP
+The
+.B -r
+option directs
+.I cp
+to copy recursively the named directories
+.I "fromdir ..."
+to the target directory
+.IR todir .
+.PP
+.I Fcp
+behaves like
+.IR cp ,
+but copies many blocks in parallel.
+It works only with files that respect read and write offsets (see
+.B pread
+and
+.B pwrite
+in
+.IR sys-read (2)),
+which usually excludes files representing devices or services.
+When it applies, however, it is often
+much faster than
+.IR cp .
+The
+.B -R
+and
+.B -W
+options set the number of readers and writers (default for each: 8).
+.SH SOURCE
+.B /appl/cmd/cp.b
+.br
+.B /appl/cmd/fcp.b
+.SH "SEE ALSO"
+.IR cat (1),
+.IR mv (1),
+.IR sys-stat (2)
+.SH DIAGNOSTICS
+.I Cp
+and
+.I fcp
+refuse to copy a file onto itself.
--- /dev/null
+++ b/man/1/cprof
@@ -1,0 +1,222 @@
+.TH CPROF 1
+.SH NAME
+cprof \- coverage profiling of limbo programs
+.SH SYNOPSIS
+.B cprof
+[
+.B -nfer
+] [
+.BI -m " modname"
+] ... [
+.I "cmd arg ..."
+]
+.PP
+.B wm/cprof
+[
+.B -efr
+] [
+.BI -m " modname"
+] ... [
+.I "cmd arg ..."
+]
+.SH DESCRIPTION
+.I Cprof
+is a coverage profiling tool which shows whether lines of limbo source have been
+executed or not. It can also show the number of times a line of code has been
+executed and can accumulate results over a series of runs if so desired. The source in
+question should be compiled with the
+.B -g
+flag so that the relevant symbol table files exist.
+.PP
+The
+.B -n
+option lists the name of the file along with the line number.
+.PP
+The
+.B -f
+option shows the number of times source code is executed rather than simply
+indicating coverage.
+.PP
+The
+.B -r
+options indicates that the profiling results should be recorded. Any profiled dis file
+of the form <name>.dis will have the raw profiling results stored in a file named
+<name>.prf. If this file already existed before the run, the results will be added to
+this file. The profiling results are not shown when this option is given.
+.PP
+The
+.B -m
+option lists the module names which are to be profiled. If none are given, all the
+modules loaded by the kernel will be profiled. The name may be the actual name of
+the module or its path name.
+.PP
+The
+.B -e
+option profiles the module that is loaded first in any following command. In this case
+there is no need to give a
+.B -m
+option as this is added automatically.
+.PP
+Any remaining arguments are assumed to
+specify a command and set of arguments to the command. If this is the case,
+.B cprof
+will automatically start profiling, run the command to completion and then
+stop profiling before either recording the results or showing the profile statistics.
+.PP
+If no command is given to profile, then
+.B cprof
+will show the profile statistics from any existing recorded results in .prf files instead.
+.PP
+.B Cprof
+discriminates between different sections of code on the same line. A limbo
+for statement, for example, consisting of initialization, condition and step all on the same line
+of source code will be dealt with as three separate sections.
+.PP
+.B Cprof
+displays the profile statistics as a list of the limbo source preceded by a line
+number and an indication of whether the line was executed or not. For each section
+of code on each line, a plus sign indicates that it was executed, a minus sign that
+it was not and a question mark indicates that some of the dis instructions associated
+with the section of code were executed but some were not. Lines with no
+associated dis code do not have an indication. Of course, given the
+.B -f
+option, the number of times each section is executed is shown instead.
+.PP
+.I Wm/cprof
+is a graphical coverage profiling tool which shows which lines of limbo source have not been
+executed. It can accumulate results over a series of runs if so desired.
+.PP
+The
+.B -r
+options indicates that the profiling results should be recorded. Any profiled dis file
+of the form <name>.dis will have the raw profiling results stored in a file named
+<name>.prf. If this file already existed before the run, the results will be added to
+this file.
+.PP
+The
+.B -m
+option lists the module names which are to be profiled. If none are given, all the
+modules loaded by the kernel will be profiled. The name may be the actual name of
+the module or its path name.
+.PP
+The
+.B -e
+option profiles the module that is loaded first in any following command. In this case
+there is no need to give a
+.B -m
+option as this is added automatically.
+.PP
+The
+.B -f
+option allows a view of the execution profile rather than coverage profile. Each source
+line is preceded by the number of times it was executed and the text is coloured according
+to this: the darker the colour the more times the section of code was executed.
+.PP
+Any remaining arguments are assumed to
+specify a command and set of arguments to the command. If this is the case,
+.B wm/cprof
+will automatically start profiling, run the command to completion and then
+stop profiling before optionally recording the results and showing the profile statistics.
+.PP
+If no command is given to profile, then
+.B wm/cprof
+will show the profile statistics from any existing recorded results in .prf files instead.
+.PP
+.B Wm/cprof
+displays the profile statistics graphically. When the
+.B -f
+option is not present, code that has not been executed is shown
+in white against a red background. Code whose corresponding dis instructions have
+not been wholly executed are shown in red against a white background. Typically a
+line of code such as
+.EX
+ x = !x;
+.EE
+might show only partial execution if x has changed value from 1 to 0 but not
+vice-verse.
+.PP
+The top of the text window names the module along with any modules before and
+after it in the list. If a module has 100% coverage this is stated as well. To help find
+unexecuted code, use the find icon in the menu bar. To move to the next or go back to
+any other profiled modules, use the arrow icons in the menu bar. The last icon, the reload
+icon, pops up a menu of profiled modules to choose from.
+.PP
+.B wm/cprof
+calls
+.I cprof
+to do the actual work.
+.SH EXAMPLE
+To profile a particular command
+.IP
+.EX
+cprof /dis/math/sieve 100
+.EE
+.PP
+To profile the same command but restrict attention to its own module (Sieve).
+.IP
+.EX
+cprof -m Sieve /dis/math/sieve 100
+.EE
+.PP
+A shorter version of the above:
+.IP
+.EX
+cprof -e /dis/math/sieve 100
+.EE
+.PP
+Make 3 runs recording results as we go:
+.IP
+.EX
+cprof -e -r /dis/math/sieve 100
+cprof -e -r /dis/math/sieve 1000
+cprof -e -r /dis/math/sieve 10000
+.EE
+.PP
+Now look at the cumulative results:
+.IP
+.EX
+cprof -m /dis/math/sieve.dis
+.EE
+.PP
+To profile a particular command:
+.IP
+.EX
+wm/cprof /dis/math/sieve 100
+.EE
+.PP
+To profile the same command but restrict attention to its own module (Partitions).
+.IP
+.EX
+wm/cprof -m Sieve /dis/math/sieve 100
+.EE
+.PP
+A shorter version of the above:
+.IP
+.EX
+wm/cprof -e /dis/math/sieve 100
+.EE
+.PP
+Make 3 runs recording results as we go using cprof for simplicity:
+.IP
+.EX
+cprof -e -r /dis/math/sieve 100
+cprof -e -r /dis/math/sieve 1000
+cprof -e -r /dis/math/sieve 10000
+.EE
+.PP
+Now look at the cumulative results graphically:
+.IP
+.EX
+wm/cprof -m /dis/math/sieve.dis
+.EE
+.SH SOURCE
+.B /appl/cmd/cprof.b
+.br
+.B /appl/wm/cprof.b
+.SH SEE ALSO
+.IR mprof (1),
+.IR prof (1),
+.IR prof (2),
+.IR prof (3)
+.SH BUGS
+Neither command can profile compiled limbo programs.
--- /dev/null
+++ b/man/1/cpu
@@ -1,0 +1,64 @@
+.TH CPU 1
+.SH NAME
+cpu \- execute a remote command
+.SH SYNOPSIS
+.B cpu
+[
+.B -C
+.I alg
+]
+.RI [ net\fB!\fP ] host
+[
+.I command
+[
+.IR arg ...
+]
+]
+.SH DESCRIPTION
+.B Cpu
+dials
+.I host
+(using network
+.B tcp
+if
+.I net
+is not given), exports the local namespace and executes the given
+.I command
+on that machine. The local namespace is visible to the
+command in
+.BR /n/client ;
+local device files are bound into the remote device directory.
+If
+.I command
+is not given, then
+.B /dis/sh
+is run.
+.PP
+The
+.B -C
+option sets the algorithm
+to be used following authentication for digesting or encryption, to
+.IR alg .
+See
+.IR ssl (3)
+for the supported algorithms.
+The default is
+.BR none :
+.IR ssl (3)
+is not used after authentication.
+.SH SOURCE
+.B /appl/cmd/cpu.b
+.SH SEE ALSO
+.IR dial (2),
+.IR keyring-auth (2),
+.IR security-auth (2)
+.SH BUGS
+Although the draw device files are visible
+to the remote command, the original implementation
+of Tk meant that windowing applications could not
+receive events when
+run remotely.
+That has been fixed in this release, but
+.I cpu
+has not yet been updated to take advantage.
+A later update will do that.
--- /dev/null
+++ b/man/1/crypt
@@ -1,0 +1,98 @@
+.TH CRYPT 1
+.SH NAME
+crypt, aescbc \- data encryption
+.SH SYNOPSIS
+.B crypt
+[
+.B -d
+] [
+.BI -a " alg\fP\fR[\f5/\fP\fIalg\fP\fR]\fP"
+] [
+.BI -f " keyfile"
+] [
+.BI -k " key"
+] [
+.B -?
+]
+.PP
+.B auth/aescbc
+[
+.B -d
+] [
+.B -e
+] [
+.BI -f " keyfile"
+] [
+.BI -k " key"
+]
+.SH DESCRIPTION
+.I Crypt
+reads a data stream from its standard input and writes it encrypted to standard output,
+preceded by a header that gives details of the algorithm used.
+If the
+.B -d
+option is given,
+.I crypt
+decrypts the standard input instead, writing the clear text on standard output.
+The options are:
+.TP
+.BI -a " alg..."
+Specifies one or two algorithms, for encryption and/or digests.
+The algorithms are those supported by
+.IR ssl (3).
+If two algorithms are given, they should be separated by a slash
+.RB ( / )
+or space, following the conventions of
+.IR ssl (3).
+.TP
+.BI -f " keyfile"
+Read the encryption key from the given file, which obviously should be carefully protected.
+Trailing newlines are ignored.
+.TP
+.BI -k " key"
+Use
+.I key
+as the encryption key.
+.TP
+.B -?
+Print a list of the available encryption and digest algorithms.
+.PP
+If the secret
+.I key
+is not otherwise supplied,
+.I crypt
+prompts for it on
+.BR /dev/cons .
+There is no need to give algorithms when decrypting, because they are taken from the header.
+The default algorithm is
+.BR md5/ideacbc .
+It might be necessary to change that when using
+.I crypt
+for commercial purposes, as noted in
+.IR keyring-crypt (2).
+.PP
+.I Aescbc
+encrypts and decrypts using AES (Rijndael) in cypher
+block chaining (CBC) mode.
+It uses input and output formats compatible with Plan 9's
+.I aescbc
+command; it also
+accepts input in the format used by
+.IR keyfs (4)
+and Plan 9's
+.IR secstore .
+The
+.B -e
+option causes it to encrypt; the
+.B -d
+option to decrypt.
+The other options are just as for
+.IR crypt .
+.SH SOURCE
+.B /appl/cmd/crypt.b
+.br
+.B /appl/cmd/auth/aescbc.b
+.SH SEE ALSO
+.IR ssl (3),
+.IR keyfs (4)
+
--- /dev/null
+++ b/man/1/date
@@ -1,0 +1,55 @@
+.TH DATE 1
+.SH NAME
+date \- print the date
+.SH SYNOPSIS
+.B date
+[
+.B -u
+] [
+.B -n
+] [
+.I seconds
+]
+.SH DESCRIPTION
+Prints the date to standard output, in the format:
+.IP
+.EX
+Wed Jan 12 11:54:06 GMT 2002
+.EE
+.PP
+The options are
+.TP
+.B -u
+Report Greenwich Mean Time (GMT) rather than local time.
+.TP
+.B -n
+Report the date as the number of seconds since the
+epoch, 00:00:00 GMT, January 1, 1970.
+.PP
+Current time is obtained
+by reading
+.BR /dev/time .
+The conversion from Greenwich Mean Time to local time depends on the contents of
+.BR /locale/timezone .
+.PP
+If the optional argument
+.I seconds
+is present, it is used as the time to convert rather than
+the real time.
+.SH FILES
+.TF "/locale/timezone "
+.TP
+.B /locale/timezone
+Current time zone name and adjustments
+.TP
+.B /locale
+A directory containing time zone tables
+.TP
+.B /dev/time
+microseconds since the epoch, 00:00:00 GMT, 1 January 1970
+.SH SOURCE
+.B /appl/cmd/date.b
+.SH "SEE ALSO"
+.IR time (1),
+.IR daytime (2),
+.IR cons (3)
--- /dev/null
+++ b/man/1/dd
@@ -1,0 +1,182 @@
+.TH DD 1
+.SH NAME
+dd \- convert and copy a file
+.SH SYNOPSIS
+.B dd
+[
+.I option value
+]
+\&...
+.SH DESCRIPTION
+.I Dd\^
+copies the specified input file
+to the specified output with
+possible conversions.
+The standard input and output are used by default.
+The input and output block size may be
+specified to take advantage of raw physical I/O.
+The options are
+.TF "oseek\ \ "
+.PD
+.TP
+.BI -if\ f
+Open file
+.I f
+for input.
+.TP
+.BI -of\ f
+Open file
+.I f
+for output.
+.TP
+.BI -ibs\ n\^
+Set input block size to
+.I n\^
+bytes (default 512).
+.TP
+.BI -obs\ n\^
+Set output block size (default 512).
+.TP
+.BI -bs\ n\^
+Set both input and output block size,
+superseding
+.I ibs\^
+and
+.IR obs .
+If no conversion is specified,
+preserve the input block size instead of packing short blocks
+into the output buffer.
+This is particularly efficient since no in-core copy need be done.
+.TP
+.BI -cbs\ n\^
+Set conversion buffer size.
+.TP
+.BI -skip\ n\^
+Skip
+.I n
+input records before copying.
+.TP
+.BI -iseek\ n\^
+Seek
+.I n
+records forward on input file
+before copying.
+.TP
+.BI -files\ n\^
+Catenate
+.I n
+input files (useful only for magnetic tape or similar input device).
+.TP
+.BI -oseek\ n\^
+Seek
+.I n\^
+records from beginning of output file before copying.
+.TP
+.BI -count\ n\^
+Copy only
+.I n
+input records.
+.HP
+\fL-conv\ ascii\ \ \ \ \fRConvert
+.SM EBCDIC
+to
+.SM ASCII.
+.PD0
+.RS "\w'\fL-conv\ \fP'u"
+.TP "\w'\fLunblock\ \ \fP'u"
+.B ebcdic
+Convert
+.SM ASCII
+to
+.SM EBCDIC.
+.TP
+.B ibm
+Like
+.B ebcdic
+but with a slightly different character map.
+.TP
+.B block
+Convert variable length
+.SM ASCII
+records to fixed length.
+.TP
+.B unblock
+Convert fixed length
+.SM ASCII
+records to variable length.
+.TP
+.B lcase
+Map alphabetics to lower case.
+.TP
+.B ucase
+Map alphabetics to upper case.
+.TP
+.B swab
+Swap every pair of bytes.
+.TP
+.B noerror
+Do not stop processing on an error.
+.TP
+.B sync
+Pad every input record to
+.I ibs\^
+bytes.
+.RE
+.PD
+.PP
+.fi
+Where sizes are specified,
+a number of bytes is expected.
+A number may end with
+.L k
+or
+.LR b
+to specify multiplication by
+1024 or 512 respectively;
+a pair of numbers may be separated by
+.L x
+to indicate a product.
+Multiple conversions may be specified in the style:
+.LR "-conv ebcdic,ucase" .
+.PP
+.L Cbs\^
+is used only if
+.LR ascii\^ ,
+.LR unblock\^ ,
+.LR ebcdic\^ ,
+.LR ibm\^ ,
+or
+.L block\^
+conversion is specified.
+In the first two cases,
+.I n
+characters are copied into the conversion buffer, any specified
+character mapping is done,
+trailing blanks are trimmed and new-line is added
+before sending the line to the output.
+In the latter three cases, characters are read into the
+conversion buffer and blanks are added to make up an
+output record of size
+.IR n .
+If
+.L cbs\^
+is unspecified or zero, the
+.LR ascii\^ ,
+.LR ebcdic\^ ,
+and
+.L ibm\^
+options convert the character set without changing the block
+structure of the input file; the
+.L unblock\^
+and
+.L block\^
+options become a simple file copy.
+.SH SOURCE
+.B /appl/cmd/dd.b
+.SH DIAGNOSTICS
+.I Dd
+reports the number of full + partial input and output
+blocks handled.
+.SH "SEE ALSO"
+.IR cat (1),
+.IR cp (1)
--- /dev/null
+++ b/man/1/deb
@@ -1,0 +1,172 @@
+.TH DEB 1
+.SH NAME
+deb \- graphical Limbo debugger
+.SH SYNOPSIS
+.B wm/deb
+.RB [ -f
+.IR file ]
+.RB [ -p
+.IR pid ]
+.SH DESCRIPTION
+.B Wm/deb
+displays two windows, the main debugging window and
+a stack window for browsing the data values of the thread
+currently being debugged.
+.PP
+Debugging is performed using the facilities of the
+.B prog
+device bound to the local
+.B /prog
+directory (see
+.IR prog (3)).
+Debugging of code running on a remote machine can be performed by
+binding the remote
+.B /prog
+directory in place of the local one. (See
+.IR bind (1)).
+.PP
+In order to display source code and set breakpoints accurately, an up to date
+symbol file
+.RB ( .sbl )
+must be available as well as the limbo source file
+.RB ( .b ).
+.SS "Main window"
+The main window is comprised of a menu bar, an icon bar and three text panels.
+One panel, labelled
+.IR Threads ,
+lists the process IDs (PIDs) of the threads being debugged.
+Another panel, labelled
+.IR Break ,
+lists the set of breakpoints, each given a unique number.
+The third and largest panel displays the source code of the thread being debugged.
+.PP
+Breakpoint positions are shown by red text in the source code display.
+Clicking on a breakpoint number in the
+.I Break
+panel results in the source code panel being scrolled or updated to show
+the breakpoint.
+Breakpoints are toggled by clicking on the statement or sub-expression in the source
+code window and clicking the breakpoint
+button on the icon bar.
+A breakpoint can be hit by any of the threads being debugged -
+breakpoints are set on source code, not on individual threads.
+.PP
+Clicking on a PID in the
+.I Threads
+panel results in the source code panel being scrolled or updated to highlight
+where in the code the thread is blocked, broken or halted on a breakpoint.
+.PP
+A running thread can be halted by clicking the stop button on the icon bar.
+A thread will also halt when it hits a breakpoint.
+Once a thread is halted (not blocked or broken) its execution can be advanced
+a step at a time by means of the
+buttons on the icon bar.
+The thread can be stepped one operation at a time or a statement at a time.
+Normally when single stepping, function calls are stepped into.
+Stepping commands allow for stepping over function calls, whereby the function is still
+called but its whole execution is treated as a single step.
+Stepping out of a function is also provided, whereby execution continues unabated
+until returning from the function.
+Execution of the halted thread can be continued, running until it terminates, breaks
+or hits another breakpoint.
+.PP
+Any of the threads being debugged can be killed or detached from the debugger
+using buttons on the icon bar.
+Detaching a halted thread resumes its execution.
+.PP
+The main window provides a set of menus for viewing source files, attaching to
+other threads, setting debugger options and searching for text in the source code window.
+.SS "Stack Window"
+The stack window is used to inspect the values of local and global variables and function
+arguments.
+Items are displayed in a hierarchical manner.
+Any item that contains other items, such as a variable of an ADT type, can be expanded
+to show the values of the sub-items.
+The sub-items are displayed by clicking on the expand button on the left of the
+containing item, they can be hidden by pressing the button again.
+The sub-item list is displayed indented from its container as a visual cue to their
+association.
+.PP
+The stack window shows the full stack trace of the current thread.
+The stack trace is displayed as a list of frames, the current frame displayed
+at the top of the window.
+Each frame is given by the function name and source location of the code being
+executed in the frame.
+Each frame has the following sub-items:
+.TP 10
+.B locals
+Local variables declared in the function of the frame.
+.TP
+.B args
+The arguments passed to the frame function.
+.TP
+.B module
+The module global variables in the implementation module
+of the frame function.
+.PP
+Clicking on the name of a variable or function argument highlights the declaration of
+that name in the source panel of the main debug window.
+Clicking on the function name of a stack frame causes the main window source panel to
+display the current statement of the frame.
+.PP
+The debugger has a stack button which simply brings
+that window to the front of the display.
+.PP
+The options menu has a layout configuration which
+allows the user to have a horizontal scroll bar or to wrap long
+lines (the default); and an option to strip carriage return characters that precede newlines (for the benefit of those using Windows' editors).
+The state of the options is saved in the file
+.BI /usr/ username /lib/deb
+if that file can be created. The debugger attempts to read
+this file on startup to set the user's preferred options.
+.SH OPTIONS
+.TP 10
+.BI -f " file"
+Specifies a source file
+.RB ( .b )
+to load.
+The associated executable file
+.RB ( .dis )
+is not launched until the continue
+.RI ( "run to breakpoint" )
+button is pressed.
+This option takes precedence over the
+.B -p
+option.
+.TP
+.BI -p " pid"
+Attach to the already running thread given by
+.IR pid .
+.SH PLUMBING
+.B wm/deb
+plumbs the address of text selected using
+button 3 in the source display panel, as
+.B text
+of the form
+.IP
+.IB "file-name" : "line-number"
+.SH FILES
+.BI /prog/ n /*
+.br
+.BI /usr/ username /lib/deb
+.SH SOURCE
+.B /appl/wm/deb.b
+.br
+.B /appl/wm/debdata.b
+.br
+.B /appl/wm/debsrc.b
+.SH "SEE ALSO"
+.IR limbo (1),
+.IR prog (3)
+.SH BUGS
+Displaying large arrays in the Stack window can use excessive amounts of
+memory.
+.PP
+When setting breakpoints there is no visual cue for the selected statement or operation until
+the breakpoint is actually set.
+.PP
+It is only possible to debug modules executed by the interpreter.
+Code that has been JITed, the compilation execution method, yields
+stack information that does not correspond to information in the symbol
+.RB ( .sbl )
+file.
--- /dev/null
+++ b/man/1/diff
@@ -1,0 +1,136 @@
+.TH DIFF 1
+.SH NAME
+diff \- differential file comparator
+.SH SYNOPSIS
+.B diff
+[
+.B -efbwr
+] file1 ... file2
+.SH DESCRIPTION
+.I Diff
+tells what lines must be changed in two files to bring them
+into agreement.
+If one file
+is a directory,
+then a file in that directory with basename the same as that of
+the other file is used.
+If both files are directories, similarly named files in the
+two directories are compared by the method of
+.I diff
+for text
+files and
+.IR cmp (1)
+otherwise.
+If more than two file names are given, then each argument is compared
+to the last argument as above.
+The
+.B -r
+option causes
+.I diff
+to process similarly named subdirectories recursively.
+The normal output contains lines of these forms:
+.IP "" 5
+.I n1
+.B a
+.I n3,n4
+.br
+.I n1,n2
+.B d
+.I n3
+.br
+.I n1,n2
+.B c
+.I n3,n4
+.PP
+These lines resemble Plan 9 or Unix
+.I ed
+commands to convert
+.I file1
+into
+.IR file2 .
+The numbers after the letters pertain to
+.IR file2 .
+In fact, by exchanging `a' for `d' and reading backward
+one may ascertain equally how to convert
+.I file2
+into
+.IR file1 .
+As in
+.IR ed ,
+identical pairs where
+.I n1
+=
+.I n2
+or
+.I n3
+=
+.I n4
+are abbreviated as a single number.
+.PP
+Following each of these lines come all the lines that are
+affected in the first file flagged by `<',
+then all the lines that are affected in the second file
+flagged by `>'.
+.PP
+The
+.B -b
+option causes
+trailing blanks (spaces and tabs) to be ignored
+and other strings of blanks to compare equal.
+The
+.B -w
+option causes all white-space to be removed from input lines
+before applying the difference algorithm.
+.PP
+The
+.B -e
+option produces a script of
+.I "a, c"
+and
+.I d
+commands for the Plan 9 or Unix editor
+.IR ed ,
+which will recreate
+.I file2
+from
+.IR file1 .
+The
+.B -f
+option produces a similar script,
+not useful with
+.IR ed ,
+in the opposite order. It may, however, be
+useful as input to a stream-oriented post-processor.
+.PP
+Except in rare circumstances,
+.I diff
+finds a smallest sufficient set of file
+differences.
+.SH FILES
+.B /tmp/diff[12]
+.SH SOURCE
+.B /appl/cmd/diff.b
+.SH DIAGNOSTICS
+Exit status is the empty string
+for no differences,
+.L some
+for some,
+and
+.L error
+for trouble.
+.SH "SEE ALSO"
+.IR cmp (1)
+.SH BUGS
+Editing scripts produced under the
+.BR -e " or"
+.BR -f " option are naive about"
+creating lines consisting of a single `\fB.\fR'.
+.br
+When running
+.I diff
+on directories, the notion of what is a text
+file is open to debate.
+.br
+Nothing directly interprets the
+.I ed
+scripts within the Inferno environment.
--- /dev/null
+++ b/man/1/disdep
@@ -1,0 +1,68 @@
+.TH DISDEP 1
+.SH NAME
+disdep \- print load dependencies for Dis file
+.SH SYNOPSIS
+.B disdep
+[
+.B -a
+]
+[
+.B -d
+]
+[
+.B -o
+]
+[
+.B -p
+]
+[
+.B -s
+]
+.I file
+\&...
+.SH DESCRIPTION
+.B Disdep
+reads each
+.IR file ,
+which must be a Dis object file,
+and finds all unique strings in it that end in
+.BR .dis .
+It takes each such string as the name of a Dis file, and
+if the file exists, it does the same for it, and so on, recursively.
+It writes each unique name to the standard output.
+The result is a list of all statically-named Dis files that might be referenced by
+an application, typically as the operand of a Limbo
+.B load
+operator.
+Several options change or extend the output:
+.TP
+.B -a
+Print all names as they are encountered in the search, including duplicates.
+.TP
+.B -d
+Indent to show the dependency structure.
+.TP
+.B -o
+Show only the immediate (outermost) dependencies of each
+.IR file .
+.TP
+.B -p
+Print the dependency relation as pairs:
+a file, a space, and the name of a file on which it depends.
+Only the the first name is printed when a file depends on no other.
+This format is useful as input to
+.IR mk (10.1)
+dependency generators, or dependency graphing programs.
+.TP
+.B -s
+Include strings of the form
+.B
+\&"$[A-Z].*"
+on the assumption
+they are the names of system modules loaded by the application.
+.SH SOURCE
+.B /appl/cmd/disdep.b
+.SH "SEE ALSO"
+.IR limbo (1)
+.SH BUGS
+It cannot see file names that the program calculates.
--- /dev/null
+++ b/man/1/dmview
@@ -1,0 +1,41 @@
+.TH DMVIEW 1
+.SH NAME
+dmview, dmwm \- view remote displays
+.SH SYNOPSIS
+.B wm/dmview
+.I address
+.PP
+.B wm/dmwm
+[
+.BI -p " port"
+]
+.SH DESCRIPTION
+.I Dmwm
+is run in place of the usual Inferno window manager
+.IR wm (1),
+to allow the display's contents to be viewed elsewhere.
+.I Dmwm
+waits for incoming viewing requests on the given TCP/IP
+.I port
+(default: 9998).
+On each connection attempt,
+.I dmwm
+prompts the user to accept or reject the request for a remote view.
+.PP
+.I Dmview
+opens a connection to an instance of
+.I dmwm
+at the given network
+.I address
+and, if the remote user accepts the connection,
+opens a new window on
+.IR dmview 's
+own display that contains a replica of the remote display.
+.SH SOURCE
+.B /appl/wm/drawmux/dmview.b
+.br
+.B /appl/wm/drawmux/dmwm.b
+.br
+.B /appl/wm/drawmux/drawmux.b
+.SH SEE ALSO
+.IR drawmux (2)
--- /dev/null
+++ b/man/1/du
@@ -1,0 +1,66 @@
+.TH DU 1
+.SH NAME
+du \- disk usage
+.SH SYNOPSIS
+.RB du " [ \-anstu ]
+[
+.BI -b " blocksize"
+]
+.RI [ "file ..." ]
+.SH DESCRIPTION
+.I Du
+writes to standard output the total size of files specified as arguments.
+Directories are recursively tallied.
+A summary line is produced for each argument
+.I file
+and subdirectory.
+If no filenames are provided,
+the command operates on the current directory.
+.PP
+Output sums are rounded up to the nearest 1k unit (1024 bytes).
+By default, storage is assumed to be quantised in units of 1024 bytes.
+The
+.B -b
+option sets a different
+.I blocksize
+for quantisation,
+optionally suffixed by
+.B k
+for units of kilobytes;
+output is still in 1k units.
+.PP
+.I Du
+accepts the following options:
+.TP
+.B \-a
+Output usage information for all subordinate files,
+not just directories.
+.TP
+.B \-n
+Output just the filenames (but see the
+.B -t
+option below); implies
+.BR -a .
+.TP
+.B \-s
+Print only the summary line for each
+.IR file .
+.TP
+.B \-t
+Display the last-modified time for each file, not its size;
+when used with the
+.B \-n
+option,
+outputs the filename,
+modification time (seconds since the epoch),
+size (in bytes),
+and checksum.
+The checksum field is always 0; it is a place-holder for a value computed by another command in a pipeline.
+.TP
+.B \-u
+Display the last-accessed time for each file, not its size.
+.SH SOURCE
+.B /appl/cmd/du.b
+.SH SEE ALSO
+.IR sh (1),
+.IR sys-stat (2)
--- /dev/null
+++ b/man/1/ebook
@@ -1,0 +1,73 @@
+.TH EBOOK 1
+.SH NAME
+ebook \- Open Ebook browser
+.SH SYNOPSIS
+.B ebook/ebook
+[
+.B -m
+]
+.I file
+.SH DESCRIPTION
+.I Ebook
+provides a graphical browser for a set of files in Open eBook (OEB) version 1.0.1
+format. It takes some care to try to ensure that memory usage does
+not grow proportionally to the size of the book that is being viewed.
+.I File
+names either an OEB package file (conventional suffix
+.BR .opf )
+or an OEB document (conventional suffix
+.B .html
+or
+.BR .xml ).
+The
+.B -m
+option causes the window to be created in ``mini'' size
+as suitable for display on a 240x320 pixel device.
+.SS "GUI controls"
+Controls at the top of the window enable the user to move
+forward and backwards by pages through the document.
+A ``Guide'' menu provides access to the guide as found in
+the ebook package (if there is one). If the links in this are
+followed, or if the reader follows links embedded within
+the document, the up and down arrows enable moving
+backwards and forwards in the ``link history''.
+Arrows on the keyboard mimic the actions of the buttons
+at the top of the window.
+.PP
+Clicking in the text allows an annotation to made on the
+text; a text window is popped up and any text typed in
+it will appear in a label attached to that text.
+Annotations are stored in persistent storage and will
+last from view to view of the document.
+.SH FILES
+.TF /lib/ebook/default.css
+.TP
+.B /lib/ebook/default.css
+Initial stylesheet settings.
+.TP
+.B \fIdocument\fP.index
+Index file for the OEB
+.IR document ,
+one display size only.
+.TP
+.B \fIdocument\fP.annot
+Annotations for the OEB
+.IR document .
+.TP
+.B /lib/ebooks
+Standard place to keep ebooks.
+.SH SOURCE
+.B /appl/ebook
+.SH SEE ALSO
+.IR xml (2),
+``The Open eBook Publication Structure 1.0.1''
+.SH BUGS
+Does not do floats.
+.br
+Does not do borders & backgrounds properly.
+.br
+Large top-level constructs are not bounded in memory usage.
+.br
+Does not do links to external documents.
+.br
+Does not do fallbacks.
--- /dev/null
+++ b/man/1/echo
@@ -1,0 +1,32 @@
+.TH ECHO 1
+.SH NAME
+echo \- print arguments
+.SH SYNOPSIS
+.B echo
+.RB [ \-n ]
+.RI [ "arg ..." ]
+.PP
+.B load echo
+.br
+.B echo
+.RB [ \-n ]
+.RI [ "arg ..." ]
+.SH DESCRIPTION
+.I Echo
+writes its arguments separated by blanks
+and terminated by a newline on the standard output.
+Option
+.B \-n
+suppresses the newline.
+.PP
+A version of
+.I echo
+can optionally be loaded into the Shell
+.IR sh (1)
+if need be, to make shell scripts a little faster.
+.SH SOURCE
+.B /appl/cmd/echo.b
+.br
+.B /appl/cmd/sh/echo.b
+.SH SEE ALSO
+.IR sh (1)
--- /dev/null
+++ b/man/1/emu
@@ -1,0 +1,285 @@
+.TH EMU 1E
+.SH NAME
+emu \- Inferno emulator (hosted Inferno)
+.SH SYNOPSIS
+.B emu
+[
+.BI \-g " Xsize x Ysize"
+]
+[
+.BI \-c n
+]
+[
+.BI -d " daemon"
+]
+.RB [ \-s ]
+[
+.BI \-p " pool=maxsize"
+]
+[
+.BI \-f " font"
+]
+[
+.BI \-r " rootpath"
+]
+.RB [ \-7 ]
+[
+.RB \-C " channel"
+]
+[
+.RB \-S
+]
+[
+.B -v
+]
+[
+.I cmd
+.RI [ " arg ... " ]
+]
+.SH DESCRIPTION
+.I Emu
+provides the Inferno emulation environment,
+otherwise known as `hosted Inferno'.
+The emulator runs as an application under the
+machine's native operating system, and
+provides system services and a Dis virtual machine for Inferno applications.
+.PP
+.I Emu
+starts an Inferno initialisation program
+.BR /dis/emuinit.dis ,
+whose path name is interpreted in the
+Inferno file name space,
+not in
+the native operating system's name space.
+It in turn invokes the shell
+.BR /dis/sh.dis
+by default or the optional
+.I cmd
+and its arguments.
+If the
+.B \-d
+option is specified,
+.I emu
+instead invokes
+.BR daemon ,
+turning the
+.I emu
+instance into an Inferno service process on the network,
+running the given
+.I daemon
+service or services.
+.PP
+The emulator supports the following options:
+.TP
+.BI \-c n
+Unless specified otherwise by the module (see
+.B wm/rt
+in
+.IR wm-misc (1)),
+.I emu
+uses an interpreter to execute Dis instructions.
+Setting
+.I n
+to 1 (the default value is 0)
+makes the default behaviour
+to compile Dis
+into native instructions when a module is loaded,
+resulting in faster execution but larger run-time size.
+Setting
+.I n
+to values larger than 1 enables increasingly detailed traces of the compiler.
+.TP
+.BI \-d " daemon"
+Run
+.I emu
+as a server, invoking
+.I daemon
+instead of
+.BR /dis/emuinit.dis ,
+and disabling
+input from
+.B cons
+(see
+.IR cons (3)).
+.TP
+.BI \-g Xsize x Ysize
+Define screen width and height in pixels.
+The default values are 640x480 and the minimum values are 64x48.
+Values smaller than the minimum or greater than the
+available display size are ignored.
+.TP
+.BI \-f font
+Specify the default font for the
+.B tk
+module.
+The path is interpreted in the Inferno name space.
+If unspecified, the
+.B font
+variable has value
+.BR /fonts/lucm/unicode.9.font .
+.TP
+.BI \-r rootpath
+Specify the host system directory that
+.I emu
+will serve as its root.
+The default value is
+.B /usr/inferno
+on most systems, but
+.BR \einferno
+on Windows.
+.TP
+.B \-s
+Specify how the emulator deals with traps reported by the operating system.
+By default, they suspend execution of the offending thread within the virtual machine
+abstraction.
+The
+.B \-s
+option causes
+.I emu
+itself to trap, permitting debugging of the
+broken host operating system process that results when a trap occurs.
+(This is intended to allow debugging of
+.IR emu ,
+not Inferno applications.)
+.TP
+.BI \-p pool = maxsize
+Specify the maximum size in bytes of the named memory allocation pool.
+The pools
+are:
+.RS
+.TP \w'imagexxx'u
+.B main
+the general malloc arena
+.TP
+.B heap
+the Dis virtual machine heap
+.TP
+.B image
+image storage for the display
+.RE
+.TP
+.B \-7
+When host graphics is provided by X11, request a 7-bit colour map;
+use this option only if X11 refused to allow
+.I emu
+to configure the normal (default) 8-bit Inferno colour map.
+.TP
+.B \-C channel
+Use the given
+.I channel
+for the display, if possible.
+See
+.IR image (6)
+for the full range of channel descriptors.
+For example,
+.B k8
+gives 8 bit greyscale, and
+.B x8r8g8b8
+gives 24 bit colour on a PC.
+The set of channels supported is platform-dependent.
+.TP
+.B \-S
+Force stylus input behaviour for Tk mouse events:
+motion events are received only when a button is down
+(just as a stylus produces no events until it touches the screen).
+This option only affects the behaviour of Tk mouse events, it does not
+affect the behaviour of
+.B /dev/pointer
+as described in
+.IR cons (3).
+.TP
+.B \-v
+Print version data: edition and revision date.
+.PP
+Options may also be set in the host operating system's environment variable
+.BR EMU ;
+they are overridden by options supplied on the command line.
+.PP
+.I Emu
+finds the host system directory that will serve as its Inferno root directory
+as the last value found as follows:
+it is the value built-in to the executable, by default; or
+the value of the host system's environment variable
+.BR INFERNO ;
+or the value of the environment variable
+.BR ROOT ;
+or the value of a
+.B -r
+option in the environment variable
+.BR EMU ;
+or the
+.I rootpath
+set by a
+.B -r
+option to the
+.I emu
+command itself.
+.PP
+.I Emu
+sets several Inferno environment variables:
+.TF emuwdirxxx
+.PD
+.TP
+.B cputype
+host processor architecture:
+.B 386
+(for any x86),
+.BR arm ,
+.BR mips ,
+.B power
+(any Power or PowerPC),
+.BR sparc ,
+and
+.BR spim
+(little-endian MIPS).
+.TP
+.B emuargs
+arguments with which
+.I emu
+was invoked
+.TP
+.B emuhost
+host operating system type, such as:
+.BR FreeBSD ,
+.BR Irix ,
+.BR Linux ,
+.BR MacOSX ,
+.BR NetBSD ,
+.BR Nt
+(used for Windows generally),
+.BR OpenBSD ,
+.BR Plan9 ,
+.B Solaris
+and
+.BR Unixware .
+.TP
+.B emuroot
+name of directory in host file system that acts as Inferno's root directory
+.TP
+.B emuwdir
+name in host file system of directory where
+.I emu
+was invoked
+.PD
+.SH EXAMPLE
+To start
+.B wm/logon
+directly:
+.IP
+.EX
+EMU='-g800x600 -c1'
+emu /dis/wm/wm.dis wm/logon -u inferno
+.EE
+.SH FILES
+.TF /dis/emuinit.dis
+.TP
+.B /dis/emuinit.dis
+The default initialisation program.
+.TP
+.B /dis/sh.dis
+The default Inferno shell.
+.SH SOURCE
+.B /emu
+.SH "SEE ALSO"
+.IR limbo (1),
+.IR wm-misc (1)
--- /dev/null
+++ b/man/1/env
@@ -1,0 +1,27 @@
+.TH ENV 1
+.SH NAME
+env \- display environment variables
+.SH SYNOPSIS
+.B env
+.SH DESCRIPTION
+.I Env
+prints on standard output the current process's environment
+(see
+.IR sh (1)
+and
+.IR env (3))
+listing each variable and its current value.
+.PP
+Individual variable values can be set by assignment in
+.IR sh (1).
+.SH SOURCE
+.B /appl/cmd/env.b
+.SH SEE ALSO
+.IR acme (1),
+.IR sh (1),
+.IR env (2)
+.SH BUGS
+.I Env
+does not understand that environment variables as stored by
+.IR sh (1)
+are lists.
--- /dev/null
+++ b/man/1/fc
@@ -1,0 +1,183 @@
+.TH FC 1
+.SH NAME
+fc \- command-line floating point calculator
+.SH SYNOPSIS
+.B fc
+[
+.I base
+]
+.I expression
+.br
+.SH DESCRIPTION
+.B Fc
+calculates the result of its argument
+.I expression
+and prints the result in the format indicated by
+the optional base argument.
+.I Base
+can be one of:
+.TP
+.B -d
+Decimal, as produced by the
+.B %g
+format of
+.IR sys-print (2).
+.br
+.TP
+.B -x
+Hexadecimal, prefixed with
+.BR 0x .
+.TP
+.B -o
+Octal, prefixed with
+.BR 0 .
+.TP
+.B -b
+Binary, prefixed with
+.BR 0b .
+.TP
+.B -B
+As
+.BR -b ,
+but with extra lines to help bit-counting.
+.TP
+.BI -r\ radix
+In base
+.IR radix ,
+prefixed with
+.IB \fR``\fPradix r\fR'',\fP
+as understood by Limbo (e.g.
+.BR 16r3fff ).
+.TP
+.B -c
+As a unicode character, prefixed with
+.BR @ .
+.RE
+.PP
+.I Expression
+is in reverse polish notation:
+each command line argument is either an operand (number) or an operator.
+Operands are pushed on a stack; operators pop items from
+the stack (the number of items depends on the operator)
+and push their result. All operands are converted to double precision
+floating point numbers before being pushed.
+Integer operations convert their operands to big (64-bit) integers.
+When all arguments are exhausted, all the values currently
+on the stack are printed, first-pushed first, in the specified
+output format.
+.PP
+Operands can be given in any of the formats that
+.I fc
+can print, as detailed above.
+.PP
+When an operation is not commutative, the argument values
+will be taken from the stack first-pushed first.
+Most functions from from
+.IR math-elem (2),
+.IR math-fp(2)
+are provided.
+In addition, other provided operators include:
+.TP
+.B + - / x
+Representing the four rules. Note the use of
+.B x
+rather than
+.BR * ,
+to avoid clashes with shell metacharacters.
+.br
+.TP
+.B xx
+To the power. (equivelant to 'pow')
+.br
+.TP
+.B rad deg
+Convert value to or from radians.
+.br
+.TP
+!
+Factorial.
+.br
+.TP
+.B _
+Unary minus.
+.br
+.TP
+.B and or xor not
+Bitwise operations.
+.br
+.TP
+.B shl shr
+Bitwise shift left/right.
+.TP
+.B p
+Print the current top value on the stack.
+.br
+.TP
+.B sum
+Sum all the values currently pushed on the stack.
+.br
+.TP
+.B swap
+Swap the top two stack items.
+.br
+.TP
+.B dup
+Duplicate the top item on the stack.
+.br
+.TP
+.B rep
+Repeatedly execute the last operator until
+there is only only one item left on the stack.
+This is only valid for operators that take exactly two
+arguments.
+.RE
+.PP
+A few symbolic names for operands are recognised, including
+.B pi
+(or
+.BR π ),
+.BR e ,
+and
+.BR macheps .
+.SH EXAMPLES
+.PP
+fc 22 7 /
+.PP
+.nf
+ gives 3.1428571429
+.fi
+.PP
+fc -b 1 2 3 4 sum
+.PP
+.nf
+ gives 0b00001010
+.fi
+.PP
+fc 10 0b10 010 0x10 x rep 0xa00 swap -
+.PP
+.nf
+ gives 0
+.fi
+.PP
+fc -help
+.PP
+.nf
+ gives a usage summary, including a list of
+ the names of all the operators.
+.fi
+.ne 5
+.SH SEE ALSO
+.IR calc (1),
+.IR math-fp (2),
+.IR math-elem (2),
+.IR sh-expr (1)
+.SH DIAGNOSTICS
+An error message is displayed if
+an operator is called on a stack with
+too few elements. This also causes
+.I fc
+to yield a non-null exit status.
+.SH BUGS
+The
+.B -B
+option will only work for fixed-width fonts.
--- /dev/null
+++ b/man/1/filename
@@ -1,0 +1,61 @@
+.TH FILENAME 1
+.SH NAME
+filename \- interactively select a file
+.SH SYNOPSIS
+.B wm/filename
+[
+.B -d
+.I startdir
+]
+[
+.B -g
+.I geom
+]
+[
+.B -t
+.I title
+]
+[
+.IR pattern ...
+]
+.SH DESCRIPTION
+.B Filename
+pops up a file browser window, allows the user to select
+a file and prints the name of that file to the standard output.
+The optional list of patterns gives a list of wildcard patterns
+as understood by
+.IR filepat (2);
+the file browser will initially show only files matching one
+or more of the patterns. (N.B. patterns must be quoted to
+prevent the shell from interpreting them). The following options
+are recognised:
+.TP 10
+.B -d
+.I Startdir
+gives the initial directory shown by the file browser.
+.TP
+.B -g
+.I Geom
+is given as a tk argument to the file browser window.
+.TP
+.B -t
+.I Title
+specifies the title of the file browser window.
+.SH EXAMPLE
+The following
+.IR sh (1)
+command compiles an interactively chosen Limbo source file,
+placing the file browser window at a particular spot on the screen
+and starting at joe's home directory.
+.EX
+limbo `{wm/filename -t 'Select a source file' -g '-x 50 -y 50'
+ -d/usr/joe '*.b' '*.m'}
+.EE
+.SH SOURCE
+.B /appl/wm/filename.b
+.SH SEE ALSO
+.IR wmlib (2),
+.IR sh (1)
+.SH BUGS
+The file browser window actually appears 20 pixels below and to the right
+of the position specified.
--- /dev/null
+++ b/man/1/fmt
@@ -1,0 +1,47 @@
+.TH FMT 1
+.SH NAME
+fmt \- simple text formatter
+.SH SYNOPSIS
+.B fmt
+[
+.BI -l " n"
+] [
+.BI -i " n"
+] [
+.B -j
+]
+[
+.I file ...
+]
+.SH DESCRIPTION
+.I Fmt
+copies the given
+.I files
+(standard input by default)
+to its standard output, filling and indenting lines.
+The options are
+.TP
+.BI -l " n
+Output line length is
+.IR n ,
+including indent (default 70).
+.TP
+.BI -w " n
+A synonym for
+.BR -l .
+.TP
+.BI -i " n
+Indent
+.I n
+spaces (default 0).
+.TP
+.BI -j
+Do not join short lines: only fold long lines.
+.PP
+Empty lines and initial white space in input lines are preserved.
+Empty lines are inserted between input files.
+.PP
+.I Fmt
+is idempotent: it leaves already formatted text unchanged.
+.SH SOURCE
+.B /appl/cmd/fmt.b
--- /dev/null
+++ b/man/1/fortune
@@ -1,0 +1,23 @@
+.TH FORTUNE 1
+.SH NAME
+fortune \- sample lines from a file
+.SH SYNOPSIS
+.B fortune
+[
+.I file
+]
+.SH DESCRIPTION
+.I Fortune
+prints a one-line aphorism chosen at random.
+If a
+.I file
+is specified, the saying is taken from that file;
+otherwise it is selected from
+.BR /lib/games/fortunes .
+.SH FILES
+.B /lib/games/fortunes
+.br
+.B /lib/games/fortunes.index
+\ \ fast lookup table, maintained automatically
+.SH SOURCE
+.B /appl/cmd/fortune.b
--- /dev/null
+++ b/man/1/freq
@@ -1,0 +1,40 @@
+.TH FREQ 1
+.SH NAME
+freq \- print histogram of character frequencies
+.SH SYNOPSIS
+.B freq
+[
+.B -dxocr
+]
+[
+.I file ...
+]
+.SH DESCRIPTION
+.I Freq
+reads the given files (default standard input)
+and prints histograms of the character frequencies.
+By default,
+.I freq
+counts the value of each byte;
+under the
+.B -r
+option it instead counts
+.SM UTF
+byte sequences, that is, runes.
+.PP
+Each non-zero entry of the table is printed preceded by the byte value,
+in decimal, octal, hex, and
+Unicode
+character (if printable).
+If any options are given, the
+.BR -d ,
+.BR -x ,
+.BR -o ,
+.B -c
+flags specify a subset of value formats: decimal, hex, octal, and
+character, respectively.
+.SH SOURCE
+.B /appl/cmd/freq.b
+.SH SEE ALSO
+.IR utf (6),
+.IR wc (1)
--- /dev/null
+++ b/man/1/fs
@@ -1,0 +1,449 @@
+.TH FS 1
+.SH NAME
+fs \- file-hierarchy traversal
+.SH SYNOPSIS
+.B fs
+.I verb arg
+...
+.br
+.SH DESCRIPTION
+.B Fs
+evaluates an expression whose values represent
+the contents of a hierarchical filesystem.
+There are six types of value:
+.TP 10
+.B fs
+The complete contents of a filesystem.
+.TP
+.B entries
+Information about the entries in a filesystem without
+their content.
+.TP
+.B gate
+A condition that can be used with conditional verbs.
+A gate is open to entries satisfying particular
+criteria.
+.TP
+.B selector
+A comparator which compares two entries
+and selects one, both or neither of them.
+.TP
+.B string
+A simple string literal, represented by itself,
+or quoted according to the usual shell quoting rules.
+.TP
+.B command
+A shell command, represented by an
+.RB `` @ ''
+character followed by a braced block
+containing the shell commands.
+.TP
+.B void
+No value. An expression of this type
+cannot be used as an argument to any verb.
+.PP
+A value is represented either by a literal (a string or shell command),
+or by a braced block,
+.BI { verb
+.RI [ arg ...]\f5}\fP,
+whose value is the result of evaluating
+.I verb
+with the given arguments.
+.PP
+In the following description of the verbs provided,
+an entry such as:
+.TP 10
+.B print \fIentries\fP \fR->\fP void
+.PP
+describes a verb
+.BR print ,
+which takes one argument of type
+.IR entries ,
+and the result of which is of type
+.BR void .
+If the type is not one of those described above,
+it should be taken to be of type
+.IR string .
+.PP
+With no arguments,
+.I fs
+prints a summary of the available verbs.
+Verbs understood by
+.I fs
+include:
+.TP 10
+\f5and\fP \fIgate gate\fP [\fIgate\fP...] -> \fIgate\fP
+.B And
+is a gate that is open to an entry if all its arguments are open.
+.TP
+\f5bundle\fP \fIfs\fP -> \fIvoid\fP
+.B Bundle
+converts
+.I fs
+to an archival format and writes it to the standard output.
+.TP
+\f5compose\fP [\f5-d\fP] \fIop\fP -> \fIselector\fP
+.B Compose
+implements ``compositing''-style operators, useful when
+merging filesystems.
+.I Op
+specifies the operator, taking its name from
+the graphical Porter-Duff equivalent:
+.BR AinB ,
+.BR AinB ,
+.BR BinA ,
+.BR AoutB ,
+.BR BoutA ,
+.BR A ,
+.BR AoverB ,
+.BR AatopB ,
+.BR AxorB ,
+.BR B ,
+.BR BoverA ,
+or
+.BR BatopA.
+For instance,
+.B AinB
+gives the intersection of A and B;
+.B AatopB
+gives A whereever both A and B exist, and B otherwise.
+When used as a selector for
+.BR merge ,
+operators that exclude
+the union of A and B are not very useful, as they will
+exclude all common directories at the top level.
+Given the
+.B -d
+option, compose will allow through directories that
+would otherwise be excluded in this way, making
+operators such as
+.B AxorB
+(all that A does not hold in common with B)
+more useful, although accurate only for regular files.
+.TP
+\f5depth\fP \fIn\fP -> \fIgate\fP
+.B Depth
+is a gate open only to entries which are within
+.I n
+levels of the root of the filesystem.
+.TP
+\f5entries\fP \fIfs\fP -> \fIentries\fP
+.B Entries
+produces all the entries contained within
+.IR fs .
+.TP
+\f5eval\fP \fIexpr\fP -> \fIany\fP
+.B Eval
+evaluates an
+.I fs
+expression and yields its result.
+.TP
+\f5filter\fP [\f5-d\fP]\fIgate fs\fP -> \fIfs\fP
+The result of
+.B filter
+is a filesystem from which all entries that will
+not pass through
+.IR gate ,
+and their descendents, have been removed.
+If the
+.B -d
+flag is given, only files are filtered \- directories bypass the gate.
+.TP
+\f5ls\fP [\f5-um\fP] \fIentries\fP -> \fIvoid\fP
+Print each entry in the style of
+.B ls -l
+(see
+.IR ls (1)).
+If the
+.B -u
+flag is given, the file access time rather than the file modification time
+will be printed. If the
+.B -m
+flag is given, the name of the user that last modified the file
+is printed too.
+.TP
+\f5exec\fP [\f5-pP\fP] [\f5-t\fP \fIcommand\fP] [\f5-n\fP \fIn\fP] \fIcommand entries\fP -> \fIvoid\fP
+Run its argument
+.I command
+for each entry in
+.I entries .
+If the
+.B -n
+flag is specified,
+.B exec
+will try to gather
+.I n
+entries together before invoking the command (default 1).
+The environent variable
+.B $file
+is set to the names of the entries that have been gathered.
+If the
+.B -p
+flag is given, environment variables are set giving information
+about the mode, owner, modification time and size of the entry
+(they are named after the equivalent field
+names in the
+.B Dir
+structure; see
+.IR sys-stat (2)).
+This option is only valid when
+.I n
+is 1.
+The
+.B -P
+flag causes all the other fields in the Dir structure to be included too.
+Note that the command is run in the same shell context each time,
+so environment variable set on one execution can
+be retrieved on the next. The
+.B -t
+flag can be used to specify a command which will be executed
+just before termination.
+.TP
+\f5match\fP [\f5-ar\fP] \fIpattern\fP -> \fIgate\fP
+.B Match
+is a gate that is open if the entry's filename
+matches the
+.IR pattern .
+If the
+.B -a
+flag is given, the whole path will be used
+for the match.
+If
+.B -r
+is specified, the pattern is evaluated as a regular expression,
+otherwise it is a shell-style pattern in the style of
+.IR filepat (2).
+.TP
+\f5merge\fP [\f5-1\fP] [\f5-c\fP \fIselector\fP] \fIfs fs\fP [\fIfs\fP...] -> \fIfs\fP
+Recursively merge the contents of its argument
+filesystems.
+.I Selector
+is consulted to see which entries are chosen for the result;
+if not given, entries are resolved in favour of the first filesystem
+(equivalent to
+.BR "{compose AoverB}").
+If the
+.B -1
+flag is given, merging takes place only in the top-level directory.
+.TP
+\f5mode\fP \fIspec\fP -> \fIgate\fP
+.B Mode
+is a gate that lets through entries whose file permissions
+satisfy
+.IR spec ,
+which is a string in the style of
+.IR chmod (1).
+If the
+.I op
+field is
+.BR + ,
+the specified permissions must be present; if
+.BR - ,
+they must be absent, and if
+.BR = ,
+they must be exactly as given.
+The directory and auth modes are specified with
+the characters ``\f5d\fP'' and ``\f5A\fP''
+respectively.
+.TP
+\f5not\fP \fIgate\fP -> \fIgate\fP
+.B Not
+is a gate open to an entry if its argument is not.
+.TP
+\f5or\fP \fIgate gate\fP [\fIgate\fP...] -> \fIgate\fP
+.B Or
+is a gate open to an entry if any argument is open.
+.TP
+\f5path\fP [\f5-x\fP] \fIpath\fP... -> \fIgate\fP
+.B Path
+is a gate open to an entry whose full pathname
+is an ancestor or a descendent of any
+.IR path.
+If
+.B -x
+is specified, the gate is open to any path
+.I except
+descendents of the paths given.
+.TP
+\f5pipe\fP [\f5-1pP\fP] \fIcommand fs\fP -> \fIvoid\fP
+.B Pipe
+is similar to exec, except that the contents of all files
+in
+.I fs
+are piped through
+.IR command .
+Unless the
+.B -1
+option is given,
+.I command
+is started once for each file, with
+.B $file
+set to its name, and other environment variables
+set according to the
+.B -p
+or
+.B -P
+options, as for
+.BR exec .
+If the
+.B -1
+option is specified,
+.I command
+is started once only \- all file data is piped through that.
+.TP
+\f5print\fP \fIentries\fP -> \fIvoid\fP
+Print the path name of each entry.
+.TP
+\f5proto\fP [\f5-r\fP \fIroot\fP] \fIprotofile\fP -> \fIfs\fP
+Evaluate
+.I protofile
+as a
+.IR mkfs (8)
+.I proto
+file. If
+.I root
+is specified, it will be used as the root of the resulting
+.IR fs .
+.TP
+\f5query\fP \fIcommand\fP -> \fIgate\fP
+.B Query
+is a gate that runs
+.I command
+to determine whether it is open: an empty
+exit status from the command yields an open gate.
+The environment variable
+.B $file
+is set for the command to the path name of the entry that is being queried for.
+.TP
+\f5run\fP \fIcommand\fP -> \fIstring\fP
+.B Run
+runs
+.I command
+and substitutes the value of the environment variable
+.B $s
+after its invocation.
+.B $s
+must have exactly one element.
+.TP
+\f5select\fP \fIgate entries\fP -> \fIentries\fP
+Select only those entries within
+.I entries
+that will pass through
+.IR gate .
+Descendents of elided entries are not affected.
+.TP
+\f5setroot\fP [\f5-c\fP] \fIpath\fP \fIfs\fP -> \fIfs\fP
+.B Setroot
+sets the name of the root directory of
+.IR fs .
+If the
+.B -c
+flag is given, the elements in the root directory
+will be made explicit in the hierarchy (i.e. the
+name of the top directory will not contain any
+.B /
+characters).
+.TP
+\f5size\fP \fIentries\fP -> \fIvoid\fP
+Print the sum of the size of all entries, in bytes.
+.TP
+\f5unbundle\fP \fIfile\fP -> \fIfs\fP
+.B Unbundle
+reads an archive as produced by
+.B bundle
+from
+.IR file ;
+its result is the contents of the filesystem that was
+originally bundled.
+If
+.I file
+is
+.IB `` - '',
+the standard input is read.
+.TP
+\f5walk\fP \fIpath\fP -> \fIfs\fP
+.B Walk
+produces a filesystem that's the result of
+traversing all the files and directories underneath
+.IR path .
+.TP
+\f5write\fP \fIdir fs\fP -> \fIvoid\fP
+Write the contents of
+.I fs
+to the filesystem rooted at
+.I dir .
+If
+.I dir
+is empty,
+.I fs
+will be written to the root directory originally associated with fs.
+.PP
+As a convenience,
+.I fs
+carries out some automatic type conversions
+(conversions are applied recursively, so for instance,
+an
+.BR fs -valued
+expression at the top level will converted
+to void by applying
+.B {print {entries
+.IB fs }}\fR.
+.TP
+.BR string -> fs
+The result is \f5{walk\fP \fIstring\f5}\fP.
+.TP
+.BR fs -> entries
+The result is \f5{entries\fP \fIfs\f5}\fP.
+.TP
+.BR string -> gate
+The result is \f5{match\fP \fIstring\f5}\fP.
+.TP
+.BR entries -> void
+The result is \f5{print\fP \fIentries\f5}\fP.
+.TP
+.BR command -> string
+The result is \f5{run\fP \fIcommand\f5}\fP.
+.SH EXAMPLES
+Print the size of all files below the current directory:
+.EX
+ fs size .
+.EE
+Show the names of all files in x that aren't in y:
+.EX
+ fs select {mode -d} {merge -c {compose -d AoutB} x y}
+.EE
+Remove all files from /appl ending in
+.BR .dis :
+.EX
+ fs exec @{rm $file} {select *.dis /appl}
+.EE
+Recursively copy the current directory to
+.BR /tmp/foo .
+.EX
+ fs bundle . | fs write /tmp/foo {unbundle -}
+.EE
+A simpler method of the above:
+.EX
+ fs write /tmp/foo .
+.EE
+Interactively remove all regular files from one level of the current directory:
+.IP
+.EX
+fs exec @{rm $file} {select {query
+ @{echo -n $file:; ~ `{read} y yes}}
+ {select {mode -d} {filter {depth 1} .}}}
+.EE
+.PP
+Create a new archive containing those files from below the current directory
+that were held in an old archive:
+.EX
+ fs bundle {merge -c {compose AinB} . {unbundle old.bundle}} > new.bundle
+.EE
+.SH SOURCE
+.B /appl/cmd/fs.b
+.br
+.B /appl/cmd/fs/*.b
+.br
+.B /appl/lib/fslib.b
+.SH SEE ALSO
+.IR sh (1)
--- /dev/null
+++ b/man/1/ftest
@@ -1,0 +1,82 @@
+.TH FTEST 1
+.SH NAME
+ftest, newer \- test file attributes
+.SH SYNOPSIS
+.B ftest
+.I test
+.I arg
+.PP
+.B newer
+.I file1
+.I file2
+.SH DESCRIPTION
+.I Ftest
+checks the specified attribute of
+.I arg
+according to
+.I test
+and yields an exit status signifying the result.
+For all
+.IR test s
+apart from
+.BR -t ,
+.I arg
+is the name of the file to be tested;
+for
+.BR -t ,
+it is the number of a file descriptor.
+Available tests are:
+.TP
+.B -d
+True if the file exists and is a directory.
+.TP
+.B -e
+True if the file exists.
+.TP
+.B -f
+True if the file exists and is a regular file.
+.TP
+.B -r
+True if the file exists and is readable.
+.TP
+.B -s
+True if the file exists and has non-zero size.
+.TP
+.B -t
+True if the open file represented by
+the number
+.I arg
+represents the same file as
+.BR /dev/cons .
+.TP
+.B -w
+True if the file exists and is writable.
+.TP
+.B -x
+True if the file exists and is executable.
+.LP
+.I Newer
+checks whether
+.I file1
+exists and is no older than
+.IR file2 ,
+which must also exist;
+if so, it yields a true exit status.
+Otherwise, it yields an error status.
+Neither file may be a directory.
+.SH SOURCE
+.B /appl/cmd/ftest.b
+.br
+.B /appl/cmd/newer.b
+.SH SEE ALSO
+.IR sys-stat (2)
+.SH BUGS
+These commands
+work only with
+.IR sh (1)
+as none of the other Inferno shells
+can check the exit status of a command.
+.PP
+Checking for read, write and execute capabilities
+is speculative - the file server has the last say.
+Group permissions are ignored.
--- /dev/null
+++ b/man/1/ftree
@@ -1,0 +1,95 @@
+.TH FTREE 1
+.SH NAME
+ftree \- file tree browser
+.SH SYNOPSIS
+.B wm/ftree
+[
+.B [-e
+] [
+.B -E
+] [
+.B -p
+] [
+.B -d
+] [
+.I root
+]
+.SH DESCRIPTION
+.I Ftree
+displays the given
+.I root
+directory
+(default:
+.BR / )
+in a graphical form as a tree.
+Files and subdirectories are listed
+beneath the directory that contains them.
+Initially, the contents of a subdirectory are not displayed, but selecting the
+.B ⊕
+symbol next to its name with button 1 causes its contents to be displayed there, and
+the
+.B ⊕
+symbol changes to
+.BR ⊖ ;
+clicking that collapses the subdirectory display back to its name.
+(If the directory is empty, the circle will be empty.)
+Selecting a file or directory name with button 1 pops up a menu of
+operations:
+.BR Open ,
+.BR Copy ,
+.BR "Paste into" ,
+and
+.BR Remove .
+.B Open
+plumbs the full path name of the file or directory; it is up to the
+.IR plumber (8)
+to act appropriately based on the structure of the file name,
+as controlled by the user's
+.IR plumbing (6)
+file.
+Typically images will be displayed in a separate window, source files will be opened in an editor,
+and so on.
+Directory structure can be copied by invoking
+.B Copy
+on the source, then
+.B "Paste into"
+on the destination directory.
+The
+.B -d
+option disallows all operations except
+.BR Open .
+.PP
+Normally,
+.I ftree
+displays the usual
+.IR wm (1)
+controls, and interprets them as usual.
+The other options change that behaviour:
+.TP
+.B -e
+Ignore `exit' but offer move or resize.
+.TP
+.B -E
+Ignore exit, and do not offer move or resize.
+.TP
+.B -p
+Do exit, but do not offer move or resize.
+.PP
+The different options are used to program a user interface for handheld touch screen devices.
+For instance, a start panel can be created by invoking
+.I ftree
+with the
+.B -E
+option, ensuring that the
+.I ftree
+screen is always there, and all subsequent interaction can be controlled
+by the construction of the
+.I root
+namespace and suitable choice of plumbing rules.
+.SH SOURCE
+.B /appl/wm/ftree
+.SH SEE ALSO
+.IR filename (1),
+.IR wm (1),
+.IR plumbing (6),
+.IR plumber (8)
--- /dev/null
+++ b/man/1/gettar
@@ -1,0 +1,86 @@
+.TH GETTAR 1
+.SH NAME
+gettar, lstar, puttar \- tar archive utilities
+.SH SYNOPSIS
+.B gettar
+[
+.B -k
+] [
+.B -v
+] [
+.B -R
+]
+[
+.IR name " ..."
+]
+.br
+.B lstar
+.br
+.B puttar
+[
+.I file ...
+]
+.SH DESCRIPTION
+These commands manage POSIX.1 tar archives in Inferno.
+.PP
+.I Gettar
+reads a tar file from standard input and unpacks the contents into the current directory tree.
+By default,
+.I gettar
+converts absolute path names, including names starting with
+.LR # ,
+into names relative to the current directory; the
+.B -R
+option extracts such names as-is.
+The
+.B -k
+option tells
+.I gettar
+to keep existing files rather than overwriting them with files from the archive.
+The
+.B -v
+option causes
+.I gettar
+to print on standard error the names of files extracted.
+Finally, listing one or more
+.I names
+as arguments will extract only those files.
+.PP
+.I Lstar
+reads a tar file from standard input and lists the files contained therein,
+one per line, with four space-separated fields giving the file name, modification time (in seconds since the epoch),
+size (in bytes), and a constant 0 (the place holder for a checksum).
+The format is the same as that produced by
+.BR "du -n -t" .
+.PP
+.I Puttar
+writes a tar file to standard output that contains each
+.IR file ,
+and its substructure if it is a directory.
+Given no arguments,
+.I puttar
+instead reads a list of file names from standard input and includes
+each file or directory named; it does not copy directory substructure.
+.SH EXAMPLE
+The following commands create a tar file with two files
+.B test.b
+and
+.BR srv.b :
+.IP
+.EX
+$ cat tarlist
+test.b
+srv.b
+$ puttar <tarlist >test.tar
+$ lstar <test.tar
+test.b 867178082 1104 0
+srv.b 866042662 3865 0
+.EE
+.SH SOURCE
+.B /appl/cmd/gettar.b
+.br
+.B /appl/cmd/lstar.b
+.br
+.B /appl/cmd/puttar.b
+.SH SEE ALSO
+.IR tarfs (4)
--- /dev/null
+++ b/man/1/grep
@@ -1,0 +1,51 @@
+.TH GREP 1
+.SH NAME
+grep \- pattern matching
+.SH SYNOPSIS
+.B grep
+[
+.B -lnviLs
+]
+.I pattern
+[
+.IR file ...
+]
+.SH DESCRIPTION
+.B Grep
+prints lines from each
+.I file
+that match the
+.IR pattern ,
+a regular expression as defined in
+.IR regex (2).
+If no files are given, standard input is used.
+If more than one file is given, each line of output
+is preceded by the name of the file it was found in.
+The options are:
+.TP 10
+.B -l
+Print only the name of each file that contains a match.
+.TP
+.B -L
+Print the name of each file that does not contain a match.
+.TP
+.B -n
+Precede each line of output with its line number.
+.TP
+.B -v
+Print only lines that do not match
+.IR pattern .
+.TP
+.B -i
+Pattern matching is case insensitive (roman letters only).
+.TP
+.B -s
+Do not print anything; yield only the exit status.
+.SH SOURCE
+.B /appl/cmd/grep.b
+.SH SEE ALSO
+.IR regex (2)
+.SH DIAGNOSTICS
+.I Grep
+returns a non-nil exit status if no matches have been made,
+or if an error has occurred.
--- /dev/null
+++ b/man/1/grid-monitor
@@ -1,0 +1,86 @@
+.TH GRID-MONITOR 1
+.SH NAME
+monitor \- graphical display for viewing resource use.
+.SH SYNOPSIS
+.I command
+.B | grid/srv/monitor
+.I interface
+.B [
+.I wintitle
+.B ]
+.SH DESCRIPTION
+.I Monitor
+is designed to work with resources that deal with incoming connections (such as
+.IR grid-register (1))
+to visually display the connections to a specific resource.
+.I Interface
+sets the style of interface, this can be 1 or 2. Interface 1 is the simplest, displaying only a list of connections to the resource. Interface 2 is slightly more complex, allowing extra data to be displayed for each connection. While interface 1 shows all the connections at any one time, interface 2 displays a selection of 'slots' which have buttons that light up to signify a connection. Clicking on a lit button will display any data given about that connection in the main window.
+.I Wintitle
+optionally sets the title of the
+.I monitor
+window.
+.I Command
+must write status messages to
+.I stdout
+which are then read and displayed (if appropriate) by
+.IR monitor .
+.I Monitor
+reads on
+.I stdin
+and accepts the following input:
+.PP
+.SS Interface 1
+.TP 30
+.BI add " addr"
+display a connection from address
+.I addr
+.TP
+.BI del " addr"
+remove a connection from address
+.I addr
+.PP
+.SS Interface 2
+.TP 30
+.BI "data set" " id" " {" " data" " }"
+set and display the string
+.I data
+in slot
+.IR id .
+.TP
+.BI "data set" " id" " finished"
+clear slot
+.I id
+.PP
+.SS Common
+.TP 30
+.BI "setup maxusers" " n"
+set display to fit a maximum of
+.I n
+connections. -1 signifies unlimited connections.
+.TP
+.BI starting " pid"
+add
+.I pid
+to a list of pids whose process group is to be killed if the user closes
+.I monitor.
+.TP
+.BI error " errstr"
+print out the error string
+.I errstr
+to the console.
+.TP
+.B exit
+close down
+.I monitor
+and kill all processes in the current group.
+.PP
+.PP
+Input messages of any other form will simply be ignored.
+.SH SOURCE
+.B /appl/grid/srv/monitor.b
+.br
+
+.SH "SEE ALSO"
+.IR grid-register (1),
+.IR ns (1),
+.IR cpu (4)
--- /dev/null
+++ b/man/1/grid-ns
@@ -1,0 +1,67 @@
+.TH GRID-NS 1
+.SH NAME
+grid: ns \- exports a selected namespace and serves it on
+standard input
+.SH SYNOPSIS
+.BI "grid/srv/ns [ -r " "relpath " "]" " path1 path2...path n"
+.br
+.BI "grid/runns [ -r " "relpath " "]" " path1 path2...path n"
+.SH DESCRIPTION
+.I Ns
+exports a selected subsection of the local namespace and serves it on
+.I stdin.
+The path arguments specify which directories are to be exported. If subdirectories are exported without their parents,
+.I ns
+attempts to maintain the namespace structure by creating the parents but populating them only with the selected subdirectories. For example, exporting
+.B /appl/lib
+would mean that the exported
+.B /appl
+directory contained nothing apart from the
+.B lib
+subdirectory. If
+.I relpath
+is specified, all paths will be viewed relative to this path. For instance, if
+.I relpath
+is
+.BR /usr/inferno ,
+then
+.B /usr/inferno/bin/dis
+would be listed as
+.B /bin/dis
+and
+.B /tmp
+would not be listed at all.
+.PP
+.IR Grid-register (1)
+may be used in conjunction with
+.I ns
+to register it with a
+.IR registry (4)
+and to export and serve its namespace across
+.IR dial (2)
+network connections. Incoming connections may also be displayed visually using
+.IR grid-monitor (1).
+For example:
+.PP
+.BI "grid/register [" " options ..." " ] { grid/srv/ns " "paths..." " } | grid/srv/monitor 1 'NS resource'
+.PP
+This set of commands is encapsulated within the shell script
+.I runns
+which will automatically register
+.I ns
+with a
+.IR registry (4)
+if possible and start up the graphical display to show connections to the resource. There is no need for the user to execute
+.I ns
+outside of
+.I runns
+unless the namespace it provides is required to be accessible in a different way to that provided by
+.IR grid-register (1).
+.SH SOURCE
+.B /appl/grid/srv/ns.b
+
+.SH "SEE ALSO"
+.IR grid-cpu (4),
+.IR grid-monitor (1),
+.IR grid-register (1),
+.IR grid-session (1)
--- /dev/null
+++ b/man/1/grid-query
@@ -1,0 +1,44 @@
+.TH GRID-QUERY 1
+.SH NAME
+grid: query \- graphical interface to view resources registered with a known
+.IR registry (4)
+.SH SYNOPSIS
+.B grid/query
+.SH DESCRIPTION
+.I Query
+displays the resources currently registered with a given
+.IR registry (4)
+and allows the user to mount and browse through the namespaces they provide.
+.PP
+Resource categories are displayed in the main window, opening any of these (by clicking on the '+' next to the name) will reveal the names of the individual resources within that category. Each resource has a set of attributes which may be viewed at the lowest level of the displayed tree. Clicking on a specific resource and clicking the
+.B Mount
+button that appears will mount that resource (if possible) and display the imported namespace in a new window. From this window, the user can then browse this namespace as well as opening and running files. A shell window may also be opened to allow more complicated tasks to be performed.
+.PP
+Clicking
+.B Search
+brings up a search window. Here, the current
+.IR registry (4)
+may be searched for a resource containing the specified attribute names and values.
+.B Refresh
+updates the list of resources in the main window in case any have been added or removed.
+.PP
+
+.SH SOURCE
+.B /appl/grid/query.b
+.br
+.B /appl/grid/lib/browse.b
+.br
+.B /appl/grid/lib/srvbrowse.b
+
+.SH BUGS
+Currently, searching for a resource on a
+.IR registry (4)
+is only implemented in a very simple way. Given the attribute
+.I (name, value)
+pairs, the search will return all resources whose attributes exactly match the specified values.
+.B *
+may be used to match any attribute value but not name.
+.SH "SEE ALSO"
+.IR grid-localreg (1),
+.IR registries (2),
+.IR registry (4)
--- /dev/null
+++ b/man/1/grid-register
@@ -1,0 +1,60 @@
+.TH GRID-REGISTER 1
+.SH NAME
+grid: register \- registers a resource with a known
+.IR registry (4)
+.SH SYNOPSIS
+.B grid/register [
+.I option ...
+.B ] {
+.I command ...
+.B }
+
+.SH DESCRIPTION
+.I Register
+takes a program that serves a namespace using the 9P protocol on its standard input
+and registers it with a known
+.IR registery (4).
+(See
+.IR intro (5)
+for a description of the protocol.)
+It then marshals the service by listening for incoming connections and exporting the namespace across them.
+.I Register
+prints out various status messages to
+.I stdout
+in the form which may be read by
+.IR grid-monitor (1).
+.SH OPTIONS
+.TP 17
+.BI -u " maxusers"
+Specifies the maximum number of connections to the resource at any one time. If not given, any number of connections are allowed.
+.TP
+.BI -e " n"
+Tells
+.I register
+to exit after the last connection has gone away.
+.I N
+is a threshold value, so that
+.I register
+will not exit upon the last connection going away until the number of incoming connections has reached at least
+.I n.
+.TP
+.BI -a " 'name=value'"
+Specifies the name and value of an attribute to be listed as belonging to the resource when registered with the
+.IR registry (4).
+.TP
+.BI -A " address"
+Allows the user to specify the address for the service to announce on.
+.I Address
+takes the form
+.BI tcp! machine ! port
+.TP
+.B -m
+Includes the amount of free main memory as part of the attributes list.
+
+.SH SOURCE
+.B /appl/grid/register.b
+
+.SH "SEE ALSO"
+.IR registries (2),
+.IR registry (4),
+.IR grid-localreg (1)
--- /dev/null
+++ b/man/1/grid-session
@@ -1,0 +1,112 @@
+.TH GRID-SESSION 1
+.SH NAME
+grid: session \- graphical interface for configuring tasks using
+.IR grid-cpu (4)
+and
+.IR grid-ns (1)
+resources
+.SH SYNOPSIS
+.B grid/session
+.SH DESCRIPTION
+.I Session
+allows the user to build up a single namespace from various different namespace resources and configure a set of commands to be executed within this namespace. The execution then takes place on one or more selected
+.IR grid-cpu (4)
+resources.
+.PP
+Once started,
+.IR session
+presents a heirarchical view of currently registered resources (such as
+.IR grid-ns (1))
+that serve name spaces using 9P.
+(See
+.IR intro (5)
+for a description of the protocol.)
+The top level displays the type of resource, for instance
+.BR 'CPU resource' ,
+whilst the second level shows the name of each individual resource. Descending futher down the tree will reveal the attributes of the selected resource. To mount a resource and see the namespace it exports, click mouse button 3 on the resource name. The view will switch to a split pane view displaying the resource namespace with directories listed on the left and all files in the current directory displayed on the right.
+.PP
+Clicking mouse button 3 on a file or directory will cause it to be added to the
+.I command
+or
+.I namespace
+list at the bottom of the window. Mouse button 3 is again used on items in either of these lists to display a menu containing the name of the resource on which they are located as well as the option to remove them. The
+.B Cmd
+and
+.B Ns
+buttons located at the top of the window toggle the view between the selected commands and the selected namespace. The
+.B Resources
+button returns to the initial view containing the currently registered resources and
+.B Refresh
+updates the list in case any resources have been added or removed.
+
+.SS The Command List
+This contains a list of all commands to be executed. Any arguments may be entered by clicking on the gap after
+.IR args :
+and typing into the box. Commands will be executed in order from top (first) to bottom (last).
+
+.SS The Namespace List
+This contains a list of all the directories to be imported in order to create the local namespace of the selected
+.IR grid-cpu (4)
+resource(s). By default, several directories will be imported from the local machine. To select these, click button 3 on
+.B import local namespace
+and (un)check the directories as required. To toggle this option on and off, click button 1 on
+.B import local namespace.
+These default directories are required by many commands for normal execution so it is recommended that they are not disabled unless they are definitely not needed. Importing a directory of the same name as one of the default directories will automatically overwrite the default. Therefore, it is not necessary to disable a default directory if the same name is to be imported from elsewhere.
+.PP
+A given directory can only be imported once so it is not possible, for example, to import
+.B /usr/inferno
+from two different machines.
+.I Session
+will automatically import the directories containing each of the selected commands but any others required must be explicitly imported. For example: If one of the commands is:
+.PP
+.EX
+ /usr/inferno/runme.dis -f /appl/lib
+.EE
+.PP
+.I Session
+will import
+.B /usr/inferno/
+but
+.B /appl/lib
+would have to be specified in the namespace list.
+.SS Execution
+Once the command and namespace lists have been configured, click
+.B Ok
+on the
+.I Session
+window. This will bring up the
+.IR grid-query (1)
+window containing a list of the available
+.IR grid-cpu (4)
+resources. To select one or more of these for execution, click on the name with button 3 and it will be added to the list. If a specific
+.IR grid-cpu (4)
+resource is not required, click button 3 on
+.B CPU resource
+and select the number you require by clicking on the number following the list entry and dragging the mouse up or down.
+.PP
+Once the required
+.IR grid-cpu (4)
+resources have been selected, click
+.B Ok
+and execution will commence.
+
+
+.SH SOURCE
+.B /appl/grid/session.b
+.br
+.B /appl/grid/ns.b
+.br
+.B /appl/grid/monitor.b
+.br
+.B /appl/grid/query.b
+.br
+.B /appl/grid/lib/browse.b
+.br
+.B /appl/grid/lib/srvbrowse.b
+
+.SH "SEE ALSO"
+.IR grid-query (1),
+.IR registries (2)
+.IR grid-ns (1),
+.IR grid-cpu (4),
+.IR registry (4)
--- /dev/null
+++ b/man/1/gzip
@@ -1,0 +1,69 @@
+.TH GZIP 1
+.SH NAME
+gzip, gunzip \- compression and decompression utilities
+.SH SYNOPSIS
+.B gzip
+[
+.B \-v
+] [
+.BI \- level
+] [
+.IR file ...
+]
+.br
+.B gunzip
+[
+.IR file ...
+]
+.SH DESCRIPTION
+.B Gzip
+and
+.B gunzip
+perform data compression and decompression
+compatible with the Unix
+.I gzip
+file format,
+which uses a hybrid Lempel-Ziv 1977 and Huffman compression algorithm
+called `deflate'.
+If no arguments are given
+.B gzip
+compresses each
+.I file
+replacing it by a file of the same
+name with the a
+.B .gz
+suffix appended.
+If no files are given, standard input
+and standard output are used.
+.I Level
+is a single decimal digit between 1 and 9;
+higher numbers give better compression.
+The default
+.I level
+is 6.
+The
+.B \-v
+option causes
+.B gzip
+to report the compression ratio of each file that
+it compresses.
+.PP
+.B Gunzip
+performs the opposite operation to
+.BR gzip ;
+each
+.I file
+(which must have a
+.B .gz
+suffix) is uncompressed, and replaced
+by a file of the same name with the
+.B .gz
+suffix removed. If no files are given,
+standard input and standard output are used.
+.SH SOURCE
+.B /appl/cmd/gzip.b
+.br
+.B /appl/cmd/gunzip.b
+.SH SEE ALSO
+.IR filter (2),
+.IR filter-deflate (2)
--- /dev/null
+++ b/man/1/idea
@@ -1,0 +1,65 @@
+.TH IDEA 1
+.SH NAME
+idea \- encrypt/decrypt a file with the IDEA cipher
+.SH SYNOPSIS
+.B idea
+[
+.B -e
+]
+[
+.B -d
+]
+.I key
+[
+.I datafile
+]
+.SH DESCRIPTION
+.I Idea
+encrypts or decrypts data using the IDEA (International Data Encryption Algorithm) cipher
+first proposed by Xuejia Lai and James Massey in 1990.
+.PP
+The
+.B -e
+option encrypts the data
+and the
+.B -d
+option decrypts the data. Exactly one of these must be specified on the command line.
+.PP
+The
+.I key
+is any 16 character string which is used as the key for both encryption and decryption.
+.PP
+The data to be encrypted/decrypted is either in
+.I datafile
+or is read from standard input. If no input file is given, the output from
+.I idea
+is always sent to standard output. For encryption, if an input file is specified the output
+is sent to a file with the name
+.I datafile.id.
+For decryption, if an input file is specified it
+should have a .id extension and the output is sent to a file whose name is that of
+.I datafile
+without the .id extension.
+.SH EXAMPLES
+.PP
+Encrypt the data in the file A10076795.gz:
+.IP
+.EX
+idea -e 'abcd2345 $+*LMNO' A10076795.gz
+.EE
+.PP
+The encrypted data is put in the file A10076795.gz.id. Once this file is transmitted,
+the receiver can then decrypt it, as long as he has the key, with:
+.IP
+.EX
+idea -d 'abcd2345 $+*LMNO' A10076795.gz.id
+.EE
+.PP
+The decryped data is put in the file A10076795.gz.
+.PP
+Note that the quotes around the key are interpreted by the shell and simply delimit
+the key string.
+.SH SOURCE
+.B /appl/cmd/idea.b
+.br
+.B /utils/idea/idea.c
--- /dev/null
+++ b/man/1/itest
@@ -1,0 +1,124 @@
+.TH ITEST 1
+.SH NAME
+itest, itreplay \- run tests and replay results
+.SH SYNOPSIS
+.B itest
+[
+.I -eo
+]
+[
+.I -c cflag
+]
+[
+.I -r count
+]
+[
+.I -v vlevel
+]
+[
+.I -C configfile
+]
+[
+.I -R recordroot
+]
+[
+.I testdir ...
+]
+.PP
+.B itreplay
+[
+.I -eo
+]
+[
+.I -v verbosity
+]
+[
+.I recorddir ...
+]
+.SH DESCRIPTION
+.I Itest
+runs a sequence of tests, optionally recording all the results in
+a directory tree. The
+.IR itreplay
+command replays the results of one or more recorded tests.
+Some options are common to both commands:
+.TP
+.B -e
+Display the standard error produced by the tests.
+.TP
+.B -o
+Display the standard output produced by the tests.
+.TP
+.BI -v " vlevel"
+Set the verbosity level to
+.I vlevel
+(0-9). The higher the value, the more detail is displayed; the default level is 3.
+.PP
+The tests run by
+.IR itest
+are specified as one or more directories either on the command line or in a configuration file. Options:
+.TP
+.BI -c " cflag"
+Set the value in /dev/jit (usually 0 or 1; 0 for interpreted mode, 1 for compiled mode) to
+.I cflag
+.TP
+.BI -r " count"
+Run the set of tests
+.I count
+times; a value of 0 means repeat indefinitely.
+.TP
+.BI -v " vlevel"
+Set the verbosity level to
+.I vlevel
+(0-9). The higher the value, the more detail is displayed; the default level is 3.
+.TP
+.BI -C " cfile"
+Use the configuration file
+.I cfile.
+The file should contain a list of test directories, one per line.
+.TP
+.BI -R " recroot"
+Store the test results in a tree rooted at
+.I recroot.
+Record directories are named as integers starting at 1. Each test run creates a new
+directory numbered one greater than the highest existing directory.
+.PP
+The test results to be replayed by
+.IR itreplay
+are specified on the command line as one or more record directories.
+.SS TEST FORMAT
+A test directory must contain either a t.dis file or a t.sh file, depending
+on whether the test is written as a Limbo program or as a
+.IR sh (1)
+script. Limbo programs should use
+.IR itslib (2);
+sh scripts should use
+.IR sh-test (2).
+A test directory should also contain a README file (which is displayed by
+.I itest
+if the verbosity level is greater than 8), and any other files required
+for the test.
+.PP
+Tests are run with their working directory set to their own test directory.
+.SS RECORD DIRECTORY FORMAT
+Each record directory contains a number of files:
+.TP
+.BI msgs
+All the messages generated by the test.
+.TP
+.BI stderr
+Standard error from the test.
+.TP
+.BI stdout
+Standard output from the test.
+.TP
+.BI summary
+a one-line file containing the start time in seconds, elapsed time in ms, cflag
+and the name of the test directory.
+.SH SOURCE
+.B /appl/cmd/itest.b
+.br
+.B /appl/cmd/itreplay.b
+.SH SEE ALSO
+.IR itslib (2),
+.IR sh-test (2)
--- /dev/null
+++ b/man/1/keyboard
@@ -1,0 +1,57 @@
+.TH KEYBOARD 1
+.SH NAME
+keyboard, pen \- character input for touch screen devices
+.SH SYNOPSIS
+.B wm/keyboard
+[
+.B -e
+] [
+.B -t
+]
+.br
+.PP
+.B wm/pen
+[
+.B -e
+] [
+.B -r
+] [
+.B -t
+]
+.SH DESCRIPTION
+.B Wm/keyboard
+provides a soft keyboard for touch-screen devices.
+Characters selected on the on-screen keyboard using a stylus (or mouse button 1) are passed to Tk via
+.B Tk->keyboard
+in
+.IR tk (2).
+The
+.B -t
+option causes it to put itself on the
+.IR wm (1)
+task bar from the start.
+The
+.B -e
+option causes it to treat the `exit' button on the title bar as
+a request to put itself back on the task bar.
+.PP
+.B Wm/pen
+provides character input using single-stroke gestures with the stylus
+(or mouse button 1).
+The
+.B -r
+option allows the pen window to be reshaped.
+Options are otherwise the same as for
+.BR wm/keyboard .
+.SH FILES
+.TF "/lib/strokes/*.clx"
+.TP
+.B /lib/strokes/*.cl
+Raw sample data for different stroke sets (eg, letters, digits)
+.TP
+.B /lib/strokes/*.clx
+Compact canonical versions of the stroke sets
+.SH SOURCE
+.B /appl/wm/keyboard.b
+.br
+.B /appl/wm/pen.b
--- /dev/null
+++ b/man/1/kill
@@ -1,0 +1,72 @@
+.TH KILL 1
+.SH NAME
+kill, broke \- terminate process(es)
+.SH SYNOPSIS
+.B kill
+[
+.B -g
+]
+[
+.I pid ...
+]
+[
+.I module ...
+]
+.PP
+.B broke
+[
+.I user
+]
+.SH DESCRIPTION
+.I Kill
+terminates each process (for a numeric
+process ID
+.IR pid )
+or
+process running a given
+.I module
+(for a non-numeric module name),
+by writing a
+.L kill
+message to the corresponding process's control file
+in
+.IR prog (3).
+The
+.B -g
+option causes
+.I kill
+to write a
+.L killgrp
+message instead, killing all processes in the given process's process group
+(see
+.IR sys-pctl (2)).
+Processes running a
+.I module
+are identified by their
+.L status
+file, and the process ID of each such process is printed on standard output.
+.PP
+A process that incurs an exception (eg, array bounds check)
+is normally suspended in the `broken' state to allow debugging.
+.I Broke
+finds all such processes owned by
+.I user
+(default: the current user), and
+prints
+.I sh (1)
+commands to kill them.
+The commands can be piped to the shell or selectively run,
+releasing back to the system any resources owned by those processes.
+.SH FILES
+.TF "/prog/pid/status "
+.TP
+.BI /prog/ pid /ctl
+.TP
+.BI /prog/ pid /status
+.SH SOURCE
+.B /appl/cmd/kill.b
+.br
+.B /dis/broke
+.SH "SEE ALSO"
+.IR ps (1),
+.IR prog (3)
--- /dev/null
+++ b/man/1/limbo
@@ -1,0 +1,218 @@
+.TH LIMBO 1E
+.SH NAME
+limbo \- Limbo compiler
+.SH SYNOPSIS
+.EX
+limbo [ \f2option ...\fP ] [ \f2file ...\fP ]
+.EE
+.SH DESCRIPTION
+.B Limbo
+compiles the named Limbo
+.I files
+into machine-independent object files for the Dis virtual machine.
+Depending on the options, the compiler may create output
+files or write information to its standard output.
+Conventional files and their extensions include the following.
+.TP 10
+.IB file .b
+Limbo source file.
+.TP
+.IB file .dis
+Object code for the Dis virtual machine.
+.TP
+.IB file .m
+Limbo source file for
+.B module
+declarations.
+.TP
+.IB file .s
+Assembly code.
+.TP
+.IB file .sbl
+Symbolic debugging information.
+.PP
+With no options,
+.B limbo
+produces a
+.B \&.dis
+file for each
+source file.
+.PP
+The compiler options are:
+.TP 1i
+.B -a
+Print on standard output
+type definitions and call frames
+useful for writing C language implementations of Limbo modules.
+Suppresses normal output file generation.
+.TP
+.B -C
+Mark the Dis object file to prevent run-time compilation.
+.TP
+.B -c
+Mark the Dis object file to guarantee run-time compilation.
+.TP
+.BI -D " flags"
+Turn on debugging
+.IR flags .
+Flags include
+.B A
+for arrays,
+.B a
+for
+.B alt
+statements,
+.B b
+for booleans,
+.B C
+for
+.B case
+body statements,
+.B c
+for
+.B case
+statements,
+.B D
+for use descriptors,
+.B d
+for declarations,
+.B e
+for expressions,
+.B E
+for extended expressions,
+.B F
+for function information,
+.B f
+for constant folding,
+.B m
+for modules,
+.B n
+for
+.B nil
+references,
+.B P
+for program counter manipulations,
+.B r
+for reference types,
+.B S
+for type signatures,
+.B s
+for a code generation summary,
+.B T
+for tuples,
+.B t
+for type checking,
+and
+.B v
+for variable initialization.
+.TP
+.B -e
+Increase the number of errors the compiler will report before exiting.
+.TP
+.B -G
+Annotate assembly language output with debugging information.
+A no-op unless
+.B -S
+is set.
+.TP
+.B -g
+Generate debugging information for the input files and place it in a file
+named by stripping any trailing
+.B \&.b
+from the input file name and appending
+.BR .sbl .
+.TP
+.B -i
+Disable inlining of functions. Currently functions containing a
+single return statement or two return statements and an if clause are candidates for inlining.
+.TP
+.BI \-I " dir"
+An
+.B include
+file whose name does not begin with slash
+is sought first relative to the working directory,
+regardless of the source
+.I file
+argument.
+If this fails,
+.B limbo
+sequences through directories named in
+.B \-I
+options,
+then searches in
+.BR /module .
+An
+.B include
+file contains Limbo source code, normally holding one or more
+.B module
+declarations.
+.TP
+.BI \-o " obj"
+Place output in file
+.I obj
+(allowed only if there is a single input
+.IR file ).
+The output file will hold either object or assembly code,
+depending on
+.BR \-S .
+Default is to take the last element of the input file name,
+strip any trailing
+.BR .b ,
+and append
+.B .dis
+for object code and
+.B .s
+for assembly code.
+Thus, the default output file for
+.B dir/mod.b
+would be
+.BR mod.dis .
+.TP
+.B \-S
+Create assembly language output instead of object code.
+.TP
+\f5\-T\fP\ \f2module
+Print on standard output C stub functions,
+useful for implementing Limbo modules in the C language for linkage
+with the interpreter.
+.TP
+\f5\-t\fP\ \f2module
+Print on standard output
+a table of runtime functions,
+to link C language implementations of modules with the Limbo interpreter.
+Suppresses normal output file generation.
+.TP
+.B \-w
+Print warning messages about unused variables, etc.
+More \f5w\fP's (e.g., \f5\-ww\fP) increase the pedantry of the checking.
+.PP
+.SH FILES
+.TF /module
+.TP
+.B /module
+directory for Limbo
+.B include
+modules
+.SH SOURCE
+.TF /appl/limbo
+.TP
+.B /appl/limbo
+compiler source in Limbo
+.TP
+.B /limbo
+compiler source in C for host
+.SH "SEE ALSO"
+.IR asm (1),
+.IR emu (1),
+.IR mk (10.1),
+.IR intro (2),
+.IR sys-intro (2),
+.IR tk (2)
+.PP
+``The Limbo Programming Language''
+.br
+``Program Development in Inferno''
+.br
+``A Descent into Limbo''
+.br
+in Volume 2.
--- /dev/null
+++ b/man/1/listen
@@ -1,0 +1,237 @@
+.TH LISTEN 1
+.SH NAME
+listen, styxlisten, dial \- network connections
+.SH SYNOPSIS
+.B listen
+[
+.B -Ats
+] [
+.B -a
+.I alg
+]... [
+.B -k
+.I keyfile
+] [
+.B -i
+.BI { initscript }
+]
+.I addr
+.I command
+[
+.IR arg ...
+]
+.br
+.B styxlisten
+[
+.B -Ats
+] [
+.B -a
+.I alg
+]... [
+.B -k
+.I keyfile
+]
+.I addr
+.I command
+[
+.IR arg ...
+]
+.br
+.B dial
+[
+.B -A
+] [
+.B -a
+.I alg
+] [
+.B -k
+.I keyfile
+]
+.I addr
+.I command
+[
+.IR arg ...
+]
+.SH DESCRIPTION
+.I Listen
+waits for an incoming network connection on
+.IR addr ,
+(as accepted by
+.B announce
+in
+.IR dial (2))
+and then invokes
+.IR sh (1)
+to run the associated
+.IR command .
+If the
+.B -A
+option is specified, no authentication or encryption will
+take place on the connection; otherwise
+.I listen
+will attempt to authenticate the party at the other
+end of the connection, allowing any given
+.I alg
+to be used to encrypt and/or digest the
+connection's data. If neither
+.B -A
+or any
+.B -a
+option is given, then
+.I listen
+will allow any algorithm allowed by the local
+.IR ssl (3)
+device.
+If
+.I keyfile
+is specified, then that will be used as the server's certificate;
+otherwise
+.BI /usr/ user /keyring/default
+will be used.
+.PP
+If an
+.I initscript
+is provided, it is executed by each listener
+after announcing its network connection,
+with the shell variable
+.B net
+set to the name of the corresponding network directory
+(see
+.IR dial (2)),
+before listening for incoming calls.
+This can be used to change, or find out the characteristics
+of an announced port (for instance to find out
+the actual port number that has been announced).
+.PP
+By default,
+.I listen
+backgrounds itself (after checking that the port
+announcement proceeded ok); giving it the
+.B -s
+option causes it to run synchronously.
+.PP
+.I Listen
+currently makes available the whole of its current name space visible to the command,
+which might be undesirable, and perhaps should be optional, with a new name space
+constructed for an incoming call.
+The
+.B -t
+option declares the command to be `trusted' giving it access to
+elements of the current name space such as
+.B /mnt/keys
+on an authentication server.
+By default it has not got that access.
+.PP
+.I Styxlisten
+is similar to
+.IR listen ,
+except that it multiplexes a single
+.I styx
+(see
+.IR intro (5))
+server between multiple clients.
+.I Styxlisten
+starts its
+.I cmd
+only once; it assumes it will serve styx messages
+through file descriptor 0 when started. For each client that attaches to
+.IR address ,
+the command will see a new
+.IR attach (5)
+message indicating the new connection.
+Unless the
+.B -A
+option has been given, the
+.B uname
+field in the attach message will be the name of the
+authenticated user.
+When the command exits, the process listening
+on
+.I address
+is stopped.
+.PP
+.I Dial
+is the complement of
+.IR listen .
+It tries to make a connection to
+.IR addr .
+If the
+.B -A
+option is given, no authentication or encryption will
+take place; otherwise Inferno authentication and encryption
+will be performed as usual, using
+.I alg
+if given, or a default algorithm otherwise.
+.I Keyfile
+is used for the certificate if given, otherwise
+.BI /usr/ user /keyring/ addr\fR,\fP
+if it exists, and failing that,
+.BI /usr/ user /keyring/default\fR.\fP
+.I Alg
+is used for the encryption/digest algorithm
+on the connection.
+When the connection is made,
+.I command
+is run in the context of that connection, as described below.
+.PP
+For both
+.I dial
+and
+.IR listen ,
+when the command is run,
+.B $user
+is set to the name of the authenticated user at the other
+end of the connection (if authentication
+is being used), and
+.B $net
+is set to the
+.B /net
+directory corresponding to the connection.
+The standard input and output of the command
+is redirected to the network connection (standard
+error is unaffected).
+.SH EXAMPLES
+Run a custom login daemon and an echo server that
+logs incoming connections:
+.IP
+.EX
+listen 'tcp!*!echo' {
+ echo connection from `{cat $net/remote} >[1=2]
+ echo user is $user >[1=2]
+ cat &
+}
+.EE
+.PP
+Dial up the above echo server:
+.IP
+.EX
+dial tcp!somehost!echo {
+ echo made connection >[1=2]; echo hello; cat >[1=2]
+}
+.EE
+.PP
+Make the current name-space available to all:
+.IP
+.EX
+styxlisten 'tcp!*!styx' export /
+.EE
+.SH SOURCE
+.B /appl/cmd/dial.b
+.br
+.B /appl/cmd/listen.b
+.SH BUGS
+The way that
+.I styxlisten
+is implemented means that the
+.B aname
+from the remote
+.IR mount (2)
+request cannot be passed through to the
+attach message seen by the command that
+has been started by
+.IR styxlisten .
+.SH "SEE ALSO"
+.IR dial (2),
+.IR ssl (3),
+.IR auth (6),
+.IR svc (8)
--- /dev/null
+++ b/man/1/logon
@@ -1,0 +1,77 @@
+.TH LOGON 1
+.SH NAME
+logon \- log on to Inferno
+.SH SYNOPSIS
+[
+.B wm/wm
+]
+.B wm/logon
+[
+.B -l
+] [
+.BI "-n nsfile"
+] [
+.BI "-u user"
+]
+.SH DESCRIPTION
+.I Logon
+logs a user in to the Inferno environment.
+It requires
+.I wm (1)
+to be started first.
+If no
+.I user
+name is specified by the
+.B -u
+option,
+.I logon
+displays a login panel to prompt for one.
+The user name must have a directory
+.BI /usr/ user,
+which will become the current directory.
+(Otherwise,
+.I logon
+will display a diagnostic panel and prompt again.)
+The user name is written to
+.B /dev/user
+(see
+.IR cons (3)),
+which is the name presented on subsequent attaches to file servers.
+.PP
+Normally,
+.I logon
+expects keyboard input to provide a name,
+but if the
+.B -l
+option is given,
+.I logon
+displays a list of the names in
+.BR /usr ,
+allowing one to be selected using a mouse or touch screen.
+.PP
+Once the current directory has been set,
+.I logon
+creates a new name space for the user using the contents of
+.I nsfile
+(default:
+.BR namespace ),
+as described in
+.IR namespace (6).
+It then starts
+.IR toolbar (1)
+to provide the initial application environment.
+.SH FILES
+.TF /dev/userxx
+.TP
+.B /dev/user
+Inferno user name
+.TP
+.BI /usr/ user
+.IR user 's
+home directory
+.SH SOURCE
+.B /appl/wm/logon.b
+.SH SEE ALSO
+.IR toolbar (1),
+.IR wm (1),
+.IR namespace (6)
--- /dev/null
+++ b/man/1/logwindow
@@ -1,0 +1,23 @@
+.TH LOGWINDOW 1
+.SH NAME
+logwindow \- window that pops up when data becomes available.
+.SH SYNOPSIS
+.B wm/logwindow
+.RI [ title ]
+.BI < logfile
+.SH DESCRIPTION
+.I Logwindow
+reads data from its standard input (often a file served by
+.IR logfile (4))
+and shows it in a text widget.
+If the window is hidden (it is hidden initially),
+it will reappear when
+data appears on its standard input. If
+.I title
+is given, it will be used as the title of the window.
+.SH SOURCE
+.B /appl/wm/logwindow.b
+.SH SEE ALSO
+.IR logfile (4)
+.SH BUGS
+The text buffer grows without bound.
--- /dev/null
+++ b/man/1/look
@@ -1,0 +1,90 @@
+.TH LOOK 1
+.SH NAME
+look \- find lines in a sorted list
+.SH SYNOPSIS
+.B look
+[
+.BI -dfnix
+] [
+.BI -r " endkey"
+] [
+.BI -t c
+] [
+.I string
+]
+[
+.I file
+]
+.SH DESCRIPTION
+.I Look
+consults a sorted
+.I file
+and prints all lines that begin with
+.IR string .
+It uses binary search.
+.PP
+The following options are recognised:
+.TP
+.B -i
+Interactive.
+There is no
+.I string
+argument; instead
+.I look
+takes lines from the standard input as strings to be looked up.
+.TP
+.B -x
+Exact.
+Print only lines of the file whose key matches
+.I string
+exactly.
+.TP
+.B -d
+`Directory' order:
+only letters, digits,
+tabs and blanks participate in comparisons.
+.TP
+.B -f
+Fold.
+Upper case letters compare equal to lower case.
+.TP
+.B -n
+Numeric comparison with initial string of digits, optional minus sign,
+and optional decimal point.
+.TP
+.BI -r " endkey"
+Limit the range of matching values, to include
+the word
+.I endkey
+but no larger values.
+.TP
+.BR -t [ \f2c\f1 ]
+Character
+.I c
+terminates the sort key in the
+.IR file .
+By default, tab terminates the key. If
+.I c
+is missing the entire line comprises the key.
+.PP
+If no
+.I file
+is specified,
+.B /lib/words
+is assumed, with collating sequence
+.BR df .
+.SH FILES
+.B /lib/words
+.SH SOURCE
+.B /appl/cmd/look.b
+.SH "SEE ALSO"
+.IR sort (1),
+.IR grep (1)
+.SH DIAGNOSTICS
+The exit status is
+.B \&"not found"
+if no match is found, and
+.B \&"no dictionary"
+if
+.I file
+or the default dictionary cannot be opened.
--- /dev/null
+++ b/man/1/ls
@@ -1,0 +1,173 @@
+.TH LS 1
+.SH NAME
+ls, lc \- list files
+.SH SYNOPSIS
+.B ls
+[
+.B -lpmnqduntscrFT
+] [
+.IR file ...
+]
+.LP
+.B lc
+[
+.B -lpmnqduntscrFT
+] [
+.IR file ...
+]
+.SH DESCRIPTION
+.I Ls
+lists the named
+.IR file s
+in an order and format determined by its options.
+The options determining the output format are:
+.TP 10
+.B -l
+Produce output in long format. The information given in
+each column is as follows:
+.RS
+.IP 1.
+The permission mode of the file. This is formatted as 11 characters;
+the first is
+.RB ` d '
+if the file is a directory,
+.RB ` a '
+if the file is append-only,
+.RB ` A '
+if it is an authentication file,
+or
+.RB ` - '
+otherwise.
+The next character is
+.RB ` l '
+if the file is exclusive-use,
+or
+.RB ` - '
+otherwise.
+The remaining characters are in three groups
+of three, each representing one permission bit. Each character
+is either
+.RB ` r '
+(read permission),
+.RB ` w '
+(write permission),
+.RB ` x '
+(execute permission)
+or
+.RB ` - '
+(no permission).
+The three groups represent permissions granted for that file
+to the file's owner, members of the file's group and anybody else
+respectively.
+.IP 2.
+The device type (this is the `#' device letter for local devices
+or `M' for files mounted over a 9P connection).
+.IP 3.
+The device instance number (this distinguishes between
+separately mounted instances of the same device).
+.IP 4.
+The file's owner.
+.IP 5.
+The file's group.
+.IP 7.
+The size of the file in bytes.
+.IP 8.
+The date and time the file was last modified (see also the
+.B -u
+and the
+.B -e
+options).
+.IP 9.
+The name of the file.
+.RE
+.TP
+.B -m
+Print the name of the user who most recently modified
+the file.
+.TP
+.B -q
+Print the file's
+.I qid
+(see
+.IR sys-stat (2))
+at the beginning of each line;
+the printed fields are in the order
+path, version, and type.
+.TP
+.B -u
+Applicable only to the
+.B -l
+and
+.B -t
+options: causes time-sorted listings to be listed by
+time of last access, and the access time to be printed
+in long-format listings instead of the modification time.
+.TP
+.B -e
+Applicable only to the
+.B -l
+and
+.B -u
+options: causes the time to be displayed as seconds since the epoch.
+.TP
+.B -p
+Print each filename as a bare name, without the name
+of the containing directory.
+.PP
+The other options relate to the order in which the listed files
+are printed, and which files are selected. Usually, each
+.I file
+that is a directory has its contents printed. The
+.B -d
+option causes the directory itself to be listed.
+In a union directory, it is possible for there to be
+two or more instances of a file with the same name.
+The
+.B -c
+option causes only the first one occurring to be
+listed. The options relating to ordering are:
+.TP 10
+.B -n
+Do not sort the files at all.
+.TP
+.B -t
+Sort by modification time (most recent first)
+or access time if the
+.B -u
+option is also specified.
+.TP
+.B -s
+Sort by size (smallest first).
+.TP
+.B -r
+Reverse the sort order.
+.TP
+.B -F
+Add the character
+.B /
+after all directory names
+and the character
+.B *
+after all executable files.
+.TP
+.B -T
+Print the character
+.B t
+before each file if it has the temporary flag set, and
+.B -
+otherwise.
+.PP
+.I Lc
+is the same as
+.IR ls ,
+but sets the
+.B -p
+option and pipes the output through
+.IR mc (1).
+.SH SOURCE
+.B /appl/cmd/ls.b
+.br
+.B /dis/lc
+.SH SEE ALSO
+.IR readdir (2),
+.IR mc (1)
--- /dev/null
+++ b/man/1/m4
@@ -1,0 +1,272 @@
+.TH M4 1
+.SH NAME
+m4 \- macro processor
+.SH SYNOPSIS
+.B m4
+[
+.BI -D name = value
+] [
+.BI -Q name = value
+] [
+.BI -U name
+] [
+.I file
+\&...
+]
+.SH DESCRIPTION
+.I M4
+is a general-purpose macro processor.
+It copies text from each of the input
+.I files
+in order (or standard input by default), and writes the processed text to the standard output.
+.PP
+Macro calls
+have the form
+.IP
+.IB name ( arg1,\ arg2,\ ...,\ argn )
+.PP
+The `(' must immediately follow the name of the macro.
+If a defined macro name is not followed by a `(',
+it is deemed to have no arguments.
+Leading unquoted blanks, tabs, and newlines are ignored while collecting arguments.
+A comma within a nested parenthesis is part of an argument value, not an argument separator.
+Potential macro names consist of alphabetic letters, Unicode characters,
+digits, and underscore `\_', where the first character is not a digit.
+.PP
+Comments begin with the
+.B #
+character and extend to the end of that line; the characters in a comment are copied to the current
+output stream unchanged.
+The comment start and end sequences may be changed using the
+.B changecom
+call described below.
+.PP
+The left and right single quotes (ie, grave and acute accents \`\|\' ) are used to quote strings.
+Because the left and right quotes are distinct, quoted strings may nest.
+The value of a quoted string is the string stripped of the outermost quotes.
+The left and right quote characters may be changed using the
+.B changequote
+call described below.
+.PP
+When
+.I m4
+recognises a macro name, followed by a `(', it collects arguments up to a matching right parenthesis.
+Macro evaluation proceeds normally during this collection, and the text produced by those macro calls
+is interpreted exactly as if it had been in the original input stream (in place of the corresponding macro call).
+Thus, any commas or right parentheses within the value of a nested
+call are as effective as those in the original input text.
+(Remember however that commas within
+.I nested
+parentheses are not argument separators.)
+After argument collection,
+the value of the macro is pushed back onto the input stream
+and rescanned.
+.PP
+.I M4
+makes available the following built-in macros.
+They may be redefined, but once this is done the original meaning is lost.
+Their values are null unless otherwise stated.
+.TF changequote
+.TP
+changecom
+Change the starting and ending delimiters for subsequent comments to the first and second arguments.
+If the second argument is missing or an empty string, comments will be ended by newline.
+If there are no arguments, there are no comments.
+.TP
+changequote
+Change quote characters to the first and second arguments.
+.I Changequote
+without arguments restores the original values of
+.BR `\|' .
+.TP
+copydef
+The second argument is installed with the value of the macro
+named by the first argument,
+which may be a built-in macro.
+Typically both arguments are quoted to prevent too early expansion.
+A macro can be renamed using
+.B copydef
+followed by
+.BR undefine .
+.TP
+define
+The second argument is installed as the value of the macro
+named by the first argument.
+When the macro is later called (expanded),
+each occurrence in the replacement text of
+.BI $ n,
+where
+.I n
+is a digit,
+is replaced by the
+.IR n -th
+argument of that macro call.
+Argument 0 is the name of the macro;
+missing arguments are replaced by the null string.
+If the macro value is the same as its name, or the value is
+.BR $0 ,
+the result is the macro name.
+To prevent expansion of a name when redefining a macro, quote the first argument.
+.TP
+divert
+.I M4
+maintains 10 output streams,
+numbered 0-9.
+The final output is the concatenation of the streams
+in numerical order;
+initially stream 0 is the current stream.
+The
+.I divert
+macro changes the current output stream to its (digit-string)
+argument.
+Output diverted to a stream other than 0 through 9
+is discarded.
+.TP
+divnum
+Returns the value of the current output stream.
+.TP
+dnl
+Reads and discards characters up to and including the next newline.
+.TP
+dumpdef
+Prints current names and definitions,
+for the named items, or for all if no arguments are given.
+.TP
+errprint
+Prints its argument
+on the diagnostic output file.
+.TP
+eval
+Evaluates its argument as an arithmetic expression, using 32-bit arithmetic,
+and returns the result as a signed decimal integer.
+The only literals are decimal integers.
+Operators are those of Limbo: the binary operators
+.BR || ,
+.BR && ,
+.BR | ,
+.BR ^ ,
+.BR & ,
+.BR "== !=" ,
+.BR "< > >= <=" ,
+.B "<< >>"
+(arithmetic shifts),
+.BR "+ -" ,
+.BR "* / %" ,
+.BR "**" " (power)";
+the unary operators
+.BR + ,
+.BR - ,
+.BR ~ ,
+.BR ! ;
+and parenthesis.
+Operator precedence is the same as in Limbo.
+Right shifts are signed.
+.TP
+ifdef
+If the first argument is defined, the value is the second argument, otherwise the third.
+If there is no third argument, the value is null.
+The word
+.B inferno
+is predefined with
+.RB ` inferno '
+as its replacement text.
+.TP
+ifelse
+Has three or more arguments.
+If the first argument is the same string as the second,
+then the value is the third argument.
+If not, the process is repeated with arguments 4, 5, 6 and so on, in groups of three.
+If no match is found, the result is the remaining argument (not part of a group of three),
+or null if none is present.
+.TP
+include
+Returns the contents of the file named in the argument.
+.TP
+incr
+Returns the value of its argument incremented by 1.
+The value of the argument is calculated
+by interpreting an initial digit-string as a decimal number.
+.TP
+index
+Returns the position in its first argument where the second argument begins (zero origin),
+or \-1 if the second argument does not occur.
+.TP
+len
+Returns the number of characters in its argument.
+.TP
+maketemp
+Returns its first argument after replacing any trailing XXXs by the current host name, process ID, and a unique letter.
+Normally used to create unique temporary file names.
+.TP
+sinclude
+The same as
+.I include,
+except that it
+says nothing if the file is inaccessible.
+.TP
+substr
+Returns a substring of its first argument.
+The second argument is a zero origin
+number selecting the first character;
+the third argument indicates the length of the substring.
+A missing third argument is taken to be large enough to extend to
+the end of the first string.
+.TP
+syscmd
+Runs the first argument as an
+.IR sh (1)
+command.
+No value is returned.
+Note that the output of a command can be redirected to a temporary file named by
+.BR maketemp ,
+included, and then removed.
+.TP
+translit
+Transliterates the characters in its first argument
+from the set given by the second argument to the set given by the third.
+No abbreviations are permitted.
+.TP
+undefine
+Removes the definition of the macro named in its argument.
+.TP
+undivert
+Causes immediate output of text from diversions named as
+arguments, or all diversions if no argument.
+Text may be undiverted into another diversion.
+Undiverting discards the diverted text.
+.PD
+.PP
+.I M4
+interprets its command line options after installing the predefined macro set.
+The
+.B -D
+option defines
+.I name
+as a macro with the given
+.IR value ;
+.B -Q
+defines
+.I name
+as a macro with the given
+.IR value
+that is regarded as always quoted (ie, is never rescanned).
+Neither
+.B -D
+nor
+.B -Q
+may change a predefined macro.
+The
+.B -U
+option
+.I undefines
+the given macro
+.IR name ,
+which may be one of the predefined macros.
+.PP
+.I M4
+in Inferno is more closely related to the original
+.I m4
+in Seventh Edition UNIX than its more elaborate relatives in System V and POSIX.
+.SH "SEE ALSO"
+B. W. Kernighan and D. M. Ritchie,
+.I The M4 Macro Processor
--- /dev/null
+++ b/man/1/man
@@ -1,0 +1,244 @@
+.TH MAN 1
+.SH NAME
+man, wm/man, man2html, man2txt, lookman, sig \-
+print or find manual pages
+.SH SYNOPSIS
+.B man
+[
+.B -b
+] [
+.B -n
+] [
+.B -p
+] [
+.B -S
+] [
+.B -w
+]
+[
+.I section ...
+]
+.I title ...
+.br
+.B man -f
+.I file ...
+.br
+.B wm/man
+[
+.I section ...
+]
+.I title ...
+.br
+.B wm/man -f
+.I file ...
+.br
+.B man2html
+[
+.BI -h " header"
+] [
+.BI -i " initial"
+] [
+.BI -t " trailer"
+]
+.I file
+[
+.I section
+]
+.br
+.B man2txt
+[
+.B -p
+.I width
+]
+[
+.I file ...
+]
+.br
+.B lookman
+[
+.B -f
+]
+.I keyword ...
+.PP
+.B sig
+.I function ...
+.SH DESCRIPTION
+Both
+.I man
+and
+.BI wm/ man
+locate entries in this manual and display them.
+The pages for entries named
+.I title
+within each specified
+.IR section
+are displayed.
+If no sections are specified, matching pages
+from all sections are printed.
+Sections are given by number.
+.PP
+The
+.B -f
+option to
+.I man
+and
+.I wm/man
+prevent lookup in the manual index.
+Instead, the remaining arguments are treated as
+filenames.
+.I Man
+processes each file in turn.
+.I Wm/man
+adds each file to its page history and displays the first document in the list.
+.PP
+The
+.I man
+command prints the manual pages as formatted plain text to standard output.
+Manual pages are written using Plan9
+.I "troff -man"
+macros for their markup and so
+some detail is lost in conversion to plain text.
+.BI Wm/ man
+displays the pages in a graphical Wm window, providing a more faithful
+reproduction of the intended layout.
+.PP
+.I Man
+also accepts the following options:
+.TP
+.B -b
+Print the pages and send them to
+.IR plumber (1)
+for display in an editor.
+.TP
+.B -n
+Use
+.I man2txt
+to format the pages (default).
+.TP
+.B -p
+Display the pages using
+.IR wm/man .
+.TP
+.B -S
+Do not search the manual indices for the names: only print pages whose file names match the
+.IR titles .
+.TP
+.B -w
+Print the names of the man page source files instead of formatting them.
+.PP
+.I Man2html
+converts
+.B "troff -man"
+macro markup to an approximation in HTML on standard output.
+Only one file is processed at a time.
+It is assumed the input
+.I file
+is a manual page, in the given
+.I section
+(default: 1).
+The optional
+.I header
+string replaces the default header
+.BR "<HTML><HEAD>" .
+The optional
+.I initial
+text will appear immediately after
+.BR "<BODY>" .
+The optional
+.I trailer
+string replaces the default trailer
+.BR "</BODY></HTML>" .
+.PP
+.I Man2txt
+converts
+.B "troff -man"
+macro markup
+to plain text.
+Each file is processed separately.
+If no arguments are given, text from standard input is processed.
+The converted text is written to standard output.
+The
+.B -p
+option to
+.I man2txt
+specifies the page width in characters.
+.PP
+.I Lookman
+finds the manual pages, in any section, that
+contain all of the
+.I keywords
+given as arguments, and prints
+.I man
+commands and manual references for them, one per line.
+In a
+.IR wm-sh (1)
+window,
+any of the
+.I man
+commands can be selected with mouse button 2 and
+sent
+as a command; a manual reference can simply be
+.IR plumb (1)'d
+using mouse button 3.
+The
+.B -f
+option causes
+.I lookman
+just to list the file names.
+.PP
+.I Sig
+prints the type signature \- parameters and return types \- of
+each
+.I function
+found in section 2 of this manual.
+.SH FILES
+.TF /man/1/INDEX
+.TP
+.B /man/?/*
+Source files of manual pages.
+.TP
+.B /man/1/man
+The source file for this manual page.
+.TP
+.B /man/?/INDEX
+Used by
+.I man
+and
+.BI wm/ man
+to locate the source file containing a particular title.
+.TP
+.B /man/index
+The
+.I lookman
+index.
+.SH SOURCE
+.B /appl/wm/man.b
+.br
+.B /dis/man
+.IR sh (1)
+script
+.br
+.B /appl/cmd/man2txt.b
+.br
+.B /dis/lookman
+.IR sh (1)
+script
+.br
+.B /dis/sig
+.IR sh (1)
+script
+.br
+.B /appl/lib/parseman.b
+.SH "SEE ALSO"
+.IR wm (1)
+.SH BUGS
+.I Man2txt
+only knows about
+.I "troff -man"
+macros.
+Other troff macro packages or output from preprocessors
+such as
+.I pic
+or
+.I tbl
+will not be presented correctly.
--- /dev/null
+++ b/man/1/mash
@@ -1,0 +1,635 @@
+.TH MASH 1
+.SH NAME
+mash \- programmable shell
+.SH SYNOPSIS
+.B mash
+[
+.B -denx
+][
+.BI -c command
+] [
+.I file
+[
+.I arg ...
+]]
+.SH DESCRIPTION
+.I Mash
+is an older alternative to the original Inferno shell
+(now
+.IR tiny (1)).
+.I Mash
+is a programmable shell that also allows the definition of simple dependency
+rules, resembling those of Unix
+.IR make .
+It executes commands read from standard input
+or a file or, with the
+.B -c
+flag, from
+.IR mash 's
+argument list. Its syntax and
+semantics are similar to that of Plan 9's
+.IR rc .
+
+.SS Invocation
+If
+.I mash
+is started with no arguments it reads commands from standard
+input. Otherwise its first non-flag argument is the name of a file from
+which to read commands (but see
+.B -c
+below). Subsequent arguments
+become the initial value of
+.BR $args .
+Mash accepts the following
+command-line flags.
+.PD 0
+.TF "-c string"
+.TP
+.BI -c " string"
+Commands are read from string.
+.TP
+.B -d
+Dump parsed commands before execution.
+.TP
+.B -e
+Fail if a top level command does.
+.TP
+.B -n
+Parse but do not execute.
+.TP
+.B -x
+Print each simple command before executing it.
+.PD
+.PP
+If invoked without arguments
+.I mash
+first runs the commands found in
+.BR /lib/mashinit .
+
+.SS "Command Lines"
+Each command is terminated with an ampersand or a semicolon (& or ;).
+When reading from
+.B /dev/cons
+a newline
+not escaped with a backslash (\\) is treated as a semicolon.
+.I Mash
+does not
+wait for a command followed by
+.B &
+to finish executing before starting the
+following command.
+.PP
+A number-sign (#) and any following characters up to (but not including) the next newline are
+ignored, except in quotation marks.
+
+.SS "Simple Commands"
+A simple command is a sequence of words interspersed with I/O
+redirections. If the first word is the name of a
+.I mash
+function or of one of
+.IR mash 's
+built-in commands, it is executed by
+.IR mash .
+Otherwise, if the name
+starts with a slash
+.RB ( / ),
+it must be the path name of a Dis
+file to be loaded
+and executed. Names containing no initial slash are searched for in the
+current directory and then in
+.BR /dis .
+The
+.B .dis
+extension need not be
+supplied.
+.PP
+The keywords are
+.EX
+ case else fn for hd if in len rescue tl while
+.EE
+
+.SS Words and Variables
+A number of constructions may be used where
+.IR mash 's
+syntax requires a
+word to appear. In many cases a construction's value will be a list of
+strings rather than a single string.
+.PP
+The simplest kind of word is the unquoted word: a sequence of one or
+more characters none of which is a blank, tab, newline, or any of the
+following:
+.EX
+ # : ; ! ~ @ & | ^ $ = " ` ' { } ( ) < >
+.EE
+An unquoted word that contains any of the characters
+.BR * ,\ ?
+or
+.B [
+is a pattern
+for matching against file names. The character
+.B *
+matches any sequence of
+characters,
+.B ?
+matches any single character, and
+.B [
+.I class
+.B ]
+matches any
+character in the class. The class may also contain pairs of characters
+separated by
+.BR \- ,
+standing for all characters lexically between the two. The
+character
+.B /
+must appear explicitly in a pattern. A pattern is replaced by a
+list of words, one for each path name matched, except that a pattern
+matching no names is not replaced by the empty list, but rather stands for
+itself. Pattern matching is done after all other operations. Thus,
+.EX
+ x=/tmp; echo $x^/*.c;
+.EE
+matches
+.BR /tmp/*.c ,
+rather than matching
+.B /*.c
+and then prefixing
+.BR /tmp .
+.PP
+A quoted word is a sequence of characters surrounded by single quotes
+.RB ( ' ).
+A single quote is escaped with a backslash.
+.PP
+Each of the following is a word.
+.PD 0
+.HP
+.BI $ identifier
+.br
+The identifier after the
+.B $
+is the name of a variable whose value is
+substituted. Variable values are lists of strings. It is an error if the
+named variable has never been assigned a value.
+.HP
+.BI $ number
+.br
+See the description of rules for the
+.IR mash-make (1)
+builtin.
+.HP
+.B $"\c
+.I identifier
+.br
+The value is a single string containing the components of the named
+variable separated by spaces.
+.HP
+.BI `{ commands }
+.br
+.I mash
+executes the commands and reads the standard output, splitting
+it into a list of words, using the whitespace characters (space, tab,
+newline and carriage return) as separators.
+.HP
+.B
+"{\c
+.IB commands }
+.br
+.I mash
+executes the commands and reads the standard output, splitting
+it into a list of words, using the whitespace characters (space, tab,
+newline and carriage return) as separators.
+.HP
+.BI <{ commands }
+.HP
+.BI >{ commands }
+.br
+The commands are executed asynchronously with their standard
+output or standard input connected to a pipe. The value of the word
+is the name of a file referring to the other end of the pipe. This
+allows the construction of non-linear pipelines. For example, the
+following runs two commands
+.B old
+and
+.B new
+and uses
+.B cmp
+to compare their outputs
+.EX
+ cmp <{old} <{new};
+.EE
+.TP
+.BI ( expr )
+.I mash
+evaluates
+.I expr
+as an expression. The value is a (possibly null) list of words.
+Expressions are described in detail below.
+.HP
+.IB word ^ word
+.br
+The
+.B ^
+operator concatenates its two operands. If either operand is a
+singleton, the concatenation is distributive. Otherwise the lists are
+concatenated pairwise.
+
+.PD
+.SS Free Carets
+In most circumstances,
+.I mash
+will insert the
+.B ^
+operator automatically
+between words that are not separated by white space. Whenever one of
+.B $
+.BR ' or
+.B `
+(dollar, single quote or back quote)
+follows a quoted or unquoted word or an unquoted word follows a
+quoted word with no intervening blanks or tabs, a
+.B ^
+is inserted between
+the two. If an unquoted word immediately follows a
+.B $
+and contains a
+character other than an alphanumeric, or underscore, a
+.B ^
+is inserted before
+the first such character. Thus
+.IP
+.B limbo -$flags $stem.b
+.LP
+is equivalent to
+.IP
+.B limbo -^$flags $stem^.b
+
+.SS I/O Redirections
+The sequence
+.BI > file
+redirects the standard output file (file descriptor 1,
+normally
+.BR /dev/cons )
+to the named
+.IR file ;
+.BI >> file
+appends standard
+output to the file. The standard input file (file descriptor 0, also normally
+.BR /dev/cons )
+may be redirected from a file by the sequence
+.BR <file .
+The
+sequence
+.B <>file
+opens the file for read/write and associates both file
+descriptor 0 and 1 with it.
+
+.SH Compound Commands
+A pair of commands separated by a pipe operator
+.RB ( | )
+is a command. The
+standard output of the left command is sent through a pipe to the
+standard input of the right command.
+.PP
+Each of the following is a command.
+.PD 0
+.HP
+.B if (
+.I expr
+.B )
+.I command1
+.HP
+.B if (
+.I expr
+.B )
+.I command1
+.B else
+.I command2
+.br
+The
+.I expr
+ is evaluated and if the result is not null, then
+.I command1
+is executed. In the second form
+.I command2
+is executed if
+the result is null.
+.HP
+.B for (
+.I name
+.B in
+.I list
+.BI ) command
+.br
+The
+.I command
+is executed once for each word in
+.I list
+with that
+word assigned to
+.IR name .
+.HP
+.B while (
+.I expr
+.B )
+.I command
+.br
+The
+.I expr
+is evaluated repeatedly until its value is null. Each time it
+evaluates to non-null, the command is executed.
+.HP
+.B case
+.I expr
+.B {
+.I pattern-list
+.B =>
+.I command ...
+.B }
+.br
+.HP
+.B case
+.I expr-list
+.B {
+.I pattern
+.B =>
+.I command ...
+.B }
+.br
+In the first form of the command the
+.I expr
+is matched against a series of lists of regular expressions (See
+.IR regex (2)).
+The command associated with the matching expression is executed.
+In the second form the
+.I command
+associated with the first pattern to match one of the words in
+.I expr-list
+is executed. An
+.I expr-list
+will never match a
+.IR pattern-list .
+.HP
+.BI { commands }
+.HP
+.BI @{ commands }
+.br
+Braces serve to alter the grouping of commands implied by operator
+priorities. The body is a sequence of commands separated by
+.B &
+or
+.BR ; .
+The second form is executed with a new scope. Either form can be
+followed by redirections.
+.HP
+.BI fn name { list }
+.HP
+.BI fn name
+.br
+The first form defines a function with the given
+.IR name .
+Subsequently,
+whenever a command whose first word is
+.I name
+is encountered, the
+current value of the remainder of the command's word list will be
+assigned to the local variable
+.BR args ,
+in a new scope, and
+.I mash
+will execute the list. The second form removes
+.IR name 's
+function definition.
+.HP
+.IB name = list
+.HP
+.IB name := list
+.br
+The first form is an assignment to a variable. If the name is currently
+defined as a local variable its value will be updated. Otherwise a
+global variable with the given name will be defined or updated. The
+second form is an explicit definition or update of a local variable.
+.HP
+.IB list : list
+.HP
+.IB list : list { commands }
+.HP
+.IB word :~ word { commands }
+.br
+These forms define dependencies and rules for the
+.I make
+loadable
+builtin. The first form defines a simple dependency, the second a
+dependency with an explicit rule. The third form defines an implicit
+rule where the left-hand word is a file pattern, the right-hand word is
+the prerequisite. The right-hand word and the commands can
+contain references to the characters matched by the
+.B *
+meta-character
+in the pattern
+.RB ( $1
+evaluates to the characters matched by the first
+.BR * ,
+.B $2
+the second and so on;
+.B $0
+is the entire match).
+.PD
+
+.SS Expressions
+Expressions evaluate to possibly null lists of strings. A word is an
+expression. An expression may take one of the following forms
+.PD 0
+.HP
+.BI ( " expr " )
+.br
+Parentheses are used for grouping.
+.HP
+.BI hd " expr"
+.HP
+.BI tl " expr"
+.HP
+.BI len " expr"
+.HP
+.BI ! " expr"
+.br
+.I hd
+is the first element of a list,
+.I tl
+the remainder.
+.I len
+is the length of
+a list. Both evaluate to the null list if their operand is a null list.
+.B !
+is the not operator and evaluates to true for a null list or to a null list
+otherwise.
+.HP
+.IB expr " ^ " expr
+.HP
+.IB expr " :: " expr
+.HP
+.IB expr " == " expr
+.HP
+.IB expr " != " expr
+.HP
+.IB expr " ~ " expr
+.br
+.B ^
+is concatenation (as defined above),
+.B ::
+is list concatenation,
+.B ==
+and
+.B !=
+are the equality operators evaluating to true or the null list,
+depending on the equality or inequality of the two operands.
+.B ~
+is the match operator, true if a singleton string matches one of a list of
+regular expressions, or one of a list of strings matches a regular
+expression. (If neither operand is a singleton it evaluates to the null
+list.)
+.B ^
+has the highest precedence, followed by
+.B ::
+followed by the
+other three. All associate to the left except
+.BR :: .
+
+.SS Built-in Commands
+
+.I Mash
+supports loadable modules of builtins. The
+.I Mashbuiltin
+module definition and description is in
+.BR mash.m .
+One such module,
+.IR builtins ,
+is loaded before
+.I mash
+begins parsing. This module defines the following commands
+.PD 0
+.HP
+.B env
+.br
+Print global and local variables. Global variables are displayed using a
+.IB name = value
+format, and local variables using a
+.IB name := value
+format.
+.HP
+.B eval
+.br
+Concatenate arguments and use as mash input.
+.HP
+.B exit
+.br
+Cause
+.I mash
+to raise an
+.B "exit"
+exception.
+.HP
+.B load
+.I file
+.br
+Load a builtin module. The
+.I file
+must be a module with type
+.BR Mashbuiltin .
+The argument
+.I file
+is assumed to contain a path to the loadable module. If no such module
+is found then the string
+.B /dis/lib/mash/
+is prepended to
+.I file
+and the load is retried.
+.HP
+.B prompt
+.HP
+.BI prompt text
+.HP
+.BI prompt "text contin"
+.br
+When called with no arguments causes the current value of the
+.I mash
+prompt to be printed to standard output. The default value is
+.BR mash% .
+The second form sets a new prompt. The final form sets a new prompt
+and additionally a continuation string. Initially the continuation
+string is set to a single tab character.
+.I Mash
+uses the continuation string in place of the prompt string to indicate that
+the preceding line has been continued by escaping with a final backslash
+.RB ( \e )
+character.
+.HP
+.BI quote args...
+.br
+Print arguments quoted as input for
+.IR mash .
+.HP
+.BI "run -" [ denx "] file [arg...]"
+.br
+Interpret a file as input to
+.IR mash .
+.HP
+.BI time "cmd [arg...]"
+.br
+Time the execution of a command. The total execution time is reported
+in seconds and on standard error when the command completes.
+.HP
+.BI whatis name
+.br
+Print variable, function or builtin. The object given by
+.I name
+is described on standard output in a format that reflects its type.
+.PP
+The
+.I make
+loadable builtin provides `make` functionality.
+The
+.I tk
+loadable builtin provides control over some of the visual elements of a
+.I mash
+window.
+
+.SS Adding Builtins
+New builtins can be added to
+.I mash
+by creating a
+.I Dis
+module that can be loaded with a
+.B Mashbuiltin
+module interface (defined in mash.m).
+The new module is loaded with the builtin
+.B load
+command which calls its
+.B mashinit
+function to initialise it with an argument containing the
+.B load
+command line. The function should use this call to register the set of builtins
+that the module will provide using the
+.B Env.defbuiltin
+function. Thereafter, each time one of the registered builtins is invoked
+the module's
+.B mashcmd
+function is called passing as an argument a list containing the invoked
+builtin name and its arguments. See the examples in
+.BR mash/builtins.b ,
+.BR mash/make.b ", and"
+.BR mash/tk.b .
+.SH FILES
+.B /lib/mashinit
+.br
+.B /dis/lib/mash
+.SH SOURCE
+.B /appl/cmd/mash
+.SH SEE ALSO
+.IR mash-tk (1),
+.IR mash-make (1),
+.IR regex (2)
+.PP
+Tom Duff,
+``Rc \- The Plan 9 Shell'', in the
+.I "Plan 9 Programmer's Manual", Second Edition,
+Volume 2.
--- /dev/null
+++ b/man/1/mash-make
@@ -1,0 +1,182 @@
+.TH MASH-MAKE 1
+.SH NAME
+mash-make \- builtin `make' functionality
+.SH SYNOPSIS
+.B load make
+
+.B make
+[
+.I -clear
+]
+.br
+.B depends
+[
+.I target
+]
+.br
+.B match
+.I pattern
+.br
+.B rules
+[
+.I pattern
+]
+.br
+.SH DESCRIPTION
+.I Make
+is a loadable builtin for
+.IR mash .
+It can be taught about dependencies that exist between components of a program and
+rules for reconstructing the components of a program.
+.PP
+.I Make
+will examine file modification times to determine which components need
+to be updated and will
+issue commands to reconstruct them in the correct sequence.
+It will update a target if any of its prerequisites are more up to date than the target
+or if the target does not exist.
+.PP
+Typically, dependencies and rules are kept in a file called
+.BR mashfile .
+The sequence
+.PP
+.EX
+ load make
+ run mashfile
+.EE
+.PP
+is used to load the
+.I make
+builtin and read the rules from
+.BR mashfile .
+Thereafter, the command
+.IP
+.B make
+.I target
+.PP
+will perform the correct sequence of operations to reconstruct
+.I target
+and its dependents.
+.PP
+A dependency is specified in
+.I mash
+with a line of the form:
+.IP
+.IB target-list " : " dependent-list " ; "
+.PP
+or
+.IP
+.IB target-list " : " dependent-list " { " rules " } ;"
+.PP
+Each of the targets in
+.I target-list
+depends upon each of the dependents in
+.IR dependent-list .
+The optional
+.I rules
+specify how to build the targets. For example
+.EX
+ lflags = -Cg;
+ rotta.dis : rotta.b rotta.m { limbo $lflags rotta.b };
+.EE
+If the rules are omitted
+.I make
+must be able to infer them from implicit rules.
+.PP
+An implicit rule is defined with a line of the form:
+.IP
+.I pattern
+.B :~
+.I dependency
+.B {
+.I rules
+.B }
+.PP
+If
+.I pattern
+matches a target that
+.I make
+needs to build then
+.I make
+will build the target by first making the
+.I dependency
+and then applying the
+.IR rules .
+The wildcard components of the matched target are available in
+the
+.I dependency
+and the
+.I rules
+as variables
+.BR $1 ,
+.BR $2 ,
+.BR $3 ...
+with
+.B $1
+containing the text matched by the first wildcard,
+.B $2
+the second wildcard
+and so on. The whole of the target is available in the variable
+.BR $0 .
+For example,
+.PP
+.EX
+ /*/*.m :~ $2.m { cp $2.m /$1/$2.m };
+ /module/rotta.m: rotta.m;
+ /altmodule/frame.m: frame.m;
+.EE
+.PP
+More commonly, implicit rules are defined to provide
+.I make
+with knowledge of how to compile
+.I limbo
+source to produce
+.I Dis
+format binaries.
+Typically,
+.PP
+.EX
+ *.dis :~ $1.b { limbo $lflags $1.b};
+ /dis/*.dis :~ $1.dis { cp $1.dis /dis};
+.EE
+.PP
+A target is built with the command
+.IP
+.B make
+.I target
+.PP
+The list of rules can be reset with
+.IP
+.B make -clear
+.PP
+The list of dependencies for a target or for all targets can be
+displayed with the command
+.IP
+.B depends
+[
+.I target
+]
+.PP
+The rules that match a pattern and the components of the pattern
+can be displayed with
+.IP
+.B match
+.BI ' pattern '
+.PP
+Taking care to hide the pattern from
+.I mash
+file name pattern matching with quotes.
+The command
+.IP
+.B rules
+[
+.I pattern
+]
+.PP
+will display all the rules or the rules that apply to pattern
+.I pattern
+(if given).
+.SH SOURCE
+.B /appl/cmd/mash/make.b
+.SH "SEE ALSO"
+.IR mash (1)
--- /dev/null
+++ b/man/1/mash-tk
@@ -1,0 +1,212 @@
+.TH MASH-TK 1
+.SH NAME
+mash-tk \- control visual elements of mash window
+.SH SYNOPSIS
+.B load tk
+.br
+.B tk clear
+.br
+.B tk def button
+.I name value
+.br
+.B tk def ibutton
+.I name value image
+.br
+.B tk def menu
+.I name
+.br
+.B tk def item
+.I menu name value
+.br
+.B tk dialog
+.I title mesg default label ...
+.br
+.B tk dump [
+.I name ...
+.B ]
+.br
+.B tk env
+.br
+.B tk file
+.I title dir pattern ...
+.br
+.B tk geom
+.br
+.B tk layout [
+.I name ...
+.B ]
+.br
+.B tk notice
+.I message
+.br
+.B tk sel
+.br
+.B tk sget
+.br
+.B tk sput
+.I string
+.br
+.B tk string
+.I mesg
+.br
+.B tk taskbar
+.I string
+.br
+.B tk text
+.br
+.SH DESCRIPTION
+.I Tk
+is a loadable builtin for
+.IR mash.
+It provides a set of primitives for customizing a
+.I mash
+window and building fairly sophisticated graphical functions. It is currently implemented as a single command with a variety of subcommands. For the
+.I tk
+command to work,
+.I mash
+must have been started using
+.BR wm/wmmash .
+In the following descriptions, references to return values indicate strings put on a command's standard output.
+.SS Creating a Menu Bar
+The
+.B def
+subcommand is used to define graphical pushbuttons and menus. The
+.B def button
+and
+.B def ibutton
+commands are used to define pushbuttons labelled with text or graphical icons, respectively.
+The
+.I name
+parameter is used to label buttons, and to layout both buttons and ibuttons.
+.I Value
+is a command to be executed when the button is clicked, and must be quoted if it contains white space.
+.I Image
+is the name of a bitmap file; it is looked for in
+.BR /icon/tk ,
+unless the name begins with
+.BR@ ,
+which suppresses prepending
+.BR /icon/tk .
+.br
+.B Def menu
+is used to name and label menu buttons, and
+.B def item
+specifies items within the corresponding pulldown menus. In
+.BR "def item" ,
+.I menu
+is a name supplied on a
+.B def menu
+subcommand,
+.I name
+is the label for this menu item, and
+.I value
+is a command to execute when this menu item is selected.
+All the items in a menu are simple command buttons;
+there is no provision for any other kind of control, or for cascading menus.
+.br
+The
+.B layout
+subcommand creates and makes visible a menu bar, using menus and buttons defined with
+.B def
+subcommands. The current components, if any, are removed first,
+so layout with no parameters just removes all the current buttons and menus from the
+.I mash
+window. The components are laid out from left to right, in the order presented in the
+.B layout
+subcommand. A copy of the current
+.I mash
+environment is made, and commands executed as a result of clicking buttons
+or selecting menu items are executed in that environment.
+For example, variables will have the values they had when the layout was done.
+.br
+The
+.B env
+subcommand can be used to make a new copy of the environment for use by button
+or menu actions.
+.SS Displaying Popup Widgets
+The
+.B notice
+subcommand pops up a window containing
+.I message
+and a single button to dismiss the window. The icon displayed in the window is
+.BR /icons/tk/error .
+No value is returned by
+.BR notice .
+.br
+The
+.B dialog
+subcommand is more complex;
+.I title
+is used to name the window, and multiple buttons labelled according to the
+.B label
+parameter(s) are provided.
+.I Default
+is the number of the button which is the default choice. The leftmost button is numbered 0.
+When the user selects one of the buttons, the dialog box is popped down and the
+number of the button selected is returned.
+.br
+The
+.B file
+subcommand pops up a standard Inferno file selection box.
+.I Dir
+specifies the initial directory to display, and pattern specifies which non-directory files to include in the list of files. If the Cancel button in the file dialog is clicked, no value is returned. If a file is selected and the Exit button is clicked, the full pathname of the file is returned, complete with final
+.B /
+if the file is a directory. Double clicking on a non-directory file in the list will likewise return that file's path. Double clicking on a directory in the list will display the contents of that directory.
+.br
+The
+.B string
+subcommand pops up a small window with
+.I mesg
+as the label of a text field. Characters typed into the text field, up to but not including ENTER, are returned.
+.SS Dealing With the Selection
+.br
+The
+.B sel
+subcommand returns whatever is currently selected. When typing into the shell's window, nothing is selected, so nothing is returned. However, if invoked via a pushbutton and there is a selection, it is returned.
+.br
+The
+.B sput
+subcommand puts
+.I string
+into the snarf buffer maintained by the window manager, and the
+.B sget
+subcommand retrieves and returns the current contents of the snarf buffer. This provides a way to pass text between the shell and other applications. The Snarf and Paste buttons on the popup menu associated with mouse button two can also be used to do this.
+
+.SS Miscellaneous Tk Subcommands
+The
+.B taskbar
+subcommand lets you put
+.I string
+in the title bar of the
+.I mash
+window. The old value is returned.
+.br
+The
+.B text
+subcommand returns the contents of the
+.I mash
+window.
+.br
+The
+.B clear
+subcommand removes all text from the window.
+.br
+The
+.B dump
+subcommand returns the
+.I mash-tk
+commands needed to define the buttons and menus currently defined,
+and to recreate the currently visible set of buttons and menus, or, if
+.B dump
+has parameters, the commands needed to define the buttons and menus named by the parameters.
+.br
+The
+.B geom
+subcommand returns the position of the upper left corner of the
+.I mash
+window relative to the upper left corner of the Inferno screen.
+
+.SH SOURCE
+.B /appl/cmd/mash/tk.b
+.SH "SEE ALSO"
+.IR mash (1)
--- /dev/null
+++ b/man/1/math-misc
@@ -1,0 +1,223 @@
+.TH MATH-MISC 1
+.SH NAME
+ack, crackerbarrel, factor, fibonacci, fit, genprimes, mersenne, parts, perms, pi, powers, primes, sieve \- miscellaneous mathematical applications
+.SH SYNOPSIS
+.B math/ack
+[
+.IR m
+]
+[
+.IR n
+]
+.br
+.B math/crackerbarrel
+[
+.IR n
+]
+.br
+.B math/factor
+[
+.IR n
+]
+.br
+.B math/fibonacci
+.br
+.B math/fit
+[
+.BI -d deg
+]
+[
+.B -v
+]
+[
+.IR file
+]
+.br
+.B math/genprimes
+[
+.IR lim
+]
+.br
+.B math/mersenne
+[
+.IR num
+]
+.br
+.B math/parts
+[
+.B -a
+]
+[
+.IR num ...
+]
+.br
+.B math/perms
+[
+.IR n
+]
+.br
+.B math/pi
+[
+.IR dp
+]
+.br
+.B math/powers
+[
+.B -p num
+]
+[
+.B -n num
+]
+[
+.B -f num
+]
+[
+.B -l num
+]
+[
+.B -m num
+]
+[
+.B -v
+]
+.br
+.B math/primes
+[
+.IR m
+]
+[
+.IR n
+]
+.br
+.B math/sieve
+[
+.B -a alg
+]
+[
+.IR lim
+]
+.SH DESCRIPTION
+A collection of simple mathematical utilities.
+.PP
+.TP
+.B math/ack
+Calculates and times Ackermann's function A(m, n).
+.TP
+.B math/crackerbarrel
+Solves the crackerbarrel puzzle
+.B n
+times and outputs the time taken. See the source for details of the puzzle.
+.TP
+.B math/factor
+Factors the number n.
+.TP
+.B math/fibonacci
+Generates the first few terms of the Fibonacci series using recursion
+and user defined exceptions.
+.TP
+.B math/fit
+Fits a polynomial of degree
+.I deg
+to a set of points (x, y) where x is the independent variable, y the dependent one.
+All x and y values should be seperated by white space
+and can be real or integer. The values are read from
+.IR file
+or standard input if none is given. The
+.B -v
+option prints a table of actual and expected y values.
+.TP
+.B math/genprimes
+Generates primes numbers up to and including
+.B lim
+using spawned processes and buffered channels.
+.TP
+.B math/mersenne
+Tests the primality of the Mersenne numbers ie numbers of the form 2^n-1.
+The argument
+.IR num
+is the power of 2 in the above.
+.TP
+.B math/parts
+Calculates the number of partitions of the given number(s). The
+.B -a
+option will print out a table of the number of partitions of all numbers up to the
+given number(s).
+.TP
+.B math/perms
+Prints out all permutations of
+.B n
+elements.
+.TP
+.B math/pi
+Calculates the value of pi to
+.B dp
+decimal places.
+.TP
+.B math/powers
+Investigates the number of representations of an integer as a sum of
+powers.
+The
+.B -p
+option denotes the power of use (default 2). The
+.B -n
+option denotes the number of powers to sum (default 2). The
+.B -f
+option denotes the minimum number of such representations found before
+reporting them (default 2). The
+.B -l
+and
+.B -m
+options denote the smallest and largest numbers to consider respectively (defaults 0 and 8192). Finally the
+.B -v
+option prints various statistics during the search.
+.TP
+.B math/primes
+Prints out all primes between
+.B m
+and
+.B n .
+.TP
+.B math/sieve
+Prints out prime numbers up to
+.B lim
+using a sieve algorithm. The
+.B -a
+option indicates the level of sophistication of the algorithm (0-4).
+.PP
+.SH EXAMPLE
+.EX
+
+ math/powers -p 3 -m 30000
+gives
+ [2] 1729 = 1**3 + 12**3 = 9**3 + 10**3
+ [2] 4104 = 2**3 + 16**3 = 9**3 + 15**3
+ [2] 20683 = 10**3 + 27**3 = 19**3 + 24**3
+The number of representations found for each integer is indicated in
+square brackets.
+.EE
+.SH SOURCE
+.B /appl/math/ack.b
+.br
+.B /appl/math/crackerbarrel.b
+.br
+.B /appl/math/factor.b
+.br
+.B /appl/math/fibonacci.b
+.br
+.B /appl/math/fit.b
+.br
+.B /appl/math/genprimes.b
+.br
+.B /appl/math/mersenne.b
+.br
+.B /appl/math/parts.b
+.br
+.B /appl/math/perms.b
+.br
+.B /appl/math/pi.b
+.br
+.B /appl/math/powers.b
+.br
+.B /appl/math/primes.b
+.br
+.B /appl/math/sieve.b
--- /dev/null
+++ b/man/1/mc
@@ -1,0 +1,40 @@
+.TH MC 1
+.SH NAME
+mc \- multicolumn print
+.SH SYNOPSIS
+.B mc
+[
+.BI -c " columns"
+]
+[
+.I file ...
+]
+.SH DESCRIPTION
+.I Mc
+formats the contents of
+.I files
+(standard input by default) into columns.
+.I Columns
+is an integer specifying the number of
+character widths into which
+.IR mc 's
+output is formatted.
+If run in an
+.IR acme (1)
+window, the default
+.I columns
+is the number of zeros that will fit across the window;
+otherwise the default
+.I columns
+is 65.
+.SH SOURCE
+.B /appl/cmd/mc.b
+.SH "SEE ALSO"
+.IR acme (1)
+.SH BUGS
+The columns are not aligned properly
+if the input contains tabs.
+.br
+The output doesn't fit the width of a
+.IR wm-sh (1)
+window by default.
--- /dev/null
+++ b/man/1/mdb
@@ -1,0 +1,251 @@
+.TH MDB 1
+.SH NAME
+mdb - binary file editor
+.SH SYNOPSIS
+.B mdb
+[
+.B -w
+]
+.I file
+[
+.I command
+]
+.SH DESCRIPTION
+.I Mdb
+allows inspection of the contents
+of
+.IR file .
+If the
+.B -w
+option is given, then modification of the contents is also
+allowed.
+.I Mdb
+accepts commands of the form
+.IP
+.RI [ address ]
+.RB [ ,
+.IR count ]
+.RI [ command ]
+.PP
+If a
+.I command
+is given as an argument, then
+.I mdb
+will execute that command, otherwise
+it will read and execute commands from the standard input.
+If
+.I address
+is present then the current position, called `dot', is
+set to
+.IR address.
+Initially dot is set to 0.
+.I Command
+is repeated
+.I count
+times with dot advancing between repetitions. The default
+count is 1.
+.I Address
+and
+.I count
+are expressions.
+.SS Expressions
+Expressions take one of the following forms:
+.TP 10
+\&.
+The value of dot.
+.TP
++
+The value of dot.
+.TP
+^
+The value of dot.
+.TP
+"
+The value of the last address typed.
+.TP
+.I integer
+A number, decimal by default. A
+.RB ` 0 '
+prefix causes
+it to be interpreted as octal; a
+.RB ` 0x '
+prefix causes it to be interpreted as hexadecimal.
+.TP
+.BI ( expr )
+The value of the expression
+.IR expr .
+.PP
+.I Operators
+.RS
+.TP
+.IB e1 + e2
+Integer addition.
+.TP
+.IB e1 - e2
+Integer subtraction.
+.TP
+.IB e1 * e2
+Integer multiplication.
+.TP
+.IB e1 % e2
+Integer division. (N.B.
+.I not
+modulus).
+.TP
+.IB e1 | e2
+Bitwise disjunction.
+.TP
+.IB e1 & e2
+Bitwise conjunction.
+.RE
+.SS Commands
+Commands have the following syntax:
+.TP
+.BI / f
+Locations starting at
+.I address
+in
+.I file
+are printed according to the format
+.IR f .
+.TP
+.BI ? f
+Same as
+.RB ` / '.
+.TP
+.BI = f
+The value of
+.I address
+itself is printed according to the format
+.IR f .
+.PP
+A
+.I format
+consists of one or more characters that specify
+a style of printing. Each
+.I format
+fetches some data, prints it, and if the
+.I command
+is not
+.RB ` = ',
+advances dot by the amount of data fetched.
+All data is assumed to be held in little-endian
+form (least significant byte first).
+.RS
+.TP
+.PD 0
+.B o
+Print a two-byte integer in octal.
+.TP
+.B O
+Print a four-byte integer in octal.
+.TP
+.B d
+Print a two-byte integer in decimal.
+.TP
+.B D
+Print a four-byte integer in decimal.
+.TP
+.B u
+Print a two-byte integer in unsigned decimal.
+.TP
+.B U
+Print a four-byte integer in unsigned decimal.
+.TP
+.B b
+Print a single byte in hexadecimal.
+.TP
+.B x
+Print a two-byte integer in hexadecimal.
+.TP
+.B X
+Print a four-byte integer in hexadecimal.
+.TP
+.B n
+Prints a newline. No data is fetched.
+.TP
+.B +
+Increments dot by 1. No data is printed.
+.TP
+.B -
+Decrements dot by 1. No data is printed.
+.TP
+.B ^
+Increments dot by the size of the last format encountered.
+.TP
+.B c
+Prints a single byte as a character.
+.TP
+.B C
+Prints a single byte as a printable character, converting
+it to backslash escaped hex if necessary.
+.RE
+.PD
+Other commands include:
+.TP 10
+.RB [ ?/ ] w\ \fIvalue\fP
+Write the two-byte
+.I value
+to the addressed location.
+.TP
+.RB [ ?/ ] W\ \fIvalue\fP
+Write the four-byte
+.I value
+to the addressed location.
+.TP
+.RB [ ?/ ] i
+Disassemble
+.I count
+instructions starting at
+.I address
+.RI ( dot
+by default).
+.TP
+.BI $ modifier
+.I File
+must be a
+.IR dis (6)
+file.
+.I Modifier
+is one of the following subcommands:
+.RS
+.TP
+.PD 0
+.B D
+Print the descriptor section.
+.TP
+.B h
+Print the file header.
+.TP
+.B l
+Print the links section.
+.TP
+.B i
+Print the import section.
+.TP
+.B d
+Print the data section.
+.TP
+.B H
+Print exception handler tables.
+.TP
+.B s
+Print the name of the source file.
+.PD
+.RE
+.SH SOURCE
+.B /appl/cmd/mdb.b
+.SH SEE ALSO
+.IR dis (6)
+.SH BUGS
+Most of the more useful features of
+.IR mdb 's
+antecedent
+.I db
+are unimplemented.
+.PP
+It is not possible to print strings or UTF-8 characters.
+.PP
+As there is no ``native'' word format in Inferno,
+the assumption that all words are little-endian is hard
+to justify.
--- /dev/null
+++ b/man/1/miniterm
@@ -1,0 +1,142 @@
+.TH MINITERM 1
+.SH NAME
+miniterm \- Minitel® emulator
+.SH SYNOPSIS
+.B wm/minitel/miniterm
+[
+.I address
+]
+.SH DESCRIPTION
+.I Miniterm
+connects to the Minitel® service at the given
+.IR address ,
+by default the France Telecom Internet gateway
+to its Minitel® service,
+.BR tcp!pdc.minitelfr.com!513 .
+The
+.I address
+can be any form acceptable to
+.IR dial (2).
+.I Miniterm
+opens a new window that mimics a Minitel display.
+An array of buttons on the right hand side (in 40 character mode)
+or bottom (in 80 character mode) offer the special Minitel functions,
+with French abbreviations.
+Characters typed on the keyboard are sent to the server;
+typing the return key acts as
+.B Suite
+or
+.B Envoi
+as required.
+Clicking on a word with the mouse sends it to the server.
+.PP
+The France Telecom gateway offers a demonstration service
+using ID
+.B ZXNET1
+with password
+.BR DEMFTD .
+Once connected, the services
+.B PAGESM
+(a directory of all Minitel services) and
+.B FT
+(France Telecom's information service)
+are available without charge.
+See
+.B www.minitelfr.com
+for further information.
+.PP
+On certain native Inferno hardware,
+.I miniterm
+can also connect directly via a modem connection, using
+an address of the form
+.BI modem! modeminit ! number,
+which sends the string
+.I modeminit
+to the modem to initialise it,
+then dials the given
+.IR number .
+For example:
+.IP
+.EX
+wm/minitel/miniterm modem!F3!00133836431414
+.EE
+.PP
+Here, the
+.L F3
+is a code that tells the modem to enable V.23, which must be used when
+connecting to the France Telecom servers.
+To use pulse dialing instead of tone dialing the phone number
+can be prefixed with a
+.LR P ,
+as in:
+.IP
+.EX
+wm/minitel/miniterm modem!F3!P3614
+.EE
+.PP
+If the parameter specifies a network connection or a direct connection
+with a phone number the software will attempt to connect immediately.
+If the on-screen button
+.B Cx/Fin
+is used to disconnect and then re-connect,
+.I miniterm
+will use the
+same address if it is a network connection but prompt for a new
+phone number for a direct connection. When prompting
+for a new number the top row of the screen is used to allow the user
+to edit the last used number. Simple editing is available, and the minitel
+keys do the obvious things.
+.PP
+The Minitel function keys are displayed on the right hand side of the screen
+in 40 column mode on a network connection
+and can be swapped to the left hand side by hitting the
+.L <-
+key.
+In direct dial mode and 80 column network mode the keys are
+displayed at the bottom of the screen.
+In network mode they are redisplayed as appropriate on 40 to 80
+column mode changes.
+.PP
+.I Miniterm
+provides a software keyboard, activated by the
+.B Clavier
+button, which understands some of
+the Minitel keyboard mappings. For example, hitting
+.RB ` A '
+results
+in a capital
+.L A
+on the screen in spite of the Videotex case mapping.
+.SH FILES
+.TF /fonts/minitel
+.TP
+.B /dev/modem
+soft modem (no longer supported)
+.TP
+.B /dev/modemctl
+.TP
+.B /fonts/minitel
+text and semigraphic characters
+.SH SOURCE
+.B /appl/wm/miniterm
+.SH SEE ALSO
+.IR charon (1),
+.IR telnet (1)
+.SH BUGS
+There is no button to control use of error correction in direct dial mode;
+it will be enabled only if the server requests it, but not all do.
+Without it direct dial screens are occasionally corrupted.
+.PP
+The software keyboard is not AZERTY.
+Worse, it does not always come to the top on a mode change.
+.PP
+Some screens look wrong in 80 column
+mode.
+.PP
+On a network connection, choosing
+.B USA
+displays
+.LR iC
+at the bottom left hand
+corner of the screen. The server really is sending this sequence.
+Both the FT emulator and their explorer plug-in suffer from it too.
--- /dev/null
+++ b/man/1/mk
@@ -1,0 +1,579 @@
+.TH MK 1
+.SH NAME
+mk \- maintain (make) related files
+.SH SYNOPSIS
+.B mk
+[
+.B -f
+.I mkfile
+] ...
+[
+.I option ...
+]
+[
+.I target ...
+]
+.SH DESCRIPTION
+.I Mk
+uses the dependency rules specified in
+.I mkfile
+to control the update (usually by compilation) of
+.I targets
+(usually files)
+from the source files upon which they depend.
+The
+.I mkfile
+(default
+.LR mkfile )
+contains a
+.I rule
+for each target that identifies the files and other
+targets upon which it depends and a
+.IR sh (1)
+script, a
+.IR recipe ,
+to update the target.
+The script is run if the target does not exist
+or if it is older than any of the files it depends on.
+.I Mkfile
+may also contain
+.I meta-rules
+that define actions for updating implicit targets.
+If no
+.I target
+is specified, the target of the first rule (not meta-rule) in
+.I mkfile
+is updated.
+.PP
+The environment variable
+.B $NPROC
+determines how many targets may be updated simultaneously;
+ the default value is 1.
+.PP
+Options are:
+.TP \w'\fL-d[egp]\ 'u
+.B -a
+Assume all targets to be out of date.
+Thus, everything is updated.
+.PD 0
+.TP
+.BR -d [ egp ]
+Produce debugging output
+.RB ( p
+is for parsing,
+.B g
+for graph building,
+.B e
+for execution).
+.TP
+.B -e
+Explain why each target is made.
+.TP
+.B -i
+Force any missing intermediate targets to be made.
+.TP
+.B -k
+Do as much work as possible in the face of errors.
+.TP
+.B -n
+Print, but do not execute, the commands
+needed to update the targets.
+.TP
+.B -s
+Make the command line arguments sequentially rather than in parallel.
+.TP
+.B -t
+Touch (update the modified date of) file targets, without
+executing any recipes.
+.TP
+.BI -w target1 , target2,...
+Pretend the modify time for each
+.I target
+is the current time; useful in conjunction with
+.B -n
+to learn what updates would be triggered by
+modifying the
+.IR targets .
+.PD
+.SS The mkfile
+A
+.I mkfile
+consists of
+.I assignments
+(described under `Environment') and
+.IR rules .
+A rule contains
+.I targets
+and a
+.IR tail .
+A target is a literal string
+and is normally a file name.
+The tail contains zero or more
+.I prerequisites
+and an optional
+.IR recipe ,
+which is a
+.B sh
+script.
+Each line of the recipe must begin with white space.
+A rule takes the form
+.IP
+.EX
+target: prereq1 prereq2
+ sh \f2recipe using\fP prereq1, prereq2 \f2to build\fP target
+.EE
+.PP
+When the recipe is executed,
+the first character on every line is elided.
+.PP
+After the colon on the target line, a rule may specify
+.IR attributes ,
+described below.
+.PP
+A
+.I meta-rule
+has a target of the form
+.IB A % B
+where
+.I A
+and
+.I B
+are (possibly empty) strings.
+A meta-rule acts as a rule for any potential target whose
+name matches
+.IB A % B
+with
+.B %
+replaced by an arbitrary string, called the
+.IR stem .
+In interpreting a meta-rule,
+the stem is substituted for all occurrences of
+.B %
+in the prerequisite names.
+In the recipe of a meta-rule, the environment variable
+.B $stem
+contains the string matched by the
+.BR % .
+For example, a meta-rule to compile a limbo program anmd install it
+might be:
+.IP
+.EX
+%.dis: %.b
+ limbo $stem.b
+ cp $stem.dis /dis
+.EE
+.PP
+Meta-rules may contain an ampersand
+.B &
+rather than a percent sign
+.BR % .
+A
+.B %
+matches a maximal length string of any characters;
+an
+.B &
+matches a maximal length string of any characters except period
+or slash.
+.PP
+The text of the
+.I mkfile
+is processed as follows.
+Lines beginning with
+.B <
+followed by a file name are replaced by the contents of the named
+file.
+Blank lines and comments, which run from unquoted
+.B #
+characters to the following newline, are deleted.
+The character sequence backslash-newline is deleted,
+so long lines in
+.I mkfile
+may be folded.
+Non-recipe lines are processed by substituting for
+.BI `{ command }
+the output of the
+.I command
+when run by
+.IR sh .
+References to variables are replaced by the variables' values.
+Special characters may be quoted using single quotes
+.BR \&''
+as in
+.IR sh (1).
+.PP
+Assignments and rules are distinguished by
+the first unquoted occurrence of
+.B :
+(rule)
+or
+.B =
+(assignment).
+.PP
+A later rule may modify or override an existing rule under the
+following conditions:
+.TP
+\-
+If the targets of the rules exactly match and one rule
+contains only a prerequisite clause and no recipe, the
+clause is added to the prerequisites of the other rule.
+If either or both targets are virtual, the recipe is
+always executed.
+.TP
+\-
+If the targets of the rules match exactly and the
+prerequisites do not match and both rules
+contain recipes,
+.I mk
+reports an ``ambiguous recipe'' error.
+.TP
+\-
+If the target and prerequisites of both rules match exactly,
+the second rule overrides the first.
+.SS Environment
+Rules may make use of
+.B sh
+environment variables.
+A legal reference of the form
+.B $OBJ
+or
+.B ${name}
+is expanded as in
+.IR sh (1).
+A reference of the form
+.BI ${name: A % B = C\fL%\fID\fL}\fR,
+where
+.I A, B, C, D
+are (possibly empty) strings,
+has the value formed by expanding
+.B $name
+and substituting
+.I C
+for
+.I A
+and
+.I D
+for
+.I B
+in each word in
+.B $name
+that matches pattern
+.IB A % B\f1.
+.PP
+Variables can be set by
+assignments of the form
+.I
+ var\fL=\fR[\fIattr\fL=\fR]\fIvalue\fR
+.br
+Blanks in the
+.I value
+break it into words, as in
+.I sh
+but without the surrounding parentheses.
+Such variables are exported
+to the environment of
+recipes as they are executed, unless
+.BR U ,
+the only legal attribute
+.IR attr ,
+is present.
+The initial value of a variable is
+taken from (in increasing order of precedence)
+the default values below,
+.I mk's
+environment, the
+.IR mkfiles ,
+and any command line assignment as an argument to
+.IR mk .
+A variable assignment argument overrides the first (but not any subsequent)
+assignment to that variable.
+The variable
+.B MKFLAGS
+contains all the option arguments (arguments starting with
+.L -
+or containing
+.LR = )
+and
+.B MKARGS
+contains all the targets in the call to
+.IR mk .
+.PP
+Dynamic information may be included in the mkfile by using a line of the form
+.I
+ \fR<| \fIcommand\fR \fIargs\fR
+.br
+This runs the command
+.I command
+with the given arguments
+.I args
+and pipes its standard output to
+.I mk
+to be included as part of the mkfile. For instance, the file
+.B /os/sa1100/mkfile
+uses this technique
+to run a shell command with an awk script and a configuration file as arguments in order for
+the
+.I awk
+script to process the file and output a set of variables and their values.
+.SS Execution
+.PP
+During execution,
+.I mk
+determines which targets must be updated, and in what order,
+to build the
+.I names
+specified on the command line.
+It then runs the associated recipes.
+.PP
+A target is considered up to date if it has no prerequisites or
+if all its prerequisites are up to date and it is newer
+than all its prerequisites.
+Once the recipe for a target has executed, the target is
+considered up to date.
+.PP
+The date stamp
+used to determine if a target is up to date is computed
+differently for different types of targets.
+If a target is
+.I virtual
+(the target of a rule with the
+.B V
+attribute),
+its date stamp is initially zero; when the target is
+updated the date stamp is set to
+the most recent date stamp of its prerequisites.
+Otherwise, if a target does not exist as a file,
+its date stamp is set to the most recent date stamp of its prerequisites,
+or zero if it has no prerequisites.
+Otherwise, the target is the name of a file and
+the target's date stamp is always that file's modification date.
+The date stamp is computed when the target is needed in
+the execution of a rule; it is not a static value.
+.PP
+Nonexistent targets that have prerequisites
+and are themselves prerequisites are treated specially.
+Such a target
+.I t
+is given the date stamp of its most recent prerequisite
+and if this causes all the targets which have
+.I t
+as a prerequisite to be up to date,
+.I t
+is considered up to date.
+Otherwise,
+.I t
+is made in the normal fashion.
+The
+.B -i
+flag overrides this special treatment.
+.PP
+Files may be made in any order that respects
+the preceding restrictions.
+.PP
+A recipe is executed by supplying the recipe as standard input to
+the command
+.B
+ $SHELL -e -I
+.br
+where the
+.I SHELL
+variable is the appropriate shell on the current platform - typically
+.B /dis/sh
+.
+The appropriate value is automatically supplied in the Inferno build environment.
+The
+.B -e
+is omitted if the
+.B E
+attribute is set.
+The environment is augmented by the following variables:
+.TP 14
+.B $alltarget
+all the targets of this rule.
+.TP
+.B $newprereq
+the prerequisites that caused this rule to execute.
+.TP
+.B $nproc
+the process slot for this recipe.
+It satisfies
+.RB 0≤ $nproc < $NPROC .
+.TP
+.B $pid
+the process id for the
+.I mk
+executing the recipe.
+.TP
+.B $prereq
+all the prerequisites for this rule.
+.TP
+.B $stem
+if this is a meta-rule,
+.B $stem
+is the string that matched
+.B %
+or
+.BR & .
+Otherwise, it is empty.
+For regular expression meta-rules (see below), the variables
+.LR stem0 ", ...,"
+.L stem9
+are set to the corresponding subexpressions.
+.TP
+.B $target
+the targets for this rule that need to be remade.
+.PP
+These variables are available only during the execution of a recipe,
+not while evaluating the
+.IR mkfile .
+.PP
+Unless the rule has the
+.B Q
+attribute,
+the recipe is printed prior to execution
+with recognizable environment variables expanded.
+Commands returning error status
+cause
+.I mk
+to terminate.
+.PP
+Recipes and backquoted
+.B sh
+commands in places such as assignments
+execute in a copy of
+.I mk's
+environment; changes they make to
+environment variables are not visible from
+.IR mk .
+.PP
+Variable substitution in a rule is done when
+the rule is read; variable substitution in the recipe is done
+when the recipe is executed. For example:
+.IP
+.EX
+bar=a.b
+foo: $bar
+ limbo -o foo $bar
+bar=b.b
+.EE
+.PP
+will compile
+.B b.b
+into
+.BR foo ,
+if
+.B a.b
+is newer than
+.BR foo .
+.SS Aggregates
+Names of the form
+.IR a ( b )
+refer to member
+.I b
+of the aggregate
+.IR a .
+Currently, there are no aggregates supported under Inferno.
+.SS Attributes
+The colon separating the target from the prerequisites
+may be
+immediately followed by
+.I attributes
+and another colon.
+The attributes are:
+.TP
+.B D
+If the recipe exits with a non-null status, the target is deleted.
+.TP
+.B E
+Continue execution if the recipe draws errors.
+.TP
+.B N
+If there is no recipe, the target has its time updated.
+.TP
+.B n
+The rule is a meta-rule that cannot be a target of a virtual rule.
+Only files match the pattern in the target.
+.TP
+.B P
+The characters after the
+.B P
+until the terminating
+.B :
+are taken as a program name.
+It will be invoked as
+.B "sh -c prog 'arg1' 'arg2'"
+and should return a null exit status
+if and only if arg1 is not out of date with respect to arg2.
+Date stamps are still propagated in the normal way.
+.TP
+.B Q
+The recipe is not printed prior to execution.
+.TP
+.B R
+The rule is a meta-rule using regular expressions.
+In the rule,
+.B %
+has no special meaning.
+The target is interpreted as a regular expression as defined in
+.IR regexp (6).
+The prerequisites may contain references
+to subexpressions in form
+.BI \e n\f1,
+as in the substitute command of
+.IR sed (1).
+.TP
+.B U
+The targets are considered to have been updated
+even if the recipe did not do so.
+.TP
+.B V
+The targets of this rule are marked as virtual.
+They are distinct from files of the same name.
+.PD
+.SH EXAMPLES
+A simple mkfile to compile and install limbo programs:
+.IP
+.EX
+O=dis
+prog: a.$O b.$O c.$O
+ cp $prereq /dis
+
+%.$O: %.b
+ limbo $stem.b
+.EE
+.PP
+String expression variables to derive names from a master list:
+.IP
+.EX
+NAMES=alloc arc bquote builtins expand main match mk var word
+OBJ=${NAMES:%=%.$O}
+.EE
+.PP
+Regular expression meta-rules:
+.IP
+.EX
+([^/]*)/(.*)\e.dis:R: \e1/\e2.b
+ cd $stem1; limbo $stem2.b
+.EE
+.SH SOURCE
+.B /appl/cmd/mk
+.SH SEE ALSO
+.IR sh (1),
+.IR regexp (6)
+.br
+A. Hume,
+``Mk: a Successor to Make''.
+.br
+Bob Flandrena,
+``Plan 9 Mkfiles''.
+.SH BUGS
+Identical recipes for regular expression meta-rules only have one target.
+.br
+The recipes printed by
+.I mk
+before being passed to
+.I sh
+for execution are sometimes erroneously expanded
+for printing. Don't trust what's printed; rely
+on what
+.I sh
+does.
--- /dev/null
+++ b/man/1/mkdir
@@ -1,0 +1,49 @@
+.TH MKDIR 1
+.SH NAME
+mkdir \- make a directory
+.SH SYNOPSIS
+.B mkdir
+[
+.B -p
+]
+[
+.I dirname ...
+]
+.SH DESCRIPTION
+.I Mkdir
+creates the specified directories. It requires write permission in the parent directory.
+.PP
+The
+.B -p
+option causes
+.I mkdir
+to create the whole path
+.IR dirname ,
+including any missing parent directories; it also will not
+complain if
+.I dirname
+already exists and is a directory.
+.PP
+The new directories are created with permissions starting with
+.B 8r777
+but masked with the permissions of the parent directory according to the
+procedure followed by
+.IR sys-open (2).
+For example, if the parent directory lacks write permission for group
+and has no permissions for others,
+so will the newly created directory.
+.SH SOURCE
+.B /appl/cmd/mkdir.b
+.SH "SEE ALSO"
+.IR chmod (1),
+.IR cd (1),
+.IR rm (1),
+.IR sys-open (2)
+.SH DIAGNOSTICS
+If any directory cannot be created successfully,
+.I mkdir
+prints a warning, and continues with any remaining directories,
+but returns
+.B
+\&"error"
+exit status at the end.
--- /dev/null
+++ b/man/1/mprof
@@ -1,0 +1,169 @@
+.TH MPROF 1
+.SH NAME
+mprof, wm/mprof \- memory profiling limbo programs
+.SH SYNOPSIS
+.B mprof
+[
+.B -bcMflnve123
+] [
+.BI -m " modname"
+] ...
+[
+.BI "cmd arg ..."
+]
+.PP
+.B wm/mprof
+[
+.B -e12
+] [
+.BI -m " modname"
+] ...
+[
+.BI "cmd arg ..."
+]
+.PP
+.SH DESCRIPTION
+.I Mprof
+is a simple memory profiling tool which calculates the amount of main, heap and image memory
+used on a
+particular line of limbo source or in a particular limbo function or module. The main memory
+in question covers the space taken by dis code, jit code, runtime stacks and dynamic C module text, data and relocation areas. The heap memory covers all other limbo data structures. The source in
+question should be compiled with the
+.B -g
+flag so that the relevant symbol table files exist. In its simplest form, the memory
+profiler shows a line number, the current memory in bytes allocated
+when executing this line, the high water memory in bytes allocated when executing
+this line and the limbo source. This information is also available at the function and
+module level.
+.PP
+The tk version of the profiler
+.I wm/mprof
+shows this information in a text widget and colours the lines of source according
+to the amount of memory allocated by the line. The darker the colour, the
+more memory used.
+.PP
+The
+.B -b
+option starts profiling.
+.PP
+The
+.B -c
+option clears all profiling statistics and state in the memory profiling device. If any commands are specified to
+.B mprof
+, this is done automatically. It's specific
+use is to end the accumulation of statistics when profiling interactively. See the
+example below.
+.PP
+The
+.B -M
+option shows the memory statistics for each module
+The
+.B -f
+option shows the memory statistics for each function.
+.PP
+The
+.B -l
+option shows the memory statistics for each line. If neither this option nor the
+.B -M
+and
+.B -f
+options are given,
+.B -M
+and
+.B -l
+are assumed.
+.PP
+The
+.B -n
+option lists the name of the file along with the line number.
+.PP
+The
+.B -v
+option outputs all functions and/or lines even when they do not involve memory
+allocating or freeing operations.
+.PP
+The
+.B -m
+option lists the module names which are to be profiled. If none are given, all the
+modules loaded by the kernel will be profiled. The name may be the actual name of
+the module or its path name.
+.PP
+The
+.B -e
+option profiles the module that is loaded first in any following command. In this case
+there is no need to give a
+.B -m
+option as this is added automatically.
+.PP
+The
+.B -1
+option profiles only main memory (pool number 1 in the kernel). The default is
+to profile main, heap and image memory.
+.PP
+The
+.B -2
+option profiles only heap memory (pool number 2 in the kernel). The default is
+to profile main, heap and image memory.
+.PP
+The
+.B -3
+option profiles only image memory (pool number 3 in the kernel). The default is
+to profile main, heap and image memory.
+.PP
+Any remaining arguments are assumed to
+specify a command and set of arguments to the command. If this is the case,
+.B mprof
+will automatically start profiling, run the command to completion and then
+stop profiling before showing the profile statistics.
+.PP
+.B Mprof
+displays the profile statistics (unless the
+.B -b
+option is being used) according to the output format required.
+.PP
+.SH EXAMPLE
+.EX
+To profile a particular command
+ mprof /dis/math/parts 10000
+ wm/mprof /dis/math/parts 10000
+To profile the same command but restrict attention to its own module (Partitions).
+ mprof -m Partitions /dis/math/parts 10000
+ wm/mprof -m Partitions /dis/math/parts 10000
+A shorter version of the above
+ mprof -e /dis/math/parts 10000
+ wm/mprof -e /dis/math/parts 10000
+To profile interactively
+ mprof -b -m Polyhedra
+ wm/polyhedra &
+ mprof -M -f -l -n
+ <interact with wm/polyhedra ...>
+ mprof -M -f -l -n
+ wm/mprof
+ mprof -c
+.EE
+.PP
+Note that the output format options (
+.B -M
+,
+.B -f
+,
+.B -l
+,
+.B -n
+,
+.B -v
+) are ignored when
+.B -b
+is present.
+.SH SOURCE
+.B /appl/cmd/mprof.b
+.PP
+.B /appl/wm/mprof.b
+.SH BUGS
+Can take quite a time to present statistics when profiling all modules in the
+system.
+.SH SEE ALSO
+.IR cprof (1),
+.IR prof (1),
+.IR prof (2),
+.IR prof (3)
--- /dev/null
+++ b/man/1/mux
@@ -1,0 +1,149 @@
+.TH MUX 1
+.SH NAME
+mux \- interactive television demo
+.SH SYNOPSIS
+.B mux/mux
+.SH DESCRIPTION
+.I Mux
+is a standalone application environment run from the Inferno console
+in
+.IR emu (1)
+or started
+automatically by
+.IR init (8)
+in a native environment.
+It directly uses the
+.IR draw (3)
+device and either keyboard or Infrared,
+and cannot be run under
+.IR wm (1).
+It is included in this release only as an example of the use of the Prefab graphics
+module described by
+.IR prefab-intro (2).
+The simpler style of graphics and interaction provided by Prefab and
+demonstrated by
+.I mux
+might be more appropriate than Tk
+on devices that use infrared remote control
+for interaction, such as televisions,
+or devices with limited screen space, such as pocket devices or portable telephones.
+.SS Configuration
+.I Mux
+produces a menu derived from the configuration file
+.BR /services/basic .
+Each line in the file has three fields, separated by
+.BR : ,
+of the following form:
+.IP
+.IB icon : app : label
+.PP
+The
+.I icon
+is the name of a bitmap file to displayed in the menu alongside the textual
+.I label
+(which is the rest of the line).
+When the item is selected, as described below,
+.I mux
+runs the Dis file
+.IP
+.BI /dis/mux/ app .dis
+.SS Applications
+The following applications are available:
+.TF audioctl
+.TP
+.B fnn
+Financial reports:
+a scrolling `ticker tape' along the bottom of the screen.
+.TP
+.B movie
+Movies: select a film from a menu of categories
+.TP
+.B news
+Today's Newspaper: on-screen newspapers
+.TP
+.B tv
+Television
+.TP
+.B tvlist
+TV Timetable
+.TP
+.B pizza
+Order Pizza
+.TP
+.B email
+Internet mail
+.TP
+.B web
+Internet Web Browser: simplistic web browser
+.TP
+.B register
+Register with a service provider
+.TP
+.B ovid
+Presentations
+.TP
+.B audioctl
+Audio Control
+.PD
+.PP
+.SS Interaction
+.I Mux
+can be controlled using an infrared device, but for demonstration purposes
+under
+.IR emu (1)
+the infrared is emulated using the keyboard (see
+.IR ir (2)).
+The following are the common controls:
+.TF newline
+.TP
+.B r
+channel up
+.TP
+.B c
+channel down
+.TP
+.B t
+volume up
+.TP
+.B v
+volume down
+.TP
+.B i
+cursor up
+.TP
+.B m
+cursor down
+.TP
+.B j
+cursor left; rewind
+.TP
+.B k
+cursor right; fast forward
+.TP
+.B x
+return to main menu leaving application running; recall
+.TP
+.B newline
+select item
+.TP
+.B space
+exit and return to the previous screen or menu
+.SH FILES
+.B /services/basic
+.br
+.B /icons/*.bit
+.SH SOURCE
+.B /appl/mux
+.SH SEE ALSO
+.IR wm (1),
+.IR ir (2),
+.IR prefab-intro (2),
+.IR virgil (2),
+.IR manufacture (8),
+.IR register (8),
+.IR signer (8),
+.IR virgild (8)
+.SH BUGS
+The video demonstrations currently work only on native machines with specific hardware.
+.br
+For copyright reasons, some databases are not distributed, or have randomly-generated content.
--- /dev/null
+++ b/man/1/mv
@@ -1,0 +1,43 @@
+.TH MV 1
+.SH NAME
+mv \- move files
+.SH SYNOPSIS
+.B mv
+.I fromfile
+.I tofile
+.br
+.B mv
+.I fromfile ...
+.I todir
+.SH DESCRIPTION
+.I Mv
+moves
+.I fromfile
+to
+.IR tofile .
+If the files are in the same directory,
+.I fromfile
+is simply renamed;
+a previously existing file named
+.I tofile
+will be (silently) removed.
+Otherwise,
+.I mv
+copies
+.I fromfile
+to
+.IR tofile ,
+then removes
+.IR fromfile .
+This requires write permission for the parent directories involved.
+.PP
+If the last argument is a directory, the earlier arguments (all files) will be moved into that directory. Any previously existing files of the same name will be overwritten.
+Directories can only be renamed:
+.I mv
+refuses to move one into another.
+.SH SOURCE
+.B /appl/cmd/mv.b
+.SH "SEE ALSO"
+.IR cp (1),
+.IR rm (1),
+.IR sys-stat (2)
--- /dev/null
+++ b/man/1/netkey
@@ -1,0 +1,18 @@
+.TH NETKEY 1
+.SH NAME
+netkey \- calculate response to authentication challenge
+.SH SYNOPSIS
+.B netkey
+.SH DESCRIPTION
+.I Netkey
+calculates a response to a challenge made by a system to authenticate a user,
+based on a shared secret (password), using
+the same algorithm as a SecureNet device.
+It reads and writes
+.BR /dev/cons .
+It prompts once for the secret (echo is turned off).
+It then repeatedly prompts for a remote system's challenge,
+and once given it, calculates and prints the corresponding response.
+It exits on an empty challenge or end of file.
+.SH SOURCE
+.B /appl/cmd/netkey.b
--- /dev/null
+++ b/man/1/netstat
@@ -1,0 +1,42 @@
+.TH NETSTAT 1
+.SH NAME
+netstat \- summarize network connections
+.SH SYNOPSIS
+.B netstat
+.SH DESCRIPTION
+.I Netstat
+prints information about network connections.
+The following is presented for each connection:
+.IP
+connection name: the protocol and conversation directory in
+.B /net
+(eg.
+.BR tcp/8 )
+.br
+user name
+.br
+status of the connection
+.br
+address of each end of the connection (eg host and port if IP)
+.PP
+The information is obtained from the
+.B status
+file of each entry under the network directories
+.BR /net/tcp ,
+.BR /net/udp
+and
+.BR /net/il .
+.PP
+.I Netstat
+relies on a populated
+.B /net
+directory; the
+.B #I
+device must therefore
+have previously been bound there.
+.SH FILES
+.B /net/*/status
+.SH SOURCE
+.B /appl/cmd/netstat.b
+.SH "SEE ALSO"
+.IR ip (3)
--- /dev/null
+++ b/man/1/ns
@@ -1,0 +1,42 @@
+.TH NS 1
+.SH NAME
+ns \- display current namespace
+.SH SYNOPSIS
+.B ns
+[
+.B -r
+] [
+.I pid
+]
+.SH DESCRIPTION
+.I Ns
+displays the construction of the namespace of the given
+.IR pid ,
+or its own (as inherited) by default.
+Based on the contents of
+.BI /prog/ pid /ns ,
+it prints on standard output a sequence of bind and mount commands
+(see
+.IR bind (1))
+that might reconstruct the same name space if executed.
+In practice, mounts of services such as
+.IR ftpfs (4)
+often refer to the names of pipe ends that are now inaccessible.
+Furthermore, if any file involved has been renamed since the
+mount or bind, the original name of the file is shown.
+.PP
+Mounts of file services on a network show the network address as
+given to
+.IR dial (2)
+instead of the name of the data file for the connection; the
+.B -r
+option causes
+.I ns
+to show the raw file name instead.
+.SH SOURCE
+.B /appl/cmd/ns.b
+.SH "SEE ALSO"
+.IR bind (1),
+.IR prog (3),
+.IR namespace (4),
+.IR namespace (6)
--- /dev/null
+++ b/man/1/nsbuild
@@ -1,0 +1,49 @@
+.TH NSBUILD 1
+.SH NAME
+nsbuild \- build Inferno namespace
+.SH SYNOPSIS
+.B nsbuild
+[
+.B file
+]
+.SH DESCRIPTION
+.B Nsbuild
+builds a file name space for Inferno.
+It reads a
+.I file
+(by default, a file called
+.B namespace
+in the current directory)
+and interprets the
+name space commands found in that file.
+.PP
+The commands executed by
+.B nsbuild
+include
+.B bind
+and
+.BR mount .
+See
+.IR namespace (6)
+for details on the format of the file.
+.SH FILES
+.TP 1.5i
+.B namespace
+The default namespace file.
+.SH SOURCE
+.B /appl/cmd/nsbuild.b
+.SH "SEE ALSO"
+.IR bind (1),
+.IR cd (1),
+.IR newns (2),
+.IR namespace (6)
+.SH BUGS
+The
+.BR new
+and
+.BR fork
+operations of
+.IR namespace (6)
+are ineffective because
+.I nsbuild
+runs as a separate process.
--- /dev/null
+++ b/man/1/os
@@ -1,0 +1,101 @@
+.TH OS 1 hosted
+.SH NAME
+os \- interface to host OS commands (hosted Inferno only)
+.SH SYNOPSIS
+.B bind -a '#C' /
+.br
+.B os
+[
+.B -b
+] [
+.B -m
+.I mountpoint
+] [
+.BI -d " dir"
+] [
+.B -n
+] [
+.BI -N " level"
+]
+.I cmd
+[
+.IR arg ...
+]
+.SH DESCRIPTION
+.I Os
+uses a
+.IR cmd (3)
+device to execute a command,
+.IR cmd ,
+on a host system.
+If the
+.B -m
+option is given,
+.I os
+uses the device at
+.IR mountpoint ,
+otherwise it is asssumed to be at
+.BR /cmd ,
+and is bound into the local namespace if necessary.
+.PP
+The
+.B -d
+option causes the command to run in directory
+.IR dir ;
+an error results and the command will not run if
+.I dir
+does not exist or is inaccessible.
+The standard output and standard error of the command appear on the standard output
+and standard error streams of the
+.I os
+command itself.
+.I Os
+copies the standard input to the remote command's standard input; redirect
+.IR os 's
+input to
+.B /dev/null
+if there is no input to the command.
+.I Os
+terminates when
+.I cmd
+does, and its exit status reflects the status of
+.I cmd
+(if available).
+.PP
+If the
+.I os
+command is killed or exits (eg, for lack of input and output),
+the host's own process control operations are used to (attempt to) kill
+.IR cmd ,
+if it is still running.
+The
+.B -b
+(background) option suppresses that behaviour.
+.PP
+The
+.B -n
+option causes
+.I cmd
+to run with less than normal priority (`nice').
+The
+.B -N
+option sets low priority to a particular
+.I level
+from 1 to 3.
+.SH FILES
+.B /cmd/clone
+.SH SOURCE
+.B /appl/cmd/os.b
+.SH "SEE ALSO"
+.IR cpu (1),
+.IR rcmd (1),
+.IR cmd (3)
+.SH DIAGNOSTICS
+The exit status of
+.I os
+reflects any error that occurs when starting
+.I cmd
+and, if it starts successfully, the status of
+.I os
+is the exit status of
+.IR cmd .
--- /dev/null
+++ b/man/1/p
@@ -1,0 +1,33 @@
+.TH P 1
+.SH NAME
+p \- paginate
+.SH SYNOPSIS
+.B p
+[
+.BI - number
+]
+[
+.I file ...
+]
+.SH DESCRIPTION
+.I P
+copies its standard input, or the named files if given,
+to its standard output,
+stopping at the end of every page,
+to wait for a newline from the user.
+The option sets the
+.I number
+of lines on a page (default: 22).
+.PP
+While waiting for a newline,
+.I p
+interprets the commands:
+.TP
+.B !
+Pass the rest of the line to the shell as a command.
+.TP
+.B q
+Quit.
+.PP
+.SH SOURCE
+.B /appl/cmd/p.b
--- /dev/null
+++ b/man/1/passwd
@@ -1,0 +1,75 @@
+.TH PASSWD 1
+.SH NAME
+passwd \- change user password
+.SH SYNOPSIS
+.B auth/passwd
+[
+.BI -u " user"
+] [
+.BI -s " signer"
+] [
+.I keyfile
+]
+.SH DESCRIPTION
+.I Passwd
+changes the secret shared between the invoker
+and the authentication server
+.I signer
+(default:
+.BR $SIGNER ).
+The
+.I signer
+must offer the
+.IR keysrv (4)
+service.
+.PP
+The secret is associated with a remote user name that need not be
+the same as the name of the invoking user on the local system.
+That remote user name is specified by a certificate signed by
+.IR signer ,
+and obtained from
+.IR keyfile .
+.I Keyfile
+identifies a file containing a certificate (default:
+.LR default ).
+If
+.I keyfile
+is not an absolute pathname,
+the file used will be
+.BI /usr/ user /keyring/ keyfile.
+.I User
+by default is the invoking user's name (read from
+.BR /dev/user ),
+but the
+.B -u
+option can name another.
+.PP
+.I Passwd
+connects to the
+.IR signer ,
+authenticating using the certificate in
+.IR keyfile ,
+and checks that the user in the certificate
+is registered there with an existing secret.
+.I Passwd
+then prompts for the (remote) user's old secret, to double-check identity, then prompts for a new one, which must be confirmed.
+.PP
+Secrets must be at least eight characters long.
+Try to make them hard to guess.
+.SH FILES
+.TF /mnt/keysrv
+.TP
+.B /dev/user
+current user name
+.TP
+.B /mnt/keysrv
+local mount point for connection to
+remote
+.IR keysrv (4)
+.SH SOURCE
+.B /appl/cmd/auth/passwd.b
+.SH SEE ALSO
+.IR keyfs (4),
+.IR keysrv (4),
+.IR changelogin (8),
+.IR logind (8)
--- /dev/null
+++ b/man/1/plumb
@@ -1,0 +1,92 @@
+.TH PLUMB 1
+.SH NAME
+plumb \- send message to plumber
+.SH SYNOPSIS
+.B plumb
+[
+.BI -s " src"
+] [
+.BI -d " dest"
+] [
+.BI -w " wdir"
+] [
+.BI -t " type"
+] [
+.BI -a " name value"
+] [
+.B -i
+]
+.I data
+\&...
+.SH DESCRIPTION
+.I Plumb
+sends a message to the plumber,
+.IR plumber (8),
+which is normally started by
+.IR wm (1)'s
+start up script.
+.PP
+The options and arguments are used as components of the message.
+See
+.IR plumbing (6)
+for their interpretation.
+The options are:
+.TP
+.BI -s " src"
+Set the source to
+.I src
+(default: unspecified).
+.TP
+.BI -d " dest"
+Set the destination to
+.I dest
+(default: unspecified).
+.TP
+.BI -w " wdir"
+Set the working directory to
+.I wdir
+(default: current directory as reported by
+.IR pwd (1)
+or
+.IR workdir (2)).
+.TP
+.BI -t " type"
+Set the type of data to
+.I type
+(default:
+.BR text )
+.TP
+.BI -a " name value"
+Include an attribute
+.RI ` name = value ';
+there can be more than one.
+.TP
+.B -i
+Take the
+.I data
+from the standard input not from the argument strings.
+If an
+.B action
+attribute is not otherwise specified,
+.I plumb
+will add an
+.B action=showdata
+attribute to the message.
+.PP
+The remaining arguments are sent, separated by spaces, as the
+.I data
+of the message.
+The plumber
+will apply its rules to the resulting message to decide how to route it.
+.SH FILES
+.TF /chan/plumb.input
+.TP
+.B /chan/plumb.input
+.IR plumber (8)
+input channel
+.SH SOURCE
+.B /appl/cmd/plumb.b
+.SH SEE ALSO
+.IR plumbmsg (2),
+.IR plumbing (6),
+.IR plumber (8)
--- /dev/null
+++ b/man/1/prof
@@ -1,0 +1,135 @@
+.TH PROF 1
+.SH NAME
+prof, wm/prof \- profiling limbo programs
+.SH SYNOPSIS
+.B prof
+[
+.B -bflnve
+] [
+.BI -m " modname"
+] ... [
+.BI -s " rate"
+] [
+.BI "cmd arg ..."
+]
+.PP
+.B wm/prof
+[
+.B -e
+] [
+.BI -m " modname"
+] ... [
+.BI -s " rate"
+] [
+.BI "cmd arg ..."
+]
+.SH DESCRIPTION
+.I Prof
+is a simple profiling tool which calculates the percentage of time spent on a
+particular line of limbo source or spent in a particular limbo function. It can
+determine where a module or set of modules is spending its time. The source in
+question should be compiled with the
+.B -g
+flag so that the relevant symbol table files exist.
+.PP
+The tk version of the profiler
+.I wm/prof
+shows this information in a text widget and colours the lines of source according
+to the amount of time spent on each line. The darker the colour, the longer
+spent.
+.PP
+The
+.B -b
+option starts profiling.
+.PP
+The
+.B -f
+option shows the function profile.
+.PP
+The
+.B -l
+option shows the line profile. If neither this option nor the
+.B -f
+option are given,
+.B -l
+is assumed.
+.PP
+The
+.B -n
+option lists the name of the file along with the line number.
+.PP
+The
+.B -v
+option outputs all functions and/or lines even when the percentage
+of time spent in them is zero.
+.PP
+The
+.B -m
+option lists the module names which are to be profiled. If none are given, all the
+modules loaded by the kernel will be profiled. The name may be the actual name of
+the module or its path name.
+.PP
+The
+.B -e
+option profiles the module that is loaded first in any following command. In this case
+there is no need to give a
+.B -m
+option as this is added automatically.
+.PP
+The
+.B -s
+option sets the sample interval
+.I rate
+and is expressed in ms. The default is 100 ms.
+.PP
+Any remaining arguments are assumed to
+specify a command and set of arguments to the command. If this is the case,
+.B prof
+will automatically start profiling, run the command to completion and then
+stop profiling before showing the profile statistics.
+.PP
+.B Prof
+displays the profile statistics (unless the
+.B -b
+option is being used) according to the output format required.
+.PP
+.SH EXAMPLE
+.EX
+To profile a particular command
+ prof /dis/math/parts 10000
+ wm/prof /dis/math/parts 10000
+To profile the same command but restrict attention to its own module (Partitions).
+ prof -m Partitions /dis/math/parts 10000
+ wm/prof -m Partitions /dis/math/parts 10000
+A shorter version of the above
+ prof -e /dis/math/parts 10000
+ wm/prof -e /dis/math/parts 10000
+To profile interactively
+ prof -b -m Partitions -s 10
+ /dis/math/parts 10000
+ prof -f -l -n
+.EE
+.PP
+Note that the output format options (
+.B -f
+,
+.B -l
+,
+.B -n
+,
+.B -v
+) are ignored when
+.B -b
+is present.
+.SH SOURCE
+.B /appl/cmd/prof.b
+.PP
+.B /appl/wm/prof.b
+.SH SEE ALSO
+.IR cprof (1),
+.IR mprof (1),
+.IR prof (2),
+.IR prof (3)
+.SH BUGS
+.I Prof
+cannot profile compiled limbo programs.
--- /dev/null
+++ b/man/1/ps
@@ -1,0 +1,45 @@
+.TH PS 1
+.SH NAME
+ps \- process (thread) status
+.SH SYNOPSIS
+.B bind '#p' /prog
+.PP
+.B ps
+.SH DESCRIPTION
+.I Ps
+prints to the standard output information about all current Inferno processes.
+It looks in
+.B /prog
+for process status files;
+normally that requires that the
+.IR prog (3)
+device has previously been bound there (as shown above),
+but it is also possible to import
+.B /prog
+from a remote machine.
+.PP
+Each line of information printed consists of seven columns:
+the process id, the process group id, the owner of the
+process, cpu time used by the process, the run state of the process, the amount of memory used
+by the process, and the name of the module containing the
+currently running function.
+.SH FILES
+.B /prog/*/status
+.SH SOURCE
+.B /appl/cmd/ps.b
+.SH "SEE ALSO"
+.IR deb (1),
+.IR kill (1),
+.IR stack (1),
+.I wm/task
+and
+.I wm/memory
+in
+.IR wm-misc (1),
+.IR prog (3)
+.SH BUGS
+The amount reported as ``memory used'' does not accurately
+reflect the amount of memory referred to by the process,
+because the heap is shared.
+.br
+The cpu time used is currently shown as zero in most hosted implementations.
--- /dev/null
+++ b/man/1/pwd
@@ -1,0 +1,18 @@
+.TH PWD 1
+.SH NAME
+pwd \- print working directory
+.SH SYNOPSIS
+pwd
+.SH DESCRIPTION
+.I Pwd
+prints the path name of the working (current) directory.
+It is guaranteed to return the same path that was used to enter the directory.
+Note that if meanwhile the name space has changed, or directories in the path have been renamed,
+the path name may no longer be valid.
+.SH SOURCE
+.B /appl/cmd/pwd.b
+.SH "SEE ALSO"
+.IR cd (1),
+.IR bind (1),
+.IR sys-fd2path (2),
+.IR workdir (2)
--- /dev/null
+++ b/man/1/rcmd
@@ -1,0 +1,72 @@
+.TH RCMD 1
+.SH NAME
+rcmd \- remote command execution
+.SH SYNOPSIS
+.B rcmd
+[
+.B -e
+.I cryptoalg
+] [
+.B -x
+.I exportpath
+]
+.I host
+[
+.I cmd
+.I arg ...
+]
+.SH DESCRIPTION
+.I Rcmd
+executes
+.I cmd
+on the given
+.IR host .
+If no
+.I cmd
+is given,
+.IR sh (1)
+is assumed.
+The
+.I host
+must have enabled the
+.L rstyx
+service (typically started via
+.IR svc (8)).
+.PP
+For authentication,
+.I rcmd
+will use the certificate in the file
+.IP
+.BI /usr/ username /keyring/ net ! machine
+.PP
+if it exists, and otherwise it will use the certificate in
+.IP
+.BI /usr/ username /keyring/default .
+.PP
+The
+.B -e
+option sets the algorithm
+.I cryptoalg
+to be used following authentication for digesting or encryption.
+See
+.IR ssl (3)
+for the supported algorithms.
+The default is
+.BR none :
+.IR ssl (3)
+is not used after authentication.
+.PP
+The
+.B -x
+option sets the path to be exported as root from the local machine (defaults to
+.B /
+if not specified).
+.SH SOURCE
+.B /appl/cmd/rcmd.b
+.SH "SEE ALSO"
+.IR security-intro (2),
+.IR security-auth (2),
+.IR security-login (2),
+.IR getauthinfo (8),
+.IR rstyxd (8),
+.IR svc (8)
--- /dev/null
+++ b/man/1/read
@@ -1,0 +1,62 @@
+.TH READ 1
+.SH NAME
+read \- read from standard input with optional seek
+.SH SYNOPSIS
+.B read
+[
+.BR - [ eor ]
+.I offset
+] [
+.I count
+]
+.SH DESCRIPTION
+.I Read
+does a single read of
+.I count
+bytes (default:
+8192 bytes)
+from the standard input and writes
+the result to the standard output.
+If the optional
+.I offset
+argument is given,
+.I read
+will first apply
+.IR sys-seek (2):
+.TP
+.BI -o " offset"
+seek
+.I offset
+bytes from the start of the file
+.TP
+.BI -e " offset"
+seek
+.I offset
+bytes from the end of the file
+.TP
+.BI -r " offset"
+seek
+.I offset
+bytes from the standard input's current file offset
+.PP
+In all cases the file offset changes to
+reflect the result of the seek, and the number of bytes
+read.
+.SH SOURCE
+.B /appl/cmd/read.b
+.SH DIAGNOSTICS
+.I Read
+prints a diagnostic and returns a non-empty exit
+status
+.L fail:error
+on an I/O error;
+it quietly returns status
+.L fail:eof
+if the read returns zero bytes (conventionally, end of file).
+.SH SEE ALSO
+.IR cat (1),
+.I getline
+in
+.IR sh-std (1),
+.IR stream (1),
+.IR sys-read (2)
--- /dev/null
+++ b/man/1/rm
@@ -1,0 +1,28 @@
+.TH RM 1
+.SH NAME
+rm \- remove file(s)
+.SH SYNOPSIS
+.B rm
+[
+.B -fr
+]
+.I file ...
+.SH DESCRIPTION
+.I Rm
+removes the specified files or directories.
+A directory is removed only if it is empty (but
+see the
+.B -r
+option).
+Removal of a file requires write permission in its directory, but requires neither read nor write permission on the file itself. The options are:
+.TP
+.B -f
+Suppress diagnostics
+.TP
+.B -r
+Recursively remove a directory's substructure before removing the directory.
+.SH SOURCE
+.B /appl/cmd/rm.b
+.SH "SEE ALSO"
+.IR tiny (1),
+.IR sys-remove (2)
--- /dev/null
+++ b/man/1/runas
@@ -1,0 +1,23 @@
+.TH RUNAS 1
+.SH NAME
+runas \- run command as another user
+.SH SYNOPSIS
+.B runas
+.I user
+.I cmd
+[
+.IR arg ...
+]
+.SH DESCRIPTION
+.I Runas
+writes
+.I user
+to /dev/user and invokes
+.I cmd
+with the given arguments.
+The command is only invoked if setting of the user name succeeds.
+.SH SOURCE
+.B /appl/cmd/runas.b
+.SH "SEE ALSO"
+.IR cons (3),
+.
--- /dev/null
+++ b/man/1/secstore
@@ -1,0 +1,141 @@
+.TH SECSTORE 1
+.SH NAME
+secstore \- retrieve files from secure store
+.SH SYNOPSIS
+.B auth/secstore
+[
+.B -iv
+] [
+.BI -k " key"
+] [
+.BI -p " pin"
+] [
+.BI -s " address"
+] [
+.BI -u " user"
+] [
+.I op
+[
+.I file
+] ... ]
+.SH DESCRIPTION
+.I Secstore
+manages files on the eponymous Plan 9 secure storage service.
+It holds a set of files for each of its users.
+The service is most often used to store a file
+.B factotum
+containing user credentials in a form ready to be loaded into
+.IR factotum (4).
+.I Op
+is one of the following operations:
+.TP
+.B d
+Delete the given files on the server.
+.TP
+.B p
+Print the contents of each file on standard output.
+Each line is written separately, so that files of keys will be received correctly when written to
+.IR factotum (4).
+.TP
+.B r
+Replace the contents of files on the server by the contents of the named files,
+after encrypting them.
+In each case, the file name on the server is the last component of the local file name
+(ie, everything after the final
+.RB ` / ').
+.TP
+.B t
+List a table of contents of
+.IR user 's
+collection on the the server.
+By default, only the names are listed, one per line, but
+given the
+.B -v
+option, each line displays name, file size in bytes, date last stored, and SHA-1 hash of the file's contents.
+.TP
+.B x
+Extract the named files into files of the same name in the current directory.
+By default, they are decrypted (ie, in clear text).
+.PP
+If no
+.I op
+is specified,
+.I secstore
+connects to the server (thus checking the connection and the validity
+of both
+.I key
+and
+.IR user ),
+but does nothing with it.
+.PP
+By default,
+.I secstore
+prompts for a secret key to authenticate the user and the
+.B secstore
+service.
+The service might be configured to demand an extra authentication code, such as a `pin', in which case
+.I secstore
+will then prompt for that as well.
+The options are:
+.TP
+.B -i
+Read one or two lines from the standard input:
+the first line contains the secret; the optional second line contains the extra authentication code.
+.TP
+.BI -k " key"
+Use
+.I key
+as the secret to authenticate with the
+.B secstore
+service.
+.TP
+.BI -p " pin"
+Supply
+.I pin
+as the extra authentication code if the server demands it.
+.TP
+.BI -s " address"
+Connect to the server at the given network
+.IR address ,
+as defined by
+.IR dial (2),
+and translated by
+.IR cs (8).
+The default is
+.BR net!$auth!secstore .
+.TP
+.BI -u " user"
+Authenticate as
+.I user
+(default: the Inferno user name contained in
+.BR /dev/user )
+.TP
+.B -v
+Make the output more verbose:
+display the name announced by the remote server; and use the long form of the table of contents.
+.SH EXAMPLE
+Retrieve the
+.B factotum
+file and feed the keys therein to
+.IR factotum (4):
+.IP
+.EX
+auth/secstore p factotum >/mnt/factotum/ctl
+.EE
+.SH SOURCE
+.B /appl/cmd/auth/secstore.b
+.SH SEE ALSO
+.IR crypt (1),
+.IR secstore (2),
+.IR factotum (4),
+.br
+``Plan 9 Security'',
+.IR "Plan 9 Programmer's Manual" ,
+Fourth Edition,
+Volume 2, 2003.
+.SH BUGS
+Perhaps
+.I secstore
+should allow several
+.B -s
+options as a simple way to replicate the same files on different servers.
--- /dev/null
+++ b/man/1/sendmail
@@ -1,0 +1,48 @@
+.TH SENDMAIL 1
+.SH NAME
+sendmail \- send mail messages
+.SH SYNOPSIS
+.B sendmail
+[
+.I recipient ...
+]
+.SH DESCRIPTION
+.B Sendmail
+sends mail to each
+.I recipient
+named as an argument. It reads its standard input to
+get the text of the message.
+If no
+.I recipient
+is named, the recipient(s) will be taken from the message header.
+.PP
+The mail message is scanned for lines beginning
+.RL ` From: ',
+.RL ` To: '
+and
+.RL ` Cc: '.
+.br
+If no `from'
+line is found, the sender is assumed to be the current user. The recipient(s) of the message
+can be mentioned as arguments or in a list of names in a
+.RL ` To: '
+line but not as both.
+If the sender's name is unqualified (is just a user name),
+.I sendmail
+appends the value of the environment variable
+.LR DOMAIN .
+.PP
+.B Sendmail
+delivers the mail using the module
+.IR smtp (2),
+which
+connects to a mail server running the Simple Mail Transport Protocol (SMTP),
+using the symbolic host name
+.B $MAILSERVER
+(see
+.IR db (6)).
+.SH SOURCE
+.B /appl/cmd/sendmail.b
+.SH SEE ALSO
+.IR smtp (2),
+.IR db (6)
--- /dev/null
+++ b/man/1/sh
@@ -1,0 +1,980 @@
+.TH SH 1
+.SH NAME
+sh, builtin, exit, load, loaded, local, whatis, quote, run, set, unload, unquote \- command language
+.SH SYNOPSIS
+.B sh
+[
+.B -ilxvn
+]
+[
+.B -c command
+]
+[
+.I file
+[
+.I arg ...
+]
+.SH DESCRIPTION
+.I Sh
+is a programmable user level interface (a shell) for Inferno.
+It executes command lines read from a terminal or a file or, with the
+.B -c
+flag, from
+.IR sh 's
+argument list. It can also be used to give programmable functionality
+to Limbo modules (see
+.IR sh "" "" (2)).
+.SS Command Lines
+A command line is a sequence of commands, separated by ampersands or semicolons
+.RB ( &
+or
+.BR ; ),
+terminated by a newline.
+The commands are executed in sequence
+from left to right.
+.I Sh
+does not wait for a command followed by
+.B &
+to finish executing before starting
+the following command.
+Whenever a command followed by
+.B &
+is executed, its process id is assigned to the
+.I sh
+variable
+.BR $apid .
+Whenever a command
+.I not
+followed by
+.B &
+exits or is terminated, the
+.I sh
+variable
+.B $status
+gets the process's wait message (see
+.IR prog (3));
+it will be the null string if the command was successful.
+.PP
+A number-sign
+.RB ( # )
+and any following characters up to (but not including) the next newline
+are ignored, except in quotation marks.
+.SS Simple Commands
+A simple command is a sequence of arguments interspersed with I/O redirections.
+If the first argument is the name of a
+.I sh
+builtin or it is a braced command block (see
+.IR "Compound Commands",
+below), it is executed by
+.IR sh .
+If the first character of the name is a brace
+.RB ( { ),
+the shell tries to parse it and execute it as a braced command block;
+if the parsing fails, an exception is raised.
+Otherwise
+.I sh
+looks for an external program to execute.
+.PP
+If the name ends in
+.BR .dis ,
+.I sh
+looks for a Dis module of that name; otherwise
+it tries first to find a Dis module of
+that name with
+.B .dis
+appended and failing that, it looks for
+an executable file of the same name, which should
+be a readable, executable script file.
+If the name does not start with a slash
+.RB ( / )
+or dot-slash
+.RB ( ./ ),
+then the name is first looked for relative to
+.BR /dis ,
+and then relative to the current directory.
+A Dis module will be executed only if it
+implements the
+.B Command
+interface (see
+.IR sh (1));
+a script file will be executed only if it
+starts with the characters
+.RB `` #! ''
+followed by the name of a file executable
+under the rules above. In this case the
+command will be executed with any following arguments mentioned
+in the
+.B #!
+header, followed by the path of the script file,
+followed by any arguments originally given to the command.
+.PP
+For example, to execute the simple command
+.BR "ls" ,
+.I sh
+will look for one of the following things, in order,
+stopping the search when one is found:
+.RS
+.IP 1)
+a built-in command named
+.RB `` ls ''.
+.IP 2)
+a Dis module named
+.RB `` /dis/ls.dis '',
+.IP 3)
+an executable script file named
+.RB `` /dis/ls '',
+.IP 4)
+a Dis module named
+.RB `` ./ls.dis '',
+.IP 5)
+an executable script file named
+.RB `` ./ls ''.
+.RE
+.SS Arguments and Variables
+A number of constructions may be used where
+.I sh's
+syntax requires an argument to appear.
+In many cases a construction's
+value will be a list of arguments rather than a single string.
+.PP
+The simplest kind of argument is the unquoted word:
+a sequence of one or more characters none of which is a blank, tab,
+newline, or any of the following:
+.EX
+ # ; & | ^ $ ` ' { } ( ) < > " =
+.EE
+An unquoted word that contains any of the characters
+.B *
+.B ?
+.B [
+is a pattern for matching against file names.
+The character
+.B *
+matches any sequence of characters,
+.B ?
+matches any single character, and
+.BI [ class ]
+matches any character in the
+.IR class .
+If the first character of
+.I class
+is
+.BR ^ ,
+the class is complemented. (As this character
+is special to the shell, it may only be included in a pattern
+if this character is quoted, as long as the leading
+.B [
+is not quoted).
+The
+.I class
+may also contain pairs of characters separated by
+.BR - ,
+standing for all characters lexically between the two.
+The character
+.B /
+must appear explicitly in a pattern.
+A pattern is replaced by a list of arguments, one for each path name matched,
+except that a pattern matching no names is not replaced by the empty list,
+but rather stands for itself.
+Pattern matching is done after all other
+operations.
+Thus,
+.EX
+ x=/tmp; echo $x^/*.b
+.EE
+matches
+.BR /tmp/*.b ,
+rather than matching
+.B "/*.b
+and then prefixing
+.BR /tmp .
+.PP
+A quoted word is a sequence of characters surrounded by single quotes
+.RB ( ' ).
+A single quote is represented in a quoted word by a pair of quotes
+.RB ( '' ).
+.PP
+.ne 3
+Each of the following is an argument.
+.PD 0
+.HP
+.BI ( arguments )
+.br
+The value of a sequence of arguments enclosed in parentheses is
+a list comprising the members of each element of the sequence.
+Argument lists have no recursive structure, although their syntax may
+suggest it.
+The following are entirely equivalent:
+.EX
+ echo hi there everybody
+ ((echo) (hi there) everybody)
+ echo (hi
+ there
+ everybody
+ )
+.EE
+Newlines within parentheses count as simple white space;
+they do not terminate the command. This can be useful to give
+some more freedom of layout to commands that take several
+commands as arguments, for instance several of the commands
+defined in
+.IR sh-std (1).
+.HP
+.BI $ argument
+.br
+The
+.I argument
+after the
+.B $
+is the name of a variable whose value is substituted.
+Multiple levels
+of indirection are possible.
+Variable values
+are lists of strings.
+If
+.I argument
+is a number
+.IR n ,
+the value is the
+.IR n th
+element of
+.BR $* ,
+unless
+.B $*
+doesn't have
+.I n
+elements, in which case the value is empty.
+Assignments to variables are described under
+.I "Assignment" ,
+below.
+.HP
+.BI $# argument
+.br
+The value is the number of elements in the named variable.
+A variable
+never assigned a value has zero elements.
+.HP
+\f5$"\fP\fIargument\fP
+.br
+The value is a single string containing the components of the named variable
+separated by spaces. A variable with zero elements yields the empty string.
+.HP
+.BI `{ command }
+.HP
+.I
+\f5"{\fPcommand\f5}\fP
+.br
+.I Sh
+executes the
+.I command
+and reads its standard output. If backquote
+.RB ( ` )
+is used, it is split into a list of arguments,
+using characters in
+.B $ifs
+as separators.
+If
+.B $ifs
+is not otherwise set, its value is
+.BR "'\ \et\en'" .
+If doublequote (\f5"\fP)
+is used, no tokenization takes place.
+.HP
+.IB argument ^ argument
+.br
+The
+.B ^
+operator concatenates its two operands.
+If the two operands
+have the same number of components, they are concatenated pairwise.
+If not,
+then one operand must have one component, and the other must be non-empty,
+and concatenation is distributive.
+.HP
+.BI ${ command }
+.br
+.I Command
+must be a simple command with no redirections;
+its first word
+must be the name of a builtin substitution operator.
+The operator is invoked and its value substituted.
+See
+.IR "Built-in Commands" ,
+below, for more information on builtins.
+.HP
+.BI <{ command }
+.HP
+.BI >{ command }
+.br
+The
+.I command
+is executed asynchronously with its standard output or standard input
+connected to a pipe.
+The value of the argument is the name of a file
+referring to the other end of the pipe.
+This allows the construction of
+non-linear pipelines.
+For example, the following runs two commands
+.B old
+and
+.B new
+and uses
+.B cmp
+to compare their outputs
+.EX
+ cmp <{old} <{new}
+.EE
+.PD
+.SS Free Carets
+In most circumstances,
+.I sh
+will insert the
+.B ^
+operator automatically between words that are not separated by white space.
+Whenever one of
+.B $
+.B '
+.B `
+follows a quoted or unquoted word or an unquoted word follows a quoted word
+with no intervening blanks or tabs,
+a
+.B ^
+is inserted between the two.
+If an unquoted word immediately follows a
+.BR $
+and contains a character other than an alphanumeric, underscore,
+or
+.BR * ,
+a
+.B ^
+is inserted before the first such character.
+Thus
+.IP
+.B limbo -$flags $stem.b
+.LP
+is equivalent to
+.IP
+.B limbo -^$flags $stem^.b
+.SS Assignment
+A command of the form
+.IB name = value
+or
+.IB name := value
+assigns
+.I value
+to the environment variable named
+.IR name .
+.I Value
+is either a list of arguments or an assignment statement. In
+the latter case
+.I value
+is taken from the value assigned in the assignment statement.
+If
+.B :=
+is used, the value is stored in the innermost local scope.
+A local scope is created every time a braced block is entered,
+and destroyed when the block is left. If
+.B =
+is used, the value is stored in the innermost scope
+that contains any definition of
+.IR name .
+.PP
+A list of names can also be used in place of
+.IR name ,
+which causes each element of
+.I value
+in turn to be assigned the respective variable name in
+the list. The last variable in the list is assigned any elements
+that are left over. If there are more variable names than
+elements in
+.IR value ,
+the remaining elements are assigned the null list.
+For instance, after the assignment:
+.EX
+ (a b c) = one two three four five
+.EE
+.B $a
+is
+.BR one ,
+.B $b
+is
+.BR two ,
+and
+.B $c
+contains the remaining three elements
+.BR "(three four five)" .
+.SS I/O Redirections
+The sequence
+.BI > file
+redirects the standard output file (file descriptor 1, normally the
+terminal) to the named
+.IR file ;
+.BI >> file
+appends standard output to the file.
+The standard input file (file descriptor 0, also normally the terminal)
+may be redirected from a file by the sequence
+.BI < file \f1,
+or by the sequence
+.BI <> file \f1,
+which opens the file for writing as well as reading.
+Note that if
+.I file
+is in fact a parsed braced block, the redirection will be treated as
+pipe to the given command - it is identical to the
+.B "<{}"
+operator mentioned above.
+.PP
+Redirections may be applied to a file-descriptor other than standard input
+or output by qualifying the redirection operator
+with a number in square brackets.
+For example, the diagnostic output (file descriptor 2)
+may be redirected by writing
+.BR "limbo junk.b >[2] junk" .
+.PP
+A file descriptor may be redirected to an already open descriptor by writing
+.BI >[ fd0 = fd1 ]
+or
+.BI <[ fd0 = fd1 ]\f1.
+.I Fd1
+is a previously opened file descriptor and
+.I fd0
+becomes a new copy (in the sense of
+.IR sys-dup (2))
+of it.
+.PP
+Redirections are executed from left to right.
+Therefore,
+.B limbo junk.b >/dev/null >[2=1]
+and
+.B limbo junk.b >[2=1] >/dev/null
+have different effects: the first puts standard output in
+.BR /dev/null
+and then puts diagnostic output in the same place, where the second
+directs diagnostic output to the terminal and sends standard output to
+.BR /dev/null .
+.SS Compound Commands
+A pair of commands separated by a pipe operator
+.RB ( | )
+is a command.
+The standard output of the left command is sent through a pipe
+to the standard input of the right command.
+The pipe operator may be decorated
+to use different file descriptors.
+.BI |[ fd ]
+connects the output end of the pipe to file descriptor
+.I fd
+rather than 1.
+.BI |[ fd0 = fd1 ]
+connects output to
+.I fd1
+of the left command and input to
+.I fd0
+of the right command.
+.PP
+A sequence of commands separated by
+.BR & ,
+.BR ; ,
+or newline
+may be grouped by surrounding
+them with braces
+.RB ( {} ),
+elsewhere referred to as a
+.IR "braced block" .
+A braced block may be used anywhere that a simple word
+is expected. If a simple command is found with
+a braced block as its first word, the
+variable
+.B $*
+is set to any following arguments,
+.B $0
+is set to the block itself, and the commands
+are executed in sequence. If a braced block
+is passed as an argument, no execution takes place:
+the block is converted to a functionally equivalent
+string, suitable for later re-interpretation by the shell.
+The null command
+.RB ( {} )
+has no effect and always gives a nil status. For instance
+the following commands all produce the same result:
+.EX
+ echo hello world
+ {echo hello world}
+ '{echo hello world}'
+ {echo $*} hello world
+ sh -c {echo hello world}
+ {$*} {echo hello world}
+ {$*} {{$*} {echo hello world}}
+ "{echo {echo hello world}}
+ '{echo hello' ^ ' world}'
+ x := {echo hello world}; $x
+.EE
+It is important to note that the value of
+.B $*
+is lost every time a braced block is entered, so
+for instance, the following command prints an empty string:
+.EX
+ {{echo $*}} hello world
+.EE
+.PD
+.SS Built-in Commands
+The term ``built-in command'', or just ``builtin'', is used somewhat loosely
+in this document to refer to any command that is executed
+directly by the shell; most built-in commands are defined
+by externally loaded modules; there are a few that are not,
+known as ``internal'' builtins, listed below.
+.PP
+Given
+.IR sh 's
+ability to pass compound commands (braced blocks) as
+arguments to other commands, most control-flow
+functionality that is traditionally hard-wired into a shell
+is in
+.I sh
+implemented by loadable modules. See
+.IR sh-std (1),
+.IR sh-expr (1),
+and
+.IR sh-tk (1)
+for more details.
+.PP
+There are two classes of built-in commands;
+the first class, known simply as ``builtins'', are used in
+the same way as normal commands, the only difference
+being that builtins can raise exceptions, while external
+commands cannot, as they are run in a separate process.
+The second class, known as
+``builtin substitutions'' can only be used as the first
+word of the command in the
+.B ${}
+operator. The two classes exist in different name-spaces:
+a builtin may do something quite different from a
+builtin substitution of the same name.
+.PP
+In general, normal builtins perform some action
+or test some condition;
+the return status of a normal builtin usually
+indicates error status or conditional success. The
+rôle of a substitution builtin is to yield a value,
+(possibly a list)
+which is substituted directly into place as part
+of the argument list of a command.
+.PP
+.PD 0
+.HP
+.BI @ " command ..."
+.br
+Execute
+.I command
+in a subshell, allowing (for instance) the name-space to be
+forked independently of main shell.
+.HP
+.BI run " file ..."
+.br
+Execute commands from
+.IR file .
+.B $*
+is set for the duration to the remainder of the argument list following
+.IR file .
+.HP
+.BI builtin " command ..."
+.br
+Execute
+.I command
+as usual except that any command defined by an external
+module is ignored in favour of the original meaning.
+This command cannot be redefined by an external module.
+.HP
+.B exit
+.br
+Terminate the current process.
+.HP
+.BI load " path..."
+.br
+.B Load
+tries to load each of its arguments as a builtin module
+into
+.IR sh .
+If a module load succeeds, each builtin
+command defined by that module is
+added to the list of builtin commands.
+If there was a previous definition of the command,
+it is replaced, with the exception of internal
+.I sh
+builtins, which are covered up and reappear when
+the module is unloaded. If a module with
+the same
+.I path
+has already been loaded,
+.I sh
+does not try to load it again.
+Unless the path begins with
+.B /
+or
+.BR ./ ,
+the shell looks in the standard builtins directory
+.B /dis/sh
+for the module.
+If a load fails, a
+.B bad module
+exception is raised.
+The environment variable
+.B $autoload
+can be set to a list of Shell modules that
+each instance of
+.I sh
+should load automatically during its initialisation.
+(More precisely, the modules are loaded
+when a new
+.B Sh->Context
+is created: see
+.IR sh (2)
+for details.)
+.HP
+.BI unload " path..."
+.br
+.B Unload
+undoes previous load commands. To succeed,
+.I path
+must be the same as that given to a previous
+invocation of
+.BR load .
+.HP
+.B loaded
+.br
+.B Loaded
+prints all the builtin commands currently
+defined, along with the name of the module that defined them.
+Internally defined commands are tagged with
+module
+.BR builtin .
+.HP
+.BI whatis " name ..."
+.br
+Print the value of each
+.I name
+in a form suitable for input to
+.IR sh .
+The forms are:
+.RS 10
+.TP
+.I varname = "value..."
+.I Varname
+is a non-nil environment variable.
+.TP
+.BI load\ module ;\ name
+.I Name
+has been defined as a builtin by the externally loaded
+.IR module .
+.TP
+.BI load\ module ;\ ${ name }
+.I Name
+has been defined as a builtin substitution by the externally loaded
+.IR module .
+.TP
+.BI builtin\ name
+.I Name
+is defined as a builtin internally by
+.IR sh .
+.TP
+.BI ${ name }
+.I Name
+is defined as a builtin substitution
+internally by the shell.
+.TP
+.I pathname
+The completed pathname of an external file.
+.RE
+.HP
+.B ${builtin
+.I command
+...
+.B }
+.br
+Does for substitution builtin commands
+what
+.B builtin
+does for normal commands.
+.HP
+.B ${loaded}
+.br
+The
+.B loaded
+builtin substitution yields a list of the names of all
+the modules currently loaded, as passed to
+.BR load .
+.HP
+.BI ${quote \ list }
+.br
+.B Quote
+yields a single element
+list which if reparsed by the shell
+will recreate
+.IR list .
+.HP
+.BI ${bquote \ list }
+.br
+Same as
+.B quote
+except that items in
+.I list
+that are known to be
+well-formed command blocks are not quoted.
+.HP
+.BI ${unquote \ arg}
+.br
+.B Unquote
+reverses the operation of
+.BR quote ,
+yielding the original list of values. For example,
+.BI "${unquote ${quote " list }}
+yields
+.IR list .
+A list quoted with
+.B bquote
+can only be unquoted by parsing.
+.PD
+.SS Environment
+The
+.I environment
+is a list of strings made available to externally executing commands by the
+.B env
+module
+(see
+.IR env (2)).
+If the
+.B env
+module does not exist or cannot be loaded, no error will be
+reported, but no variables can be exported to external commands.
+.I Sh
+creates an environment entry for each variable whose value is non-empty.
+This is formatted as if it had been run through
+.BR ${quote} .
+Note that in order for a variable to be exported, its
+name must conform to the restrictions imposed
+by
+.IR env (3);
+names that do not will not be exported.
+.PP
+When
+.I sh
+starts executing it reads variable definitions from its
+environment.
+.PP
+Internally, the shell holds a
+.IR context ,
+which holds a stack of environment variables, the
+current execution flags and the list of built-in modules.
+A copy is made whereever parallel access to the context might
+occur. This happens for processes executing
+in a pipeline,
+processes run asynchronously with
+.BR & ,
+and in any builtin command that runs a shell command
+asynchronously.
+.SS Exceptions
+When
+.I sh
+encounters an error processing its input, an exception is raised,
+and if the
+.B -v
+flag is set, an error message is printed to
+standard error.
+An exception causes processing of the current command to terminate
+and control to be transferred back up the invocation stack.
+In an interactive shell, the central command processing loop
+catches all exceptions and sets
+.B $status
+to the name of the exception.
+Exceptions are not propagated between processes. Any
+command that requires I/O redirection is run in a separate
+process, namely pipes
+.RB ( | ),
+redirections
+.RB ( > ,
+.BR < ,
+.BR >> ,
+and
+.BR <> ),
+backquote substitution
+(\f5`\fP, \f5"\fP)
+and background processes
+.RB ( & ).
+Exceptions can be raised and rescued using
+the
+.B raise
+and
+.B rescue
+functions in the standard builtins module,
+.BR std .
+(See
+.IR sh-std (1)).
+Names of exceptions raised by
+.I sh
+include:
+.TP 10
+.B parse error
+An error has occurred trying to parse a command.
+.TP
+.B usage
+A builtin has been passed an invalid set of arguments;
+.TP
+.B bad redir
+An error was encountered trying to open files prior
+to running a process.
+.TP
+.B bad $ arg
+An invalid name was given to the $ or ${} operator.
+.TP
+.B no pipe
+.I Sh
+failed to make a pipe.
+.TP
+.B bad wait read
+An error occurred while waiting for a process to exit.
+.TP
+.B builtin not found
+A substitution builtin was named but not found.
+.SS Special Variables
+The following variables are set or used by
+.IR sh .
+.PD 0
+.TP \w'\fL$promptXX'u
+.B $*
+Set to
+.IR sh 's
+argument list during initialization.
+Whenever a
+braced block
+is executed, the current value is saved and
+.B $*
+receives the new argument list.
+The saved value is restored on completion of the
+.BR block .
+.TP
+.B $apid
+Whenever a process is started asynchronously with
+.BR & ,
+.B $apid
+is set to its process id.
+.TP
+.B $ifs
+The input field separators used in backquote substitutions.
+If
+.B $ifs
+is not set in
+.IR sh 's
+environment, it is initialized to blank, tab and newline.
+.TP
+.B $prompt
+When
+.I sh
+is run interactively, the first component of
+.B $prompt
+is printed before reading each command.
+The second component is printed whenever a newline is typed and more lines
+are required to complete the command.
+If not set in the environment, it is initialized by
+.BR "prompt=('%\ '\ '')" .
+.TP
+.B $status
+Set to the wait message of the last-executed program,
+the return status of the last-executed builtin
+(unless started with
+.BR &),
+or the name of the last-raised exception, whichever
+is most recent.
+When
+.I sh
+exits at end-of-file of its input,
+.B $status
+is its exit status.
+.PD
+.SS Invocation
+If
+.I sh
+is started with no arguments it reads commands from standard input.
+Otherwise its first non-flag argument is the name of a file from which
+to read commands (but see
+.B -c
+below).
+Subsequent arguments become the initial value of
+.BR $* .
+.I Sh
+accepts the following command-line flags.
+.PD 0
+.TP \w'\fL-c\ \fIstring\fLXX'u
+.BI -c " string"
+Commands are read from
+.IR string .
+.TP
+.B -i
+If
+.B -i
+is present, or
+.I sh
+is given no arguments and its standard input is a terminal,
+it runs interactively.
+Commands are prompted for using
+.BR $prompt .
+This option implies
+.BR -v .
+.TP
+.B -l
+If
+.B -l
+is given or the first character of argument zero is
+.BR - ,
+.I sh
+reads commands from
+.BR /lib/sh/profile ,
+if it exists, and then
+.BR ./lib/profile ,
+if it exists, before reading its normal input.
+.TP
+.B -n
+Normally,
+.I sh
+forks its namespace on startup; if
+.B -n
+is given, this behaviour is suppressed.
+.TP
+.B -v
+Within a non-interactive shell, informational messages
+printed to standard error are usually disabled;
+giving the
+.B -v
+flag enables them.
+.TP
+.B -x
+Print each simple command to stderr before executing it.
+.PD
+.SH SOURCE
+.B /appl/cmd/sh/sh.y
+.SH "SEE ALSO"
+.IR sh (1),
+.IR sh-std (1),
+.IR sh-expr (1),
+.IR sh-file2chan (1),
+.IR sh-tk (1),
+.IR sh-arg (1),
+.IR sh-regex (1),
+.IR sh-string (1),
+.IR sh-csv (1),
+.IR sh (2),
+.IR env (2)
+.SH BUGS
+Due to lack of system support, appending to
+a file with
+.B >>
+will not work correctly when there are
+multiple concurrent writers (but see the
+examples section of
+.IR sh-file2chan (1)
+for one solution to this).
+.PP
+While it
+.I is
+possible to use the shell as a general
+purpose programming language, it is a very slow one!
+Intensive tasks are best done in Limbo, which is a much
+safer language to boot.
--- /dev/null
+++ b/man/1/sh-alphabet
@@ -1,0 +1,417 @@
+.TH SH-ALPHABET 1
+.SH NAME
+alphabet, typeset, declare, import, type, define, autodeclare,
+autoconvert, -, rewrite, modules, types, usage, info, clear \- typed shell interface
+.SH SYNOPSIS
+.B load alphabet
+
+.B type
+.IR qname ...
+.br
+.B declare
+.I name
+[
+.I usage
+]
+.br
+.B undeclare
+.IR name ...
+.br
+.B define
+.I name
+.I expr
+.br
+.B import
+.IR qname ...
+.br
+.B typeset
+.I qname
+.br
+.B autoconvert
+.I srctype dsttype expr
+.br
+.B autodeclare
+.BR "" 0 | 1
+.br
+.B -
+.BI { expression }
+.br
+.B ${rewrite {\fIexpression\fP}
+[
+.I dsttype
+]
+.B }
+.br
+.B ${modules}
+.br
+.B ${types
+.I typeset
+.B }
+.br
+.B ${usage
+.I qname
+.B }
+.br
+.B info
+.br
+.B clear
+.SH DESCRIPTION
+.I Alphabet
+is a loadable
+.IR sh (1)
+module providing an interface to a simple, experimental, typed shell.
+It initially provides a small set of basic types, which can be added
+to by loading new
+.IR typeset s.
+Types are atomic;
+.I alphabet
+provides no support for higher-order
+types.
+The
+.IR "root typeset" ,
+named
+.BR / ,
+consists of the following kinds of value:
+.TP 10
+.B string
+A simple string literal, represented by itself,
+or quoted according to the usual shell quoting rules.
+.TP
+.B cmd
+A shell command or uninterpreted
+.I alphabet
+expression, represented by the syntax \f5"{\fIblock\f5}\fR.
+.TP
+.B fd
+A file open for reading.
+.TP
+.B wfd
+A file open for reading and writing.
+.TP
+.B status
+The status of a completed command.
+.PP
+Each typeset implements a set of
+types, and has an associated set of
+.IR module s.
+Initially, types may only be referred to by their
+.IR "qualified name" s,
+consisting of the name of the type prefixed with
+the name of its typeset; for instance
+.B /string
+for the string type,
+or
+.B /grid/data
+for a type named
+.B data
+in the typeset
+.BR /grid .
+An
+.I "unqualified name"
+is the qualified name without the typeset prefix;
+for instance
+.B string
+or
+.BR data .
+.PP
+To make a type available as its unqualified name,
+use the
+.B type
+command, which imports the type named
+by the qualified name
+.I qname
+from its parent typeset.
+This is a no-op if the type has previously been imported
+from the same typeset; an error is raised if the type
+has previously been imported from a different typeset.
+.PP
+.B Declare
+declares the module
+.IR name
+with type
+.IR usage .
+If
+.I name
+is a qualified name, the module must exist in the
+specified typeset and be compatible with the specified usage.
+If
+.I usage
+is not given, the module itself will be loaded and queried
+to find it out.
+If
+.I name
+is not qualified, the declaration is
+.IR virtual :
+the module cannot actually be used, but is available
+for typechecking and expression rewriting.
+.B Declare
+is a no-op if the module has already been declared
+with a compatible usage, otherwise an error is raised.
+The syntax of
+.I usage
+is similar to the usage messages printed by normal
+shell commands, and defines the argument types expected
+by a module. For example:
+.IP
+.EX
+declare /foo/bar '[-a] [-x string] fd string [string...] -> fd'
+.EE
+.PP
+The above declares the module
+.B bar
+from typeset
+.BR /foo ,
+which takes
+two possible options (one of which requires a single
+associated argument of type
+.BR string ),
+two mandatory arguments,
+of type
+.B fd
+and
+.B string
+respectively,
+and any number of additional arguments of
+type
+.BR string .
+The module returns a value of type
+.BR fd .
+.PP
+When first loaded,
+.I alphabet
+is lax about declaration requirements:
+if a module is referred to by its qualified name,
+and is not currently declared, the module will automatically
+be declared and used as appropriate (as long as the module
+actually exists).
+Use
+.B autodeclare
+to change this behaviour.
+.B "Autodeclare 0"
+turns off all automatic declaration: all modules used in an
+expression must have previously been declared;
+.B "autodeclare 1"
+reverts to the original behaviour.
+.PP
+Once a module is declared, it may be referred to
+by its qualified name.
+.B Import
+makes the module available under its unqualified name.
+It is an error if a module of the same name has
+already been imported from a different typeset.
+For instance:
+.IP
+.EX
+declare /read 'string -> fd'
+import /read
+.EE
+.PP
+This would declare a module named
+.B read
+from the root typeset (checking that it
+accepts a single string argument and returns a file),
+and make it available under the name
+.BR read .
+.PP
+.B Undeclare
+removes the previously declared
+.IR name .
+Note that an imported module has two names:
+its qualified name and its unqualified name.
+.PP
+.B Typeset
+loads the new typeset
+.IR qname .
+Typesets are hierarchical in the same
+way that types and modules are: a typeset adds some
+types to its parent typeset, and has an associated set of
+modules that provide transformations between those types
+and between those of its parent.
+.PP
+.B Autoconvert
+specifies an automatic conversion between
+.I srctype
+and
+.IR dsttype ,
+i.e. whereever a module expects an argument
+of type
+.IR dsttype ,
+and the argument is actually of type
+.IR srctype ,
+the module block (see below for definition)
+.I expr
+(which must be compatible with type
+.IB srctype -> dsttype\fR),
+will be invoked to convert between the two.
+Several conversions will be applied
+atop one another if necessary.
+It is an error if adding the auto-conversion
+creates an ambiguous conversion path
+between two types.
+As a convenience,
+.I expr
+may simply be the name of a module,
+in which case the expression will be rewritten as
+its identity module block: \f5{(\fIsrctype\fP); \fIexpr\fP}\fR.
+.PP
+The
+.B -
+command evaluates the
+.I alphabet
+.IR expression ,
+of the form:
+.IP
+.EX
+{\fIcommand arg\fR...\f5}
+.EE
+.PP
+Usually,
+.I command
+is the name of a previously declared module,
+which must also have been imported if it is not a qualified name.
+The arguments must conform to those expected by
+the module. Each argument is either a literal string or shell-command,
+as described earlier, or a subexpression of the same form as above.
+All subexpressions are evaluated fully before
+.I command
+is invoked.
+The result of the outermost expression must be convertible to the type
+.BR /status ;
+the shell status of the
+.B -
+command will reflect this when the command has completed.
+.PP
+As a convenience,
+.I alphabet
+provides a pipe-like syntax. It will rewrite any expression of the
+form \fIm1 m1args\f5|\fIm2 m2args\fR
+as \fIm2 \f5{\fIm1 m1args\f5}\fIm2args\fR.
+This occurs before any auto-conversions have been applied.
+.PP
+.I Command
+may also be a
+.IR "module block" ,
+of the form:
+.IP
+.EX
+{(\fIargtype\fR...\f5); \fIcommand arg\fR...\f5}
+.EE
+.PP
+The
+.I argtype
+values given in the brackets
+specify the types of the arguments expected by the module block;
+these can be referred to in the arguments to
+.I command
+(and subexpressions thereof) with values of the form
+.BR $1 ,
+.BR $2 ,
+etc.
+For instance,
+.IP
+.EX
+{(/string); echo $1} hello}
+.EE
+.PP
+is exactly equivalent to:
+.IP
+.EX
+{echo hello}
+.EE
+.PP
+In a module block with no arguments, the argument declaration
+section may be omitted.
+.PP
+.B Define
+defines a new module in terms of previously declared
+modules.
+.I Name
+(which must be an unqualified name)
+gives the name of the
+module to define, and
+.I expr
+is a module block giving the expression to evaluate when
+.I name
+is used. The usage of the module is taken from the types declared
+in the module block; its return type is inferred from the return type
+of
+.IR expr .
+All modules used in the evaluation of
+.I expr
+are evaluated when the definition takes place, so evaluation of
+.I name
+is unaffected if any modules it uses are later undeclared.
+.PP
+To show the complete form of an expression, after pipe
+transformations and auto-conversions have been applied, and
+module definitions expanded, use
+.BR ${rewrite} ,
+which returns the expression's canonical form
+without actually executing it.
+If
+.I dsttype
+is given, auto-conversions will be applied to try to
+convert the result of
+.I expression
+to
+.IR dsttype .
+.B Rewrite
+raises an error if it finds any declarations incompatible with
+.IR expression
+or if the final type cannot be converted successfully.
+.PP
+.I Alphabet
+also provides some shell operations that give information
+on its current state:
+.B ${modules}
+yields a list of all the currently declared module names
+(including entries for both qualified and unqualified names);
+.B ${types}
+yields a list of all currently available types
+(giving only the types in
+.I typeset
+if specified);
+and
+.B ${usage}
+provides usage information on module
+.IR qname ,
+which need not be declared.
+Additionally,
+.B info
+searches the module directories on all currently loaded typesets,
+and prints usage information for everything it can find there,
+along with information on all currently installed auto-conversions.
+.PP
+Finally,
+.B clear
+clears all existing declarations and definitions, and starts again
+with a clean slate.
+.SH EXAMPLE
+.EX
+load alphabet
+type /string
+type /fd
+type /status
+import /cat /filter
+autoconvert string fd /read
+autoconvert fd status {(fd); /print $1 1}
+define wc {(fd); /filter $1 "{wc}}
+- {cat /lib/polyhedra /dis/sh.dis | wc}
+echo ${rewrite {cat /lib/polyhedra /dis/sh.dis | wc} status}
+.EE
+.SH SOURCE
+.B /appl/alphabet/*.b
+.br
+.B /appl/alphabet/*/*.b
+.SH BUGS
+.I Alphabet
+expressions involving external typesets and file descriptors cannot have
+their I/O
+redirected at the shell level. Unfortunately it is not possible
+to provide a diagnostic when this occurs.
+.SH SEE ALSO
+.IR sh (1),
+.IR alphabet (2),
+.IR alphabet-main (1),
+.IR alphabet-fs (1),
+.IR alphabet-grid (1)
--- /dev/null
+++ b/man/1/sh-arg
@@ -1,0 +1,129 @@
+.TH SH-ARG 1
+.SH NAME
+arg \- shell command-line argument parsing
+.SH SYNOPSIS
+.B load arg
+.br
+.B arg
+[
+.I opts command
+]...
+.B -
+.I args
+.SH DESCRIPTION
+.I Arg
+is a loadable module for
+.IR sh (1)
+that parses command-line arguments in the same
+form as
+.IR arg (2).
+It accepts a list of
+.RI ( opts ,\ command )
+pairs, where
+each character in
+.I opts
+is an acceptable option, and
+.I command
+is a shell command to be run if any character
+in
+.I opts
+is found.
+Any trailing plus
+.RB ( + )
+characters in
+.I opts
+cause
+.I arg
+to extract the same number of arguments associated
+with the option before running
+.IR command .
+
+For the duration of
+.IR command ,
+the environment variable
+.B $opt
+will be set to the option that has been found,
+and
+.B $arg
+will be set to the option's arguments (if the correct number
+of arguments have been extracted;
+otherwise a message will be printed, and a
+.B usage
+exception raised).
+The option character asterisk
+.RB ( * )
+matches any option letter (this must
+be quoted, to avoid the usual special interpretation
+by the shell).
+Only one command will be run for any option found;
+if there is no matching option letter, then
+a default error message will be printed, and a
+.B usage
+exception raised.
+.PP
+The list of option specifications is terminated with a single
+minus
+.RB ( - );
+the arguments to be parsed follow this.
+When the argument parsing has finished
+the environment variable
+.B $*
+is set to the remaining list of arguments.
+.SH EXAMPLE
+The following shell script,
+.BR script ,
+takes options
+.BR b ,
+.B c
+and
+.BR f ,
+where
+.B f
+takes a file name argument.
+.EX
+#!/dis/sh
+load arg
+bflag := cflag := 0
+file := ()
+args := $*
+(arg
+ bc {$opt^flag = 1}
+ f+ {file=$arg}
+ r++++ {rect=$arg}
+ '*' {echo unknown option $opt}
+ - $args
+)
+echo $0 $bflag $cflag $file
+echo rect $rect
+echo arguments are $*
+.EE
+.PP
+When invoked as follows:
+.IP
+.B "script -bc -r 0 10 50 100 -ffile a b c"
+.PP
+the output is:
+.IP
+.EX
+\&./script 1 1 file
+rect 0 10 50 100
+arguments are a b c
+.EE
+.PP
+and when invoked by:
+.IP
+.B "script -b -f file -z -- -bc"
+.PP
+the output is:
+.IP
+.EX
+unknown option z
+\&./script 1 0 file
+arguments are -bc
+.EE
+.SH SOURCE
+.B /appl/cmd/sh/arg.b
+.SH SEE ALSO
+.IR sh (1),
+.IR arg (2),
+.IR sh-std (1)
--- /dev/null
+++ b/man/1/sh-csv
@@ -1,0 +1,66 @@
+.TH SH-CSV 1
+.SH NAME
+csv, getcsv \- parse ``comma-separated values''
+.SH SYNOPSIS
+.B load csv
+
+.B getcsv
+.I command
+.br
+.B ${csv
+.IB list }
+.br
+
+.SH DESCRIPTION
+.B Csv
+is a loadable module for
+.IR sh (1)
+that provides the facility to parse and generate
+``comma-separated value'' lists, a widely used
+data exchange format.
+Data in this format is usually in the form of a table,
+each row of which contains one or more items,
+each separated by a comma
+.RB ( , ).
+Items that contain
+a comma or a newline are surrounded with double-quotes
+(\f5"\fP).
+A double-quote within an item is represented by a pair
+of double-quotes.
+Two primitives are provided:
+.TP 10
+.B getcsv
+.B Getcsv
+works similiarly to
+.B getlines
+in
+.IR sh-std (1).
+It reads from the standard input, and for every line read,
+invokes
+.I command
+with
+.B $line
+set to the items found on that line (one element per item).
+.B Getcsv
+recognises the usual loop
+.B break
+and
+.B continue
+exceptions.
+.TP
+.B ${csv}
+.B Csv
+yields a single element containing all the items in
+.IR list ,
+comma-separated and quoted as necessary.
+.SH SOURCE
+.B /appl/cmd/sh/csv.b
+.SH SEE ALSO
+.IR sh (1),
+.IR sh-std (1)
+.SH BUGS
+Empty lines are ambiguous:
+.B csv
+treats an empty line as containing a single,
+empty element; there is thus no way of
+representing a line containing no elements at all.
--- /dev/null
+++ b/man/1/sh-expr
@@ -1,0 +1,188 @@
+.TH SH-EXPR 1
+.SH NAME
+expr, ntest, mpexpr \- shell module for simple arithmetic.
+.SH SYNOPSIS
+.B load expr
+OR
+.B load mpexpr
+
+.B ${expr
+[
+-r
+.I radix
+]
+[
+.I arg...
+]
+.B }
+.br
+.B ntest
+.I num
+.br
+.SH DESCRIPTION
+.I Expr
+and
+.I mpexpr
+are loadable modules for
+.IR sh (1)
+that provide support for integer arithmetic.
+.I Expr
+uses 64-bit signed integers;
+.I mpexpr
+uses arbitrary-precision signed integers.
+They each provide the same interface:
+a command
+.IR ntest ,
+which performs a simple boolean test
+on its integer argument, and the
+substitution operator
+.IR expr ,
+which takes an expression in Reverse Polish
+notation, and yields its result.
+.PP
+.I Ntest
+returns true if its argument
+.I num
+is non-zero,
+and false otherwise.
+.PP
+.I Expr
+evaluates each
+.I arg
+in turn; if it is an integer it gets pushed onto
+the stack; otherwise it should name
+one of the operators below, whereupon
+the appropriate number of operands are
+popped off the stack, evaluated as arguments
+to the operator, and the result pushed back onto
+the stack. Arguments are passed to the operator
+first-pushed first, so, for instance,
+.B ${expr 2 1 -}
+yields 1, not -1.
+Alternative names are given for some operators;
+this is to avoid the necessity of quoting operators
+that contain
+.IR sh (1)
+metacharacters. Integers are given in the same form acceptable
+to Limbo. The relational operators yield either
+1 (true) or 0 (false). If the
+.B -r
+option is given,
+.I radix
+specifies an output base for printed numbers.
+It may be from 2 to 36;
+.I mpexpr
+also allows 64 to specify base64 notation.
+Numbers are printed in a form suitable for re-interpretation
+by
+.IR expr .
+.PP
+When all its arguments have been evaluated,
+.B expr
+yields all the values remaining on its stack, first pushed
+first. Note that bitwise operators treat their operands as if they
+were stored in two's complement form. The operators supported by expr are as follows (the number
+of operands required in is given parentheses).
+.TP 15
+.BR + \ (2)
+Addition
+.TP
+.BR - \ (2)
+Subtraction
+.TP
+.BR x ,\ * \ (2)
+Multiplication
+.TP
+.BR / \ (2)
+Division. Division by zero raises a
+.B divide by zero
+exception.
+.TP
+.BR % \ (2)
+Modulus. A zero modulus will cause a
+.B divide by zero
+exception to be raised.
+.TP
+.BR and \ (2)
+Bitwise-and.
+.TP
+.BR or \ (2)
+Bitwise-or.
+.TP
+.BR xor \ (2)
+Bitwise-xor.
+.TP
+.BR ~ \ (1)
+Bitwise-complement..
+.TP
+.BR _ \ (1)
+Unary minus.
+.TP
+.BR << ,\ shl \ (2)
+Shift left.
+.TP
+.BR >> ,\ shr \ (2)
+Shift right.
+.TP
+.BR = ", " == ", " eq " (2)"
+Equality.
+.TP
+.BR != ", " neq " (2)"
+Inequality.
+.TP
+.BR > ", " gt " (2)"
+Greater than.
+.TP
+.BR < ", " lt " (2)"
+Less than.
+.TP
+.BR <= ", " le " (2)"
+Less than or equal to.
+.TP
+.BR >= ", " ge " (2)"
+Greater than or equal to.
+.TP
+.BR ! ", " not " (1)"
+Logical negation.
+.TP
+.BI rep \ \f1(\fPn\f1)\fP
+.B Rep
+repeats the last operation (which must
+have been a two-operand operation other
+than
+.BR seq )
+until the values in the stack are exhausted.
+.TP
+.BR seq \ (2)
+.B Seq
+pushes on the stack a sequence of numbers ranging
+numerically from its first argument up to and including
+its second argument. If its second argument is
+less than its first, the sequence will descend.
+.TP
+.BR rand \ (1)
+(\fImpexpr\fP only). Push a secure random number;
+the argument value gives the size of the number, in bits.
+.TP
+.BR bits \ (1)
+(\fImpexpr\fP only). Push the size, in bits, of the argument.
+.TP
+.BR expmod ", " invert " (2)"
+(\fImpexpr\fP only). See
+.IR keyring-ipint (2).
+.TP
+.BR exp ", " xx ", " **
+(\fImpexpr\fP only). Exponentiation.
+.SH SOURCE
+.B /appl/cmd/sh/expr.b
+.SH SEE ALSO
+.IR sh (1),
+.IR sh-std (1),
+.IR sh-tk (1),
+.IR keyring-ipint (2)
+.SH BUGS
+Postfix notation can be confusing.
+Any operators that contain shell metacharacters (e.g. ``*'', ``>'')
+must be quoted to avoid interpretation by the shell.
+Base64 notation can contain # characters, which need
+quoting to avoid interpretation by the shell.
--- /dev/null
+++ b/man/1/sh-file2chan
@@ -1,0 +1,263 @@
+.TH SH-FILE2CHAN 1
+.SH NAME
+file2chan, rblock, rdata, rerror, rget, rread, rreadone, rwrite \- shell interface to file2chan
+.SH SYNOPSIS
+.B load file2chan
+
+.B file2chan
+.I filename
+.I readcmd writecmd
+[
+.I closecmd
+]
+.br
+.B rblock
+[
+.I tag
+]
+.br
+.B fetchwdata
+[
+.I tag
+]
+.br
+.B putrdata
+[
+.I tag
+]
+.br
+.B rerror
+[
+.I tag
+]
+.I errmsg
+.br
+.B rread
+[
+.I tag
+]
+.I readdata
+.br
+.B rreadone
+[
+.I tag
+]
+.I readdata
+.br
+.B rwrite
+[
+.I tag
+[
+.I count
+] ]
+.br
+.B ${rget
+.RB ( data\fP|\fPcount\fP|\fPoffset\fP|\fPfid )
+[
+.I tag
+]
+.B }
+.br
+.SH DESCRIPTION
+.I File2chan
+is a loadable module for
+.IR sh (1)
+that provides facilities to create a file in the namespace
+with properties determined by a shell script.
+.B File2chan
+creates
+.I filename
+in the namespace and spawns a new thread to serve the file.
+If the creation succeeds and the thread is spawned successfully,
+then the environment variable
+.B $apid
+is set to the process id of the new thread; otherwise an error (non-nil)
+status is returned.
+.IR Readcmd ,
+.IR writecmd
+and
+.I closecmd
+should be
+executable
+.IR sh (1)
+command blocks.
+Subsequently, whenever a process reads from
+.IR filename ,
+.I readcmd
+will be invoked; whenever a process writes
+to
+.IR filename ,
+.I writecmd
+will be invoked; whenever an open file on
+.I filename
+is closed, then
+.I closecmd
+will be invoked, if present.
+.PP
+When a read or write request arrives,
+it is added to a list of currently outstanding
+.I tags
+maintained by
+.IR file2chan .
+If the request is not replied to or acknowledged by the time
+the invoked command has finished, then a reply
+will be made automatically (the default is to accept
+all writes and to give an error on all reads).
+Each tag is assigned a unique
+.I tag id
+which is stored in the environment variable
+.B $tag
+for the duration of the invoked command.
+Most commands take an optional
+.I tag
+argument which should be the
+.I tag id
+of a currently outstanding request; if omitted,
+the value of
+.B $tag
+will be used.
+The following commands are provided to reply to requests
+and obtain information about requests:
+.TP 10
+.B rblock
+.B Rblock
+marks
+.I tag
+as a blocking request - no automatic reply will be made when
+the currently invoked command has terminated; the
+process making the request will block until a reply is made.
+.TP
+.B fetchwdata
+.B Fetchwdata
+writes the data associated with
+.I tag
+(which must be a write request) to its standard output.
+It is useful if an uncorrupted version of binary data is
+wanted, as it avoids the data being interpreted as a utf-8
+string.
+.TP
+.B putrdata
+.B Putrdata
+is the converse of
+.BR fetchwdata :
+it reads data from its standard input and replies to
+.I tag
+(which must be a read request) with the data read.
+Any data in excess of that requested will be lost.
+.TP
+.B rerror
+.B Rerror
+replies to
+.I tag
+with an error code; the remote read
+or write request will return an
+error, with the description
+.IR errmsg .
+.TP
+.B rread
+.B Rread
+replies to the read request
+.I tag
+with the data in
+.IR readdata .
+If
+.I readdata
+is longer than the number of bytes requested,
+then only the requested number of bytes of
+.I readdata
+will
+be sent. The offset of the read request is ignored.
+.TP
+.B rreadone
+.B Rreadone
+is similar to
+.B rread
+except that it honours the offset of the client's
+read request, so the client can use consecutive
+reads to retrieve all of
+.IR readdata .
+.TP
+.B rwrite
+.B Rwrite
+replies to the write request
+.IR tag .
+If
+.I count
+is given, then the client's write request will return
+that number (it is usually considered an error if the return
+from
+.I write
+(see
+.IR sys-read (2))
+is not the same as the number of bytes written).
+If
+.I count
+is omitted, all the bytes are assumed to have been written.
+.TP
+.B ${rget}
+.B Rget
+retrieves information associated with
+.IR tag .
+The information it yields depends on its first argument,
+which must be one of:
+.RS
+.TP
+.B data
+The data associated with write request
+.IR tag .
+.TP
+.B count
+The number of bytes requested by read request
+.IR tag .
+.TP
+.B fid
+The client's file identifier associated with
+.IR tag .
+A unique
+.I fid
+is associated with all client requests emanating from
+the same open file. This is the only
+.B rget
+request valid with the
+.I tag
+associated with a close operation.
+.TP
+.B offset
+The file offset associated with the request
+.IR tag .
+.RE
+.SH EXAMPLES
+The following code creates a very simple
+memory-based file called
+.BR /tmp/memfile .
+.EX
+ file2chan /tmp/memfile {rreadone $data} {data = ${rget data}}
+.EE
+It is, however, very limited, as binary data stored in the file
+will be corrupted, and the size of the file is limited to the amount
+of data that can be transmitted in a single write
+(see
+.IR sys-read (2)).
+.PP
+The following code implements a single-threaded logfile
+which can support multiple concurrent writers:
+.EX
+ {file2chan /chan/log {} {fetchwdata}} >> /tmp/logfile
+.EE
+.PP
+The following code makes the command
+.B cmd
+available to external programs, and defines a shell function
+to use it. Note that there's an approximate 8K limit on the size of the argument
+list that can be passed in this way.
+.EX
+ load std
+ file2chan /chan/cmdchan {} {cmd ${unquote ${rget data}}}
+ fn runcmd {echo -n ${quote $*} > /chan/cmdchan}
+.EE
+.SH SOURCE
+.B /appl/cmd/sh/file2chan.b
+.SH SEE ALSO
+.IR sys-file2chan (2),
+.IR sh (1),
+.IR intro (5),
--- /dev/null
+++ b/man/1/sh-mload
@@ -1,0 +1,68 @@
+.TH SH-MLOAD 1
+.SH NAME
+mload, munload \- namespace separation for shell modules
+.SH SYNOPSIS
+.B load mload
+
+.B mload
+.I name
+[
+.IR path ...
+]
+.br
+.B munload
+.I name
+[
+.IR path ...
+]
+.br
+.SH DESCRIPTION
+.I Mload
+is a loadable module for
+.IR sh (1)
+that allows the simultaneous use of shell modules with
+potentially clashing command name spaces.
+.B Mload
+creates a new namespace
+.I name
+and loads each
+.I path
+as a builtin module in the same way as
+.B load
+(see
+.IR sh (1)).
+Any commands or substitution builtins defined
+by the modules are accessible by giving
+the command and its arguments as arguments to
+the
+.I name
+command.
+.PP
+.B Munload
+unloads a module from the namespace
+.IR name .
+If no modules remain in the namespace,
+.I name
+is undefined as a command.
+.SH EXAMPLE
+Load
+.I mpexpr
+in a different namespace from
+.I expr
+(see
+.IR sh-expr (1)):
+.EX
+load expr
+mload mp mpexpr
+echo ${expr 1 2 +}
+echo ${mp expr 2 300 xx}
+.EE
+.SH SOURCE
+.B /appl/cmd/sh/mload.b
+.SH SEE ALSO
+.IR sh (1),
+.SH BUGS
+Because of the way shell modules are implemented,
+the namespaces are global across all processes that
+share an instance of
+.IR mload .
--- /dev/null
+++ b/man/1/sh-regex
@@ -1,0 +1,178 @@
+.TH SH-REGEX 1
+.SH NAME
+re, match \- shell script regular expression handling
+.SH SYNOPSIS
+.B load regex
+
+.B match
+.I regex
+[
+.IR arg ...
+]
+.br
+.B ${re
+.I op
+.IR arg...
+.B }
+.br
+.SH DESCRIPTION
+.I Regex
+is a loadable module for
+.IR sh (1)
+that provides access to regular-expression
+pattern matching and substitution.
+For details of regular expression syntax in Inferno,
+see
+.IR regexp (6).
+.I Regex
+defines one builtin command,
+.BR match ,
+and one builtin substitution operator,
+.BR re .
+.B Match
+gives a false exit status if its argument
+.I regex
+fails to match any
+.IR arg .
+.B Re
+provides several operations, detailed below:
+.TP 10
+\f5${re g\fP \fIregexp\fP \fR[\fP \fIarg\fP\fR...\fP\fR]\fP\f5}\fP
+Yields a list of each
+.I arg
+that matches
+.IR regexp .
+.TP
+\f5${re v\fP \fIregexp\fP \fR[\fP \fIarg\fP\fR...\fP\fR]\fP\f5}\fP
+Yields a list of each
+.I arg
+that does not match
+.IR regexp .
+.TP
+\f5${re m\fP \fIregexp\fP \fIarg\fP\f5}\fP
+Yields the portion of
+.I arg
+that matches
+.IR regexp ,
+or an empty list if there was no match.
+.TP
+\f5${re M\fP \fIregexp\fP \fIarg\fP\f5}\fP
+Yields a list consisting of the portion
+of
+.I arg
+that matches
+.IR regexp ,
+followed by list elements giving the portion
+of
+.I arg
+that matched each parenthesized subexpression
+in turn.
+.TP
+\f5${re mg\fP \fIregexp\fP \fIarg\fP\f5}\fP
+Similar to
+.B re m
+except that it applies the match consecutively
+through
+.IR arg ,
+yielding a list of all the portions of
+.I arg
+that match
+.IR regexp .
+If a match is made to the null string,
+no subsequent substitutions will take place.
+.TP
+\f5${re s\fP \fIregexp\fP \fIsubs\fP [ \fIarg\fP... ]\f5}\fP
+For each
+.IR arg ,
+.B re s
+substitutes the first occurrence of
+.I regexp
+(if any) by
+.IR subs .
+If
+.I subs
+contains a sequence of the form
+.BI \e d
+where
+.I d
+is a single decimal digit,
+the
+.IR d th
+parenthesised subexpression in
+.I regexp
+will be substituted in its place.
+.B \e0
+is substituted by the entire match.
+If any other character follows a
+backslash
+.RB ( \e ),
+that character will be substituted.
+Arguments which contain no match to
+.I regexp
+will be left unchanged.
+.TP
+\f5${re sg\fP \fIregexp\fP \fIsubs\fP [ \fIarg\fP... ]\f5}\fP
+Similar to
+.B re s
+except that all matches of
+.I regexp
+within each
+.I arg
+will be substituted for, rather than just the
+first match. Only one occurrence of the null string is
+substituted.
+.PP
+.SH EXAMPLES
+List all files in the current directory that
+end in
+.B .dis
+or
+.BR .sbl :
+.EX
+ ls -l ${re g '\e.(sbl|dis)$' *}
+.EE
+.PP
+Break
+.I string
+up into its constituent characters,
+putting the result in shell variable
+.BR x :
+.EX
+ x = ${re mg '.|\en' \fIstring\fP}
+.EE
+.PP
+Quote a string
+.B s
+so that it can be used as
+a literal regular expression without worrying
+about metacharacters:
+.EX
+ s = ${re sg '[*|[\e\e+.^$()?]' '\e\e\e0' $s}
+.EE
+.PP
+Define a substitution function
+.B pat2regexp
+to convert shell-style
+patterns into equivalent regular expressions
+(e.g.
+.RB `` ?.sbl* ''
+would become
+.RB `` ^.\e.sbl.*$ ''):
+.EX
+ load std
+ subfn pat2regexp {
+ result = '^' ^ ${re sg '\e*' '.*'
+ ${re sg '\?' '.'
+ ${re sg '[()+\e\e.^$|]' '\e\e\e0' $*}
+ }
+ } ^ '$'
+ }
+.EE
+.SH SOURCE
+.B /appl/cmd/sh/regex.b
+.SH SEE ALSO
+.IR regexp (6),
+.IR regex (2),
+.IR sh (1),
+.IR string (2),
+.IR sh-std (1)
--- /dev/null
+++ b/man/1/sh-sexprs
@@ -1,0 +1,131 @@
+.TH SH-SEXPRS 1
+.SH NAME
+sexprs, islist, els, text, textels, mktext, mklist, mktextlist \- parse and generate S-expressions
+.SH SYNOPSIS
+.B load sexprs
+
+.B getsexprs
+.I command
+.br
+.B islist
+.I sexpr
+.br
+.B ${els
+.IB sexpr }
+.br
+.B ${text
+.IB sexpr }
+.br
+.B ${textels
+.IB sexpr }
+.br
+.B ${mktext
+.IB val }
+.br
+.B ${mklist
+[
+.IR val ...
+.BR "" ] }
+.br
+.B ${mktextlist
+[
+.IR val ...
+.BR "" ] }
+.br
+.SH DESCRIPTION
+.B Sexprs
+is a loadable module for
+.IR sh (1)
+that provides the facility to parse and generate
+S-expressions (see
+.IR sexprs (2)).
+The following primitives are provided:
+.TP 10
+.B getsexprs
+.B Getsexprs
+works similiarly to
+.B getlines
+in
+.IR sh-std (1).
+It reads S-expressions from the standard input, and for expression read, it
+invokes
+.I command
+with
+.B $sexp
+set to the text representation of that expression.
+.B Getsexprs
+recognises the usual loop
+.B break
+and
+.B continue
+exceptions.
+.TP
+.BI islist\ sexp
+.B Islist
+yields a nil (true) status if
+.IR sexp ,
+which must be a well-formed S-expression,
+is a list element.
+.TP
+.BI ${els\ sexp }
+If
+.I sexp
+is an S-expression containing a list,
+then
+.B els
+returns a list of the S-expressions it contains.
+It is an error if
+.I sexp
+is not a valid S-expression.
+.TP
+.BI ${text\ sexp }
+If
+.I sexp
+is an S-expression containing a simple element,
+then
+.B text
+returns the value of that element. If
+.I sexp
+is a list, the return value will be an empty string.
+Note that elements
+containing binary data will likely be corrupted
+by conversion to utf-8.
+It is an error if
+.I sexp
+is not a valid S-expression.
+.TP
+.BR ${textels\ sexp }
+If
+.I sexp
+is an S-expression containing a list, then
+.B textels
+returns a list of the text values in that S-expression,
+converted as with
+.BR ${text} .
+It is an error if
+.I sexp
+is not a valid S-expression.
+.TP
+.BR ${mktext\ val }
+.B Mktext
+returns a text representation of the S-expression
+containing the simple value
+.IR val .
+.TP
+.BR ${mklist\ \fR[\fPsexp\fR...]\fP }
+.B Mklist
+returns a text representation of the S-expression list
+containing its arguments, which must be well-format
+S-expressions.
+.TP
+.BR ${mktextlist\ \fR[\fPval\fR...]\fP }
+.B Mktextlist
+returns a text representation of the S-expression list
+containing one simple element for each
+.IR val .
+.SH SOURCE
+.B /appl/cmd/sh/sexprs.b
+.SH SEE ALSO
+.IR sh (1),
+.IR sh-std (1),
+.IR sexprs (2)
--- /dev/null
+++ b/man/1/sh-std
@@ -1,0 +1,532 @@
+.TH SH-STD 1
+.SH NAME
+std, if, while, ~, no, !, apply, getlines, status, pctl, fn, and, or, raise, rescue, hd, tl, index, split, join, pid, parse, pipe, env \- standard shell builtins module.
+.SH SYNOPSIS
+.B load std
+
+.B !
+.I command
+.br
+.B ~
+.I value
+[
+.IR pattern ...
+]
+.br
+.B no
+[
+.IR arg ...
+]
+.br
+.B and
+.IR command ...
+.br
+.B apply
+.I command
+[
+.IR arg ...
+]
+.br
+.B getlines
+[
+.I separators
+]
+.I command
+.br
+.B flag
+.I f
+[
+.B +-
+]
+.br
+.B for
+.I var
+.B in
+[
+.IR arg ...
+]
+.I command
+.br
+.B fn
+.I name command
+.br
+.B if
+.I condition action
+[
+.I condition action
+]... [
+.I elseaction
+]
+.br
+.B or
+.IR command ...
+.br
+.B pctl
+.IR flag...
+.br
+.B raise
+.I name
+.br
+.B rescue
+.I pattern rescueblock command
+.br
+.B status
+.I value
+.br
+.B subfn
+.I name command
+.br
+.B while
+.I condition command
+.br
+.B ${hd
+.IB list }
+.br
+.B ${index
+.I number
+.IB list }
+.br
+.B ${pid}
+.br
+.B ${split
+[
+.I separators
+]
+.IB arg }
+.br
+.B ${join
+.I separator
+.IB list }
+.br
+.B ${tl
+.IB list }
+.br
+.B ${parse
+.IB arg ]
+.br
+.B ${pipe
+(
+.B from
+|
+.B to
+|
+.I fdnum
+)
+.IB command }
+.br
+.B ${env}
+.SH DESCRIPTION
+.B Std
+is a loadable module for
+.IR sh (1)
+that provides the equivalent of a
+``standard library'' for the shell, including
+a set of control-flow constructs and some
+other miscellaneous commands.
+In the following descriptions, if an argument is
+executed, then it should be a braced block
+suitable for executing by
+.IR sh .
+A true exit status is defined to be nil;
+any non-nil exit status is false.
+Unless otherwise stated, the return value
+of a command is that of the last command that
+it executed.
+If invalid arguments are passed to any command,
+a
+.B usage
+exception is raised, and a message printed to stderr.
+.PP
+Each of the looping commands
+.BR for ,
+.BR apply ,
+.BR while ,
+and
+.B getlines
+installs an exception handler for the duration of the
+loop to catch the exceptions
+.B break
+and
+.BR continue .
+If a
+.B break
+exception is caught, the loop is terminated; if a
+.B continue
+exception is caught, the loop will continue executing as
+usual.
+The commands are as follows:
+.TP 10
+.B !
+.B !
+inverts the exit status of a command (non-null is changed to null,
+null is changed to non-null).
+.TP
+.B ~
+.B ~
+matches
+.I value
+against each
+.I pattern
+in turn, returning true if any of them match and false otherwise.
+The patterns are of the same form as those accepted by
+the shell for filename pattern matching except that / is
+not treated specially. (see
+.IR filepat (2)).
+Patterns
+must be quoted to stop the shell from interpreting them.
+.TP
+.B no
+True if there are no arguments. Useful for testing if there are any items in a list
+without counting the items with
+.BR $# .
+.TP
+.BI and
+.B And
+evaluates each
+.I command
+in turn until one returns false.
+.TP
+.B apply
+.B Apply
+evaluates
+.I command
+once for each
+.IR arg ,
+passing it in the variable
+.BR $1 .
+.TP
+.B getlines
+.B Getlines
+reads lines from the standard input,
+executing
+.I command
+for each line, setting the environment variable
+.B $line
+to the line read, with any terminating character
+removed. If
+.I separators
+is given, a line is terminated when any character
+in
+.I separators
+is found; the default separator string
+is a single newline character.
+.TP
+.B flag
+Either set
+.RB ( + ),
+clear
+.RB ( - ),
+or test (neither
+.B +
+or
+.BR - )
+the flag
+.IR f ,
+where
+.I f
+is a single character, one of the
+command line flags to
+.I sh
+(see
+.IR sh (1)).
+.TP
+.B fn
+.B Fn
+defines a new builtin command named
+.IR name ;
+when run, this command evaluates
+.IR command .
+The command is stored in the environment
+variable
+.BI fn- name\f1;\fP
+any variables of this form found when
+when
+.B std
+is loaded will be defined in this way.
+If
+.I command
+is not given, then the builtin will be removed.
+.TP
+.B subfn
+.B Subfn
+is similar to
+.B fn
+except that it defines a new substitution builtin
+.IR name .
+When
+.I name
+is invoked, it creates a new local variable
+.B result
+and executes
+.IR command .
+The value of
+.B $result
+when
+.I command
+has terminated is the value yielded by the substitution builtin
+.IR name .
+.I Command
+is stored in and restored from the environment in a similar
+way to
+.BR fn ,
+except that
+.BI sfn- name
+is used as the name of the environment variable.
+.TP
+.B if
+.B If
+executes
+.IR condition ;
+if it returns true, then
+.I action
+is executed, otherwise each of the next
+.IR condition - action
+pairs is evaluated in the same way; if no
+.I condition
+is satisfied, then
+.I elseaction
+will be executed, if present.
+.TP
+.B for
+.B For
+is similar to
+.BR apply ;
+it runs
+.I command
+once for each
+.IR arg ,
+but it performs a local assignment of
+.I arg
+to
+.I var
+each time.
+.TP
+.B or
+.B Or
+evaluates each
+.I command
+in turn until one returns true.
+.TP
+.B pctl
+.B Pctl
+is an interface to the Inferno system call
+.IR sys-pctl (2);
+each argument specifies one bit in the bitmask
+passed to that function. The possible flags are
+.BR newfd ,
+.BR forkfd ,
+.BR newns ,
+.BR forkns ,
+.BR newpgrp
+and
+.BR nodevs .
+See
+.IR sys-pctl (2)
+for details of the meaning of these flags.
+.B Pctl
+returns true.
+.TP
+.B raise
+.B Raise
+raises the exception
+.IR name ;
+.I name
+will be truncated if it is longer than
+that allowed by
+.I raise
+(128 bytes in
+.IR utf (6)
+representation).
+Control will be transferred to the innermost
+rescue block in the same process that
+matches
+.IR name .
+If there is no rescue block in place,
+the current process will exit, yielding
+.I name
+as its exit status.
+If no
+.I name
+is given, the exception named in
+.B $exception
+is raised; if this is null, a
+.B bad raise context
+exception is raised.
+The default command prompt catches all
+exceptions.
+.TP
+.B rescue
+.B Rescue
+executes
+.I command
+with an exception handler installed for the duration
+of the call. It will catch all exceptions with a name
+matching
+.IR pattern ,
+where
+.I pattern
+is of the same form accepted by
+Limbo's
+.B exception
+handling statement.
+Specifically, the pattern is a string that matches literally,
+except that a trailing
+.RB ` * '
+character will match any sequence of characters.
+If an exception is caught,
+.B rescue
+executes
+.IR rescueblock ,
+setting
+.B $exception
+to the name of the exception raised.
+.TP
+.B status
+returns its first argument word as its exit status,
+or nil if none is given.
+.TP
+.B while
+.B While
+repeatedly executes
+.I condition
+and then
+.I action
+until
+.I condition
+does not return true.
+.TP
+.B ${env}
+.B Env
+yields a list of the names of all
+currently set non-nil environment variables.
+.TP
+.B ${hd}
+.B Hd
+yields the first of its arguments, or nil if there
+are no arguments.
+.TP
+.B ${index}
+.B Index
+yields the
+.IR n 'th
+element in its argument list, indexed from 1.
+.I N
+must be a decimal integer.
+.TP
+.B ${join}
+.B Join
+yields a single element which is the concatenation of all
+the elements in
+.I list
+separated by
+.IR separator .
+If there are no elements in
+.IR list ,
+it yields an empty string.
+The shell operator
+\f5$"\f2var\f1
+is exactly equivalent to
+.BI "${join ' ' $" var }\f1.\fP
+.TP
+.B ${parse}
+.B Parse
+parses
+.I arg
+according to the usual syntax rules, raising a
+.B parse error
+exception if it fails.
+.I Arg
+must be a well-formed command block
+surrounded by braces.
+.B Parse
+yields a functionally equivalent version
+of
+.IR arg .
+.TP
+.B ${pid}
+.B Pid
+yields the process id of the current process.
+.TP
+.B ${pipe}
+.B Pipe
+runs
+.I command
+asynchronously, with one of its file descriptors connected
+to a bidirectional pipe. The first argument to
+.B pipe
+determines which file descriptor is connected: if
+the argument is
+.BR from ,
+its standard output is connected; if the argument is
+.BR to ,
+its standard input is connected; otherwise file descriptor
+.I fdnum
+is connected.
+.B Pipe
+yields the name of a file that can be opened to access
+the other end of the pipe. Note that this command is now
+deprecated in favour of the
+.B <{}
+redirection operator built in to the shell.
+.TP
+.B ${split}
+.B Split
+splits
+.I arg
+into list elements at every point where one or
+more characters in
+.I separators
+appear. If
+.I separators
+is not given, the value of
+.B $ifs
+is used.
+.TP
+.B ${tl}
+.B Tl
+yields all but the first of its arguments,
+or nil if there are no arguments.
+.SS Syntactic considerations
+It is worth being aware of a few pitfalls that await the user of
+some of these commands. Unlike other shells, the syntax of
+.I sh
+does not include the syntax of the control flow commands,
+so it is important to be aware of the rules that govern
+the gathering of the arguments for a command.
+In particular, the following code, written to print a message
+a filename ends in
+.B .b
+will not work: it will always print ``file is Limbo source''.
+.EX
+ and
+ {~ $filename '*.b'}
+ {echo file is Limbo source}
+.EE
+This is because newlines separate shell commands, so
+the above code first invokes
+.B and
+with no arguments, and then each of the braced block
+commands on each subsequent line.
+It is usual to use round brackets in order to group together arguments
+on separate lines, e.g.
+.EX
+ and (
+ {~ $filename '*.b'}
+ {echo file is Limbo source}
+ )
+.EE
+This has the originally intended meaning.
+.SH FILES
+.TF /tmp/pipes/*
+.TP
+.B /tmp/pipe.*d
+Temporary placeholder directory for named pipes.
+.TP
+.B /tmp/pipes/*
+Mount point for named pipes.
+.SH SOURCE
+.B /appl/cmd/sh/std.b
+.SH SEE ALSO
+.IR sh (1),
+.IR sh-expr (1),
+.IR sh-tk (1)
--- /dev/null
+++ b/man/1/sh-string
@@ -1,0 +1,186 @@
+.TH SH-STRING 1
+.SH NAME
+prefix, in, splitl, splitr, drop, take, splitstrl, splitstrr, tolower, toupper, len, alen, slice \- shell script string manipulation
+.SH SYNOPSIS
+.B load string
+
+.B prefix
+.I pre s
+.br
+.B in
+.I c cl
+.br
+.B ${splitl
+.IB "s cl" }
+.br
+.B ${splitr
+.IB "s cl" }
+.br
+.B ${splitstrl
+.IB "s t" }
+.br
+.B ${splitstrr
+.IB "s t" }
+.br
+.B ${take
+.IB "s cl" }
+.br
+.B ${tolower
+.IB s }
+.br
+.B ${toupper
+.IB s }
+.br
+.B ${len
+.IB s }
+.br
+.B ${alen
+.IB s }
+.br
+.B ${slice
+.IB "start end s" }
+.br
+.B ${fields
+.IB "cl s" }
+.br
+.B ${padl
+.I n
+[
+.IR s ...
+.RB ] }
+.br
+.B ${padr
+.I n
+[
+.IR s ...
+.RB ] }
+.br
+.SH DESCRIPTION
+.I String
+is a loadable module for
+.IR sh (1)
+that provides a shell-script interface to the string
+manipulation commands found in
+.IR string (2),
+with a couple of other facilities thrown in for good
+measure. Each of the substitution builtins
+.BR splitl ,
+.BR splitr ,
+.BR drop ,
+.BR take ,
+.BR splitstrl ,
+.BR splitstrr ,
+.BR tolower ,
+and
+.BR toupper
+implements the same functionality as that provided by
+the function of the same name in
+.IR string (2).
+Where a function in the
+.IR string (2)
+module returns a tuple, the equivalent builtin yields
+a two-element list; the others yield a list with a single
+element.
+.PP
+In all
+.I string
+commands, the number of arguments provided must
+be exactly that required by the command so, for instance,
+giving an undefined variable (a zero element list) as
+an argument will cause a
+.B usage
+exception to be generated.
+.PP
+The two builtins
+.B prefix
+and
+.B in
+are again similar to their
+.IR string (2)
+counterparts - their return value is true (an empty string)
+if the equivalent
+.IR string (2)
+function would be non-zero.
+.PP
+.B Len
+returns the length of its argument
+.IR s .
+.B Alen
+returns the length of its argument
+.IR s
+when converted to a byte-array. (This will be
+different from the result of
+.B len
+when
+.I s
+contains non-ASCII characters).
+.B Slice
+is similar to the string-slicing operator in Limbo;
+it returns the section of
+.I s
+starting at index
+.I start
+and ending just before index
+.IR end .
+.I End
+may be the literal string
+.BR end ,
+in which
+.BI "${slice " start " end}"
+is the same as
+.BI "${slice " start " ${len " s "}}"\fR.\fP
+Unlike in Limbo, nothing untoward happens if
+an out-of-range slice is taken: any out of
+range indices are trimmed to within the bounds
+of
+.IR s .
+.PP
+.B Fields
+is similar to
+.B ${split}
+in
+.IR sh (1),
+but does not merge field separator characters.
+It splits
+.I s
+into fields separated by characters in class
+.IR cl ;
+if there are
+.I n
+characters matching
+.I cl
+inside
+.IR s ,
+.B fields
+will yield
+.IR n +1
+items in its result.
+.PP
+.B Padl
+and
+.B padr
+widen the string
+.I s
+to
+.I n
+characters, padding it with spaces on the
+right (for
+.BR padl )
+or the left (for
+.BR padr )
+as necessary.
+If
+.I s
+is already at least
+.I n
+characters wide, it is left unchanged.
+If several arguments are given, they
+are concatenated, separated with spaces, before
+padding takes place.
+.SH SOURCE
+.B /appl/cmd/sh/string.b
+.SH SEE ALSO
+.IR string (2),
+.IR sh (1),
+.IR sh-std (1),
+.IR sh-expr (1)
--- /dev/null
+++ b/man/1/sh-test
@@ -1,0 +1,46 @@
+.TH SH-TEST 1
+.SH NAME
+report \- shell module for test reporting.
+.SH SYNOPSIS
+.B load test
+
+.br
+.B report
+.I severity verbosity message[...]
+.br
+.SH DESCRIPTION
+.B Its
+is a loadable module for
+.IR sh (1)
+that provides a simple error reporting facility for tests which can be run
+by
+.IR itest (1) .
+It provides one command,
+.BR report ,
+which is used by a test to report a message with specified severity and verbosity.
+.I Severity
+must be one of INF, WRN, ERR or FTL for Information, warnings, errors and fatal errors
+respectively.
+.I Verbosity
+is an integer between 0 and 9.
+For informatory messages (severity INF), the message will only be
+displayed if the current
+verbosity level is greater than or equal to
+.I verbosity.
+.SH EXAMPLE
+.EX
+#!/dis/sh
+
+load std test
+
+echo 1 > /tmp/a
+echo 2 >/tmp/b
+report INF 5 testing cmp command
+if {cmp /tmp/a /tmp/b} {
+ report ERR 0 'cmp failed - reported different files as the same'
+}{
+ report INF 6 'cmp ok - reported different files as different'
+}
+.EE
+.SH SEE ALSO
+.IR itest (1)
--- /dev/null
+++ b/man/1/sh-tk
@@ -1,0 +1,281 @@
+.TH SH-TK 1
+.SH NAME
+tk, chan, send, recv, alt \- loadable tk module for sh.
+.SH SYNOPSIS
+.B load tk
+
+.B chan
+.IR name ...
+.br
+.B send
+.I chan value
+.br
+.B tk window
+.I title
+[
+.I args...
+]
+.br
+.B tk winctl
+.I winid cmd
+.br
+.B tk wintitle
+.I winid title
+.br
+.B tk namechan
+.I chan
+[
+.I name
+]
+.br
+.B tk del
+.I name
+.br
+.B tk
+.I winid tkcmd
+.br
+.B ${tk window
+.I title
+[
+.I args...
+]
+.B }
+.br
+.B ${tk onscreen
+.I winid
+[
+.I how
+]
+.B }
+.br
+.B ${tk
+.I winid tkcmd
+.B }
+.br
+.B ${recv
+.I chan
+.B }
+.br
+.B ${alt
+.I chan
+\& ...
+.B }
+.br
+.SH DESCRIPTION
+.B Tk
+is a loadable module for
+.IR sh (1)
+that provides access to Inferno Tk graphics
+and string channels.
+Most of the builtin commands that it defines map
+closely to primitives within
+.IR wmlib (2)
+and
+.IR tk (2).
+Unless otherwise stated, if a command requires
+a
+.I winid
+argument, if no window with that id is found, a
+.B bad win
+exception is raised. Similarly, a reference to
+an unknown channel name will raise a
+.B bad chan
+exception.
+There is no requirement that this module be used in
+a windowing context: although window creation will
+fail if there is no context, the channel communication
+primitives will work regardless.
+.TP 10
+.B chan
+For each
+.I name
+in turn,
+.B chan
+creates a new channel called
+.I name
+within the tk module.
+.I Name
+henceforth represents a Limbo
+.B chan
+.B of
+.B string
+and can be used to send string values between
+.I sh
+processes running in parallel. A
+.I chan
+is also used to receive events arriving from the window
+manager. It is illegal to create a channel whose name
+consists entirely of numeric digits.
+.TP
+.B send
+.B Send
+sends its argument
+.I value
+down the channel
+.IR chan ,
+blocking until a corresponding receive operation
+takes place on the channel.
+.TP
+.B tk window
+.B Tk window
+creates a new top-level window with the text of
+.I title
+in the titlebar at the top. Each window created by the
+tk module is assigned a unique numeric id. This id
+is printed by this command; to get access to the value
+of the
+.I winid
+in a script, use
+.BR "${tk window}" .
+All the remaining arguments are joined together
+by spaces and passed as the tk options for the window.
+When a window is created, a corresponding
+channel of the same name is created. Events from
+the window manager arrive on this channel, and
+should be responded to appropriately using
+.BR "tk winctl" .
+.TP
+.B tk onscreen
+.B Tk onscreen
+must be called to make window
+.I winid
+visible for the first time, the same as
+.I onscreen
+in
+.IR tkclient (2).
+.I How
+is the same as for that call - if given, it must be one of
+.BR place ,
+.BR onscreen
+or
+.BR exact .
+.BR
+.TP
+.B tk winctl
+.B Tk winctl
+is used to communicate requests to the window manager.
+(see
+.B winctl()
+in
+.IR wmlib (2)).
+If an event arriving on a window's channel is passed
+to
+.BR "tk winctl" ,
+a suitable default action will take place.
+The set of possible actions include:
+.RS
+.TP
+.B exit
+A request to close the window.
+.TP
+.B size
+A request to resize the window.
+.TP
+.B task
+A request to miniaturise the window.
+.TP
+.B move
+A request to move the window.
+.RE
+.TP
+.B tk wintitle
+.B Tk wintitle
+changes the title of the window
+.I winid
+to
+.IR title .
+.TP
+.B tk del
+.B Tk del
+deletes a channel or a window. If
+.I name
+is the
+.I winid
+of an existing window, then both the
+window and its associated channel are destroyed.
+A
+.B del
+of a non-existent channel or window is ignored.
+.TP
+.B tk namechan
+.B Tk namechan
+invokes the Tk module's
+.B namechan()
+function to give a tk name to a
+channel within the tk module.
+If
+.I name
+is omitted, then the tk name given will be
+the same as
+.IR chan .
+.TP
+.BI tk \ winid
+If
+.I winid
+is the id of an existing window, the rest of the
+arguments joined together by spaces
+and sent as a tk command to be interpreted
+in that window. If the shell is in interactive mode,
+then the string returned by tk will be printed.
+The exit status of
+.B tk
+is false if the string returned by tk begins with
+a bang
+.RB ( ! )
+character.
+.TP
+.B ${tk window}
+.B Tk window
+is the same as its command counterpart, except
+that it yields the
+.I winid
+of the newly created window rather than printing
+it.
+.TP
+.BI ${tk \ winid }
+This command is the same as its command counterpart,
+except that it yields the return value from the
+Tk command as its result.
+.TP
+.B ${recv}
+.B Recv
+receives a string value from
+.I chan
+and yields that value. It will block until a corresponding
+send operation takes place on the channel.
+.TP
+.B ${alt}
+.B Alt
+waits until a value is available on any of the
+named
+.IR chan s.
+It yields a list containing two elements,
+the name of the channel from which the value was
+received, and the actual value received.
+.SH EXAMPLE
+The following code creates a window and allows
+normal window manager operations on it. Another
+shell in a new process group is created in order to prevent
+the shell window from
+disappearing when the tk window is deleted.
+.IP
+.EX
+sh
+load std tk
+pctl newpgrp
+wid=${tk window 'My window'}
+tk onscreen $wid
+tk $wid update
+while {} {tk winctl $wid ${recv $wid}} &
+.EE
+.SH SOURCE
+.B /appl/cmd/sh/tk.b
+.SH SEE ALSO
+.IR sh (1),
+.IR sh-std (1),
+.IR sh-expr (1),
+.IR tkcmd (1),
+.IR tk (2),
+.IR tkclient (2),
+.IR wmlib (2),
+``The Tk Reference Manual''
--- /dev/null
+++ b/man/1/sleep
@@ -1,0 +1,24 @@
+.TH SLEEP 1
+.SH NAME
+sleep, pause \- suspend execution for an interval
+.SH SYNOPSIS
+.B sleep
+.I n
+.PP
+.B pause
+.SH DESCRIPTION
+.I Sleep
+suspends its own execution for
+.I n
+seconds before returning.
+.PP
+.I Pause
+never returns,
+and is typically used to stop a command
+interpreter reading any more from the standard input.
+.SH SOURCE
+.B /appl/cmd/sleep.b
+.br
+.B /appl/cmd/pause.b
+.SH "SEE ALSO"
+.IR sys-sleep (2)
--- /dev/null
+++ b/man/1/sort
@@ -1,0 +1,33 @@
+.TH SORT 1
+.SH NAME
+sort \- sort file
+.SH SYNOPSIS
+.B sort
+[
+.B -nr
+] [
+.I file
+]
+.SH DESCRIPTION
+.I Sort
+sorts the lines of
+.I file
+(default: standard input)
+and writes the sorted output to
+standard output.
+.PP
+Whole lines are sorted into increasing order, using lexicographic ordering of Unicode characters
+by default.
+The sort is stable, so that lines that compare equal will appear in the output
+in the same order as in the original file.
+The sort order is affected by the following options:
+.TP
+.B -n
+Each line is assumed to have an initial numeric string representing an integer,
+with optional plus or minus sign, and the lines
+are sorted by those numeric values into increasing order.
+.TP
+.B -r
+Reverses the sense of comparisons.
+.SH BUGS
+The entire file is read into memory to be sorted.
--- /dev/null
+++ b/man/1/spree-join
@@ -1,0 +1,45 @@
+.TH SPREE-JOIN 1
+.SH NAME
+join \- join a spree clique.
+.SH SYNOPSIS
+.B spree/join
+[
+.B -d
+.I mntdir
+] [
+.B -j
+.I joinrequest
+]
+.I name
+.SH DESCRIPTION
+When a
+.IR spree (4)
+instance has been mounted from somewhere on the
+network,
+.B join
+can be used to join a clique and fire up the appropriate
+module to perform the client-side display.
+.I Mntdir
+gives the directory where the spree
+instance is mounted (default
+.BR /n/remote );
+.I joinrequest
+gives the initial join request to be passed to the clique
+(default
+.IR join ).
+.I Name
+is the name of the clique's directory within the spree
+directory.
+.SH EXAMPLE
+When spree is started, it creates a ``lobby'' engine
+that keeps a record of what cliques have been started, who
+is a member of which, etc.
+.EX
+ spree/join 0
+.EE
+will connect to this session.
+.SH SOURCE
+.B /appl/spree/join.b
+.SH "SEE ALSO"
+.IR spree (4),
+.IR spree (2)
--- /dev/null
+++ b/man/1/stack
@@ -1,0 +1,166 @@
+.TH STACK 1
+.SH NAME
+stack, stackv \- examine call stack
+.SH SYNOPSIS
+.B "bind '#p' /prog"
+.br
+.B stack
+[
+.B -v
+]
+[
+.B -p
+.I dispath
+.I sblpath
+]...
+.I pid
+.br
+.B stackv
+[
+.B -Tlm
+] [
+.B -r
+.I maxdepth
+] [
+.I pid\fR[\f5.\fIsym\fR] ...] ...
+.SH DESCRIPTION
+.I Stack
+writes to the standard output a stack trace for process
+.IR pid ,
+by
+decoding the stack traceback data contained in the file
+.BI /prog/ pid /stack .
+The
+.B -v
+option causes
+.I stack
+to print values of arguments and variables.
+The output is most useful when the Limbo program
+was compiled with the
+.B -g
+option to produce a
+.B .sbl
+symbol file.
+.PP
+.I Stack
+has a built-in list of associations between
+.B dis
+directories and their associated source directories
+(e.g. it can automatically map from
+.B /dis/ls.dis
+to
+.BR /appl/cmd/ls.sbl ).
+Giving the
+.B -p
+option adds a new association to the head of this list:
+if a module path prefix matches
+.IR dispath ,
+.I stack
+will search for a symbol file in
+.IR sblpath .
+If the environment variable
+.B $sblpath
+is set, pairs of items from it are added to the
+association list, as given as
+.B -p
+options.
+The
+.B -p
+options take precedence over
+.BR $sblpath .
+.PP
+.I Stackv
+recursively traverses the symbols it finds, printing
+values as it goes. Repeated identical structure is not
+shown \- only the pointer value is printed, followed by
+.BR (qv) .
+Each argument gives a starting point
+for the traversal, rooted by a process id,
+.IR pid .
+If an unadorned process id is given, all values in all
+stack frames in the process will be printed; adding names
+specifies the starting point. For instance,
+.B 123.init.ctxt.display
+might specify the
+.B display
+field inside the
+.B ctxt
+adt inside the
+.B init
+function inside the process
+.BR 123 .
+.I Stackv
+understands the following options:
+.TP 10
+.B -l
+Show source line information with each item.
+.TP
+.B -m
+Show module variables accessible from each stack frame.
+.TP
+.B -T
+Do not show the Limbo types of value encountered.
+.TP
+.BI -r \ maxdepth
+Restrict the maximum traversal depth to
+.I maxdepth
+levels.
+.SH EXAMPLE
+Run
+.I stack
+on process with ID 1:
+.IP
+.EX
+$ stack 1
+unknown fn() Module $Sys PC 742103
+waitfor() shnew.b:105.7, 38
+runpipeline() shnew.b:483.2, 14
+runit() shnew.b:552.3, 29
+init() shnew.b:83.3, 28
+.EE
+.PP
+The process is executing in the
+.B Sys
+module, a call to
+.B sys->read
+that originated at line 105 (characters 7 to 38) of the
+.B waitfor
+function in
+.BR shnew.b .
+.PP
+Once again, with the
+.B -v
+option to reveal more:
+.IP
+.EX
+$ stack -v 1
+unknown fn() Module $Sys PC 742103
+waitfor(pid=18) shnew.b:105.7, 38
+ status=[0] ""
+ buf=[64] @b419a4
+ n=-1
+ who=-1
+runpipeline(ctx=nil, pipeline=@b41454) shnew.b:483.2, 14
+ pid=18
+runit(ctx=nil, pipes=nil) shnew.b:552.3, 29
+ pipeline=@b41454
+init(ctxt=nil, argv=nil) shnew.b:83.3, 28
+ buf=[1024] @b40f04
+ n=4
+ arg=@b41634
+ prompt=[21] "$ "
+$
+.EE
+.SH FILES
+.BI /prog/ pid /stack
+.br
+.BI /prog/ pid /status
+.SH SOURCE
+.B /appl/cmd/stack.b
+.br
+.B /appl/cmd/stackv.b
+.SH "SEE ALSO"
+.IR deb (1),
+.IR ps (1),
+.IR prog (3),
+.IR debug (2)
--- /dev/null
+++ b/man/1/stream
@@ -1,0 +1,54 @@
+.TH STREAM 1
+.SH NAME
+stream \- stream data between source and sink
+.SH SYNOPSIS
+.B stream
+.RB [ \-a ]
+.RB [ \-b
+.IR bufsize ]
+.I file1
+[
+.I file2
+]
+.SH DESCRIPTION
+.I Stream
+creates a process that uses
+.I stream
+(see
+.IR sys-read (2))
+to stream data in chunks of at most
+.I bufsize
+bytes (default:
+.LR Sys->ATOMICIO ,
+or 8192 bytes) from
+.I file1
+to the standard output.
+If
+.I file2
+is provided,
+the two files are instead cross-connected by two streaming processes:
+one process streams data from
+.I file1
+to
+.IR file2 ,
+and the other streams data from
+.I file2
+to
+.IR file1 .
+In all cases,
+.I stream
+writes data to the destination file in full buffers of
+.I bufsize
+bytes.
+.PP
+.I Stream
+waits for all streaming processes to stop before returning,
+unless the
+.B -a
+(asynchronous) option is given, which causes it to
+return after spawning the streamers.
+.SH SOURCE
+.B /appl/cmd/stream.b
+.SH SEE ALSO
+.IR cat (1),
+.IR sys-read (2)
--- /dev/null
+++ b/man/1/strings
@@ -1,0 +1,27 @@
+.TH STRINGS 1
+.SH NAME
+strings \- extract printable strings
+.SH SYNOPSIS
+.B strings
+[
+.I file ...
+]
+.SH DESCRIPTION
+.I Strings
+finds and prints strings containing 6 or more
+consecutive printable UTF-encoded characters
+in a (typically) binary file, default
+standard input.
+Printable characters are taken to be
+.SM ASCII
+characters from blank through tilde (hexadecimal 20 through 7E), inclusive,
+and
+all other characters from value 00A0 to FFFF.
+Strings reports
+the decimal offset within the file at which the string starts and the text
+of the string. If the string is longer than 70 runes the line is
+terminated by three dots and the printing is resumed on the next
+line with the offset of the continuation line.
+.SH SOURCE
+.B /appl/cmd/strings.b
+
--- /dev/null
+++ b/man/1/sum
@@ -1,0 +1,47 @@
+.TH SUM 1
+.SH NAME
+sum, md5sum, sha1sum \- calculate file's checksum
+.SH SYNOPSIS
+.B sum
+.IR file " ..."
+.PP
+.B md5sum
+[
+.I file " ..."
+]
+.SH DESCRIPTION
+.I Sum
+prints the 32-bit checksum (actually a CRC), length in bytes, and name of each
+.IR file ,
+one per line.
+It ignores directories.
+.PP
+.I Md5sum
+prints the MD5 message digest (as 32 hexadecimal digits) and the name of each
+.IR file ,
+separated by a tab,
+one per line.
+If no files are given, the standard input is read.
+.PP
+.I Sha1sum
+is similar, but uses the US National Institute of Standards and Technology's secure
+hash algorithm SHA1 instead of MD5.
+For each
+.IR file ,
+it prints its SHA1 secure hash (as 40 hexadecimal digits) and the file's name,
+separated by a tab,
+one per line.
+If no files are given,
+.I sha1sum
+reads the standard input.
+.SH SOURCE
+.B /appl/cmd/sum.b
+.br
+.B /appl/cmd/md5sum.b
+.br
+.B /appl/cmd/sha1sum.b
+.SH SEE ALSO
+.IR cmp (1),
+.IR wc (1),
+.IR crc (2),
+.IR keyring-sha (2)
--- /dev/null
+++ b/man/1/tail
@@ -1,0 +1,79 @@
+.TH TAIL 1
+.SH NAME
+tail \- deliver the last part of a file
+.SH SYNOPSIS
+.B tail
+[
+.RB [\f5+-\fP] \fInumber\fP [\f5lbc\fP][ rf ]
+]
+[
+.I file
+]
+.PP
+.B tail
+[
+.B -fr
+]
+[
+.B -n
+.I nlines
+]
+[
+.B -c
+.I ncharacters
+]
+[
+.I file
+]
+.SH DESCRIPTION
+.I Tail
+copies the named file to the standard output beginning
+at a designated place.
+If no file is named, the standard input is copied.
+.PP
+Copying begins at position
+.BI + number
+measured from the beginning, or
+.BI - number
+from the end of the input.
+.I Number
+is counted in lines, 1K blocks or characters,
+according to the appended flag
+.LR l ,
+.LR b ,
+or
+.LR c .
+Default is
+.B -10l
+(ten ell).
+.PP
+The further flag
+.L r
+causes tail to print lines from the end of the file in reverse order;
+.L f
+(follow) causes
+.I tail,
+after printing to the end, to keep watch and
+print further data as it appears.
+.PP
+The second syntax is that promulgated by POSIX, where the
+numbers of lines (-n) or characters (-c) are specified separately as signed
+integers. Note than an unsigned value is treated as negative,
+ie '-n 2' is equivalent to '-n -2'.
+.PP
+.SH EXAMPLES
+.TP
+.B tail file
+Print the last 10 lines of a file.
+.TP
+.B tail +0f file
+Print a file, and continue to watch
+data accumulate as it grows.
+.br
+According to custom, option
+.BI + number
+counts lines from 1, and counts
+blocks and characters from 0.
+.TP
+.B tail -nlines +3 file
+Print a file starting at line number 3
--- /dev/null
+++ b/man/1/tcs
@@ -1,0 +1,67 @@
+.TH TCS 1
+.SH NAME
+tcs \- translate character sets
+.SH SYNOPSIS
+.B tcs
+.B -l
+.RB [ -v ]
+[
+.I csname
+]
+.PP
+.B tcs
+[
+.B -f
+.I ics
+] [
+.B -t
+.I ocs
+] [
+.I file ...
+]
+.SH DESCRIPTION
+.I Tcs
+converts its input from the
+.I ics
+character set encoding into Unicode runes and then outputs the data in the
+encoding of the
+.I ocs
+character set.
+The default values of
+.I ics
+and
+.I ocs
+are both
+.BR utf8 .
+This is the standard Inferno Unicode text encoding as described by
+.IR utf (6).
+If no files are specified
+.I tcs
+reads from its standard input.
+.PP
+The
+.B -l
+option causes
+.I tcs
+to output the list of character sets that it understands.
+The
+.B -v
+option causes a more detailed listing to be given.
+Giving a
+.I csname
+argument to the
+.B -l
+option causes
+.I tcs
+to list the known aliases for that name.
+The first name in the list is the standard (or preferred) name.
+.SH FILES
+.TF /lib/convcs/charsets
+.TP
+.B /lib/convcs/charsets
+Specifies the supported character set names, their aliases and the implementation
+of their converters.
+.SH SOURCE
+/appl/cmd/tcs.b
+.SH SEE ALSO
+.IR convcs (2)
--- /dev/null
+++ b/man/1/tee
@@ -1,0 +1,30 @@
+.TH TEE 1
+.SH NAME
+tee \- pipe fitting
+.SH SYNOPSIS
+.B tee
+[
+.B \-a
+]
+[
+.I file
+\&...
+]
+.SH DESCRIPTION
+.I Tee
+reads the standard input and writes a copy of each block read
+to each
+.I file
+in turn, and then to the standard output.
+Normally
+.I tee
+rewrites each
+.IR file ;
+the
+.B \-a
+option causes data to be appended instead.
+.SH SOURCE
+.B /appl/cmd/tee.b
+.SH SEE ALSO
+.IR cat (1),
+.IR tail (1)
--- /dev/null
+++ b/man/1/telnet
@@ -1,0 +1,35 @@
+.TH TELNET 1
+.SH NAME
+telnet \- make a remote telnet connection
+.SH SYNOPSIS
+.B telnet
+.I machine
+.SH DESCRIPTION
+.B Telnet
+uses the Telnet protocol to talk to a remote
+.IR machine ,
+addressed using any form acceptable to
+.IR dial (2):
+.IB net ! host ! port
+in general.
+The default
+.I net
+is
+.BR tcp ,
+and the default
+.I port
+is 23, the standard Telnet login port.
+.PP
+.I Telnet
+connects to the given
+.I machine
+and interprets the Telnet protocol.
+It reads data from its standard input
+and sends it to the remote machine, and
+copies to the standard output the data it receives from the remote machine.
+.SH SOURCE
+.B /appl/cmd/telnet.b
+.SH SEE ALSO
+.IR cpu (1)
+.br
+``Telnet protocol specification'', RFC854 (1 May 1983) and related RFCs.
--- /dev/null
+++ b/man/1/time
@@ -1,0 +1,34 @@
+.TH TIME 1
+.SH NAME
+time \- time command execution
+.SH SYNOPSIS
+.B time
+.I command
+[
+.I arg ...
+]
+.SH DESCRIPTION
+.I Time
+executes the
+.I command
+with the given arguments, and reports on standard error the command's
+load time, real time for execution, and the total, in seconds.
+The load time
+is just the time for
+.I time
+itself to load
+.IR command ;
+loads done later by the command are included in the real time.
+To time a pipeline, use the
+.B -c
+option to
+.IR sh (1):
+.IP
+.B "time sh -c 'ps | grep Sh'"
+.SH SOURCE
+.B /appl/cmd/time.b
+.SH "SEE ALSO"
+.IR sh (1),
+.IR sys-millisec (2)
+.SH BUGS
+There is no way to measure CPU time (real or virtual) used by a command.
--- /dev/null
+++ b/man/1/timestamp
@@ -1,0 +1,36 @@
+.TH TIMESTAMP 1
+.SH NAME
+timestamp \- log event times
+.SH SYNOPSIS
+.B timestamp
+[
+.I tag
+]
+.SH DESCRIPTION
+.I Timestamp
+reads lines from its standard input and writes them to its
+standard output, prefixing each line with the time that
+it was written, in decimal milliseconds since
+.I timestamp
+was started. If
+.I tag
+is given, it is written along with the time stamp on each line,
+to enable tagging if several writers are each writing
+to the same log file.
+.PP
+The first line written gives the time that
+.I timestamp
+was started, in milliseconds since the epoch.
+Note that logging events can cause timings to change,
+and that the timestamps are only as accurate as the
+times reported by
+.BR /dev/time .
+.SH SOURCE
+.B /appl/cmd/timestamp.b
+.SH EXAMPLE
+.EX
+% {echo hello; sleep 1; echo goodbye} | timestamp eg
+0000000000 eg start 1080156139468
+0000000007 eg hello
+0000000988 eg goodbye
+.EE
--- /dev/null
+++ b/man/1/tiny
@@ -1,0 +1,259 @@
+.TH TINY 1
+.SH NAME
+tiny: sh, broke, kill, rm \- reduced command line interface to the Inferno system
+.SH SYNOPSIS
+.B tiny/sh
+[
+.B -n
+] [
+.BI -c command
+] [
+.I file
+]
+.PP
+.B tiny/broke
+.PP
+.B tiny/kill
+[
+.B -g
+]
+[
+.I pid ...
+]
+[
+.I module ...
+]
+.PP
+.B tiny/rm
+[
+.I file
+\&...
+]
+.SH DESCRIPTION
+The
+.I tiny
+commands are smaller, simpler versions of more capable but larger Inferno commands.
+They are provided for use on devices where a certain level of functionality
+might be useful for configuration or maintenance (or development), but
+device constraints are such as to make the use of the normal, fleshier versions
+of the commands unattractive.
+For example, the Dis object files can be as much as 5 times smaller (or better) than the
+mainstream alternatives.
+They are also useful when initially porting the system.
+They live in the directory
+.BR /dis/tiny ,
+but could be placed in the
+.B /dis
+of a small device
+(eg, via
+.IR root (3))·
+.PP
+.I Broke
+kills broken processes and prints their process IDs.
+.PP
+.I Kill
+terminates each process (for a numeric
+process ID
+.IR pid )
+or
+process running a given
+.I module
+(for a non-numeric module name),
+by writing a
+.L kill
+message to the corresponding process's control file
+in
+.IR prog (3).
+The
+.B -g
+option causes
+.I kill
+to write a
+.L killgrp
+message instead, killing all processes in the given process's process group
+(see
+.IR sys-pctl (2)).
+Processes running a
+.I module
+are identified by their
+.L status
+file, and the process ID of each such process is printed on standard output.
+.PP
+.I Rm
+removes files and empty directories, subject to the permission rules given in
+.IR rm (1).
+There are no options.
+.PP
+.I Sh
+provides a simple user level interface (a shell) to the Inferno system.
+(It was once the only Inferno shell.)
+It reads input lines, identifies a command and arguments for that command, and arranges for execution of the corresponding Inferno module.
+There are features that allow input/output redirection, creating pipelines, and performing tasks in background.
+It is nevertheless a rudimentary shell designed for starting
+and debugging applications.
+It is not intended to serve as a general-purpose programmable shell.
+.PP
+If a file is named as a command line argument, that file is the source of input; otherwise, standard input is read.
+.PP
+Options are:
+.TP
+.B -n
+Don't fork the namespace. By default,
+.I sh
+forks the namespace, making subsequent namespace changes invisible to the previous namespace group.
+.TP
+.BI -c command
+Execute the single
+.I command
+rather than prompting to read commands from the standard input.
+.SS "Command line syntax"
+Each line consists of one or more command pipelines each separated by either an ampersand (&) which indicates that the pipeline should be run in background or a semi-colon (;). The semi-colon need not be provided for the last command pipeline on a line.
+.PP
+Command pipelines are not allowed to span lines.
+.PP
+Each command pipeline consists of one or more commands separated by a vertical bar
+.RB ( | )
+character. The standard output of one command is made the standard input of the next command to the right.
+.PP
+Redirection of input/output to pipes takes precedence over redirection from/to files.
+.PP
+In the limit case, a command pipeline consists of a single command with no pipes.
+.PP
+A command consists of one or more fields. The first (leftmost) field is the command field. It is used to determined the executable file to be loaded and run; see below. The remaining fields are parsed and become command line arguments that are passed to the module's init function as a list of strings.
+.PP
+Any input following a
+.B #
+on a line is discarded as comment.
+.SS "Finding the module"
+The command field is converted to the pathname of the Dis file of some module. That field can be either an absolute pathname, starting from
+.BR / ,
+or a relative pathname from the current directory.
+.PP
+As a convenience, the user need not specify the
+.B .dis
+suffix to the filename. If missing, it will be added by the shell.
+.PP
+If the load fails there is, in general, a second attempt to load the module by resolving the pathname relative to the
+.B /dis
+directory (or any directory bound to the
+.B /dis
+directory in the current namespace).
+.PP
+There are two exceptions to this second attempt. The second load attempt is not performed if the command field provides an absolute pathname or a relative pathname starting with dot-slash
+.RB ( ./ ).
+Such explicit naming is taken to mean that the user will accept no substitutions.
+.PP
+The shell requires that the Dis file implement a module with an interface equivalent to the
+.L Command
+module as specified in
+.B /module/sh.m
+(see
+.IR command (2)).
+Otherwise, the named file will not load.
+.PP
+In lieu of a path mechanism, a process can create a union directory at
+.BR /dis .
+.SS "File name expansion"
+Command line arguments (including the command field itself) are expanded by the shell according to the regular expression rules described in
+.IR filepat (2).
+.PP
+This expansion is not applied to the filenames used for input/output redirection.
+.SS "Quoting"
+The shell special characters can be stripped of their meaning and treated as literals by enclosing them in single quotes. Inside a quoted string, the special meaning of the single quote can be removed by immediately following it with another single quote. Command lines with un-terminated quoted strings are rejected and cause an error message.
+.PP
+For example:
+.IP
+.EX
+$ echo ''''
+\&'
+$ echo 'don''t'
+don't
+$ echo 'hello' 'world
+sh: unmatched quote
+$ echo 'a'b
+ab
+$ echo a'b'
+ab
+$
+.EE
+.SS "Shell special characters"
+The following characters are treated specially by
+.I sh
+and must be quoted to be taken literally:
+.TP
+blank
+white space, except in a quoted string
+.TP
+tab
+white space, except in a quoted string
+.TP
+newline
+command line terminator
+.TP
+.B #
+Start of comment
+.TP
+.B '
+Start of/end of quoted string (single quote)
+.TP
+.B |
+Interface between commands in a command pipeline.
+.TP
+.B &
+Terminator for command pipelines to be run in background.
+.TP
+.B ;
+Terminator for command pipelines to be run synchronously by the shell.
+.TP
+.B >
+Output re-direction: create file if it does not exist; truncate file if it exists
+.TP
+.B >>
+Output re-direction: create file if it does not exist; append to file if it exists
+.TP
+.B <
+Input re-direction.
+.SS "Prompt"
+The shell uses a prompt consisting of the system name as provided by
+.B /dev/sysname
+suffixed by
+.BR $ .
+.PP
+.SS "Input/output re-directions"
+By default, standard input is the console keyboard and standard output the console display. Each command can specify that standard input be taken from a file and standard output be written to a file.
+.PP
+Attempts to redirect standard input to a non-existing file will fail. Redirecting standard output to a non-existing file will cause that file to be created. If the destination file already exists, it will be overwritten. Any previous contents are lost.
+.PP
+In cases of competing re-direction mechanisms (re-direct to a file and to a pipe), the pipe has precedence.
+.PP
+.SS "Background tasks"
+In general, the shell waits for the termination of a command pipeline before continuing execution, for example, prompting the user for the next command. However, if the command pipeline is terminated by an ampersand
+.RB ( & )
+character, the wait stage is skipped and the shell continues execution immediately, in this case the command pipeline executes as a background task.
+.PP
+.SS "Name space concerns"
+When started, the shell creates an independent file name space that is a copy of the file name space of the shell's creator.
+.PP
+Command pipelines started by the shell are executed by threads that share the shell's name space. If those commands modify the file name space (and they have not mimicked the shell in creating their own independent name space), those modifications will be perceived by the shell when it continues execution. See
+.IR bind (1)
+and
+.IR sys-pctl (2).
+.SH FILES
+.BI /prog/ n /wait
+.SH SOURCE
+.B /appl/tiny/broke.b
+.br
+.B /appl/tiny/kill.b
+.br
+.B /appl/tiny/rm.b
+.br
+.B /appl/tiny/sh.b
+.SH "SEE ALSO"
+.IR bind (1),
+.IR sh (1),
+.IR filepat (2),
+.IR command (2),
+.IR sys-pctl (2),
+.IR cons (3),
+.IR pipe (3),
+.IR prog (3)
--- /dev/null
+++ b/man/1/tkcmd
@@ -1,0 +1,53 @@
+.TH TKCMD 1
+.SH NAME
+tkcmd \- enter Tk commands interactively
+.SH SYNOPSIS
+.B tkcmd
+[
+.B -iu
+] [
+.I tkarg
+]
+.SH DESCRIPTION
+.B Tkcmd
+allows interactive entry of Tk commands; it is useful for
+testing out features of Tk prior to incorporating them in
+a Limbo program. It accepts two arguments:
+.TP
+.B -i
+Force interactive mode. In interactive mode (the default if the
+standard input is directed at
+.BR /dev/cons ),
+a prompt is printed before every tk command entered.
+.TP
+.B -u
+Suppress the automatic tk update command after
+every entered command.
+.PP
+When
+.I tkcmd
+is started, a new top level window is created;
+.I tkcmd
+creates a titlebar and handles all the normal
+window window manager interactions.
+When the window is closed,
+.I tkcmd
+terminates.
+Each line typed to
+.I tkcmd
+is passed directly to the function
+.B Tk->cmd
+(see
+.IR tk (2))
+and executed in the context of the top level window;
+a Tk ``update'' command is then issued.
+Any return value from the command is printed.
+There is one predefined Tk channel,
+named ``stdout''; anything sent down this channel will
+be printed to the standard output.
+.SH SOURCE
+.B /appl/cmd/tkcmd.b
+.SH SEE ALSO
+.IR tk (2),
+.IR intro (9),
+.IR sh-tk (1)
--- /dev/null
+++ b/man/1/tktester
@@ -1,0 +1,154 @@
+.TH TKTESTER 1
+.SH NAME
+tktester \- test Tk widgets and help design Tk layouts
+.SH SYNOPSIS
+.B wm/tktester
+[
+.B -import
+]
+.SH DESCRIPTION
+.I Tktester
+not only tests the
+.IR tk (2)
+widget implementation but can help when designing Tk application layouts.
+Its main window contains the design area where widgets are placed and edited. Most of the commands for creating and moving widgets are located on the control bar just below the design area although a few commands may be found in the menus at the top of the window. Output is sent to the text box below the control bar.
+.PP
+Widget properties may be modified using the config window and widget commands called from the command window.
+.SH Main Window
+This is split into four areas:
+.PP
+.SS Menu Bar
+This contains various file operations as well as a few commands
+.TP 10
+.B File
+New: Starts a new file
+.br
+Open: Opens a saved file
+.br
+Snarf: Sends the current file to snarf
+.br
+Save: Saves the current file
+.br
+Save as: Asks for a new filename and then saves the file
+.br
+Exit: Close \f1tktester\fR
+.TP
+.PP
+Files are saved in the form of a list of tk commands. This means that they can easily be imported into programs as part of an array. Files to be loaded must have .f as the top frame with no widgets outside it.
+.TP 10
+.B Row/Column
+The current row/column is the one in which the currently selected widget/empty cell is located
+Insert - inserts a new row/column either before or after the currently selected row/column
+Delete - deletes currently selected row/column
+Format - sets the properties for the current row/column
+.TP
+.B Hidden
+Forget - removes the current widget from the display area but does not delete it. The widget name is then added to the 'Hidden' menu and can still be selected by clicking on its name there. This can be useful for operations which require widgets that are not currently packed e.g. placing a frame as a window within a canvas. Forgotten items will still be saved.
+.TP
+.B Disabled
+This menu only appears when a widget has been disabled. In this state, button bindings are ignored so it becomes impossible to select the widget. When a widget is disabled, its name is automatically added to the 'Disabled' menu and can be selected from there.
+.PP
+.SS Design Area
+This is the main area of the main window where the widgets are displayed. To select a widget, click on it with mouse button 3, the control bar shows the name and other information about the currently selected widget. Frames themselves can only be selected by clicking on their label, clicking elsewhere on the frame (if there is no widget there) will select the empty cell, any new widget created will be placed here. Once a widget has been selected, you can move it by clicking on the empty destination cell with mouse button 2. Individual widgets can be moved from one frame to another but frames themselves can currently only be moved within the same parent frame. Clicking mouse button 2 on a widget will delete that widget if the \f1Free Delete\fR button on the control bar is on.
+.SS Control Bar
+This is split into three different menus. To select the different submenus, click on the >> at the end of the menu title.
+.PP
+\fIData Menu\fR
+.TP 10
+.B Widget
+shows information about the current widget
+.br
+clicking on the \f1Destroy\fR button will delete the currently selected widget.
+The \f1Free Delete\fR button to the right of the \f1Destroy\fR button can be toggled on and off by clicking on it. When turned on (red background) , clicking mouse button 2 on a widget in the design area will delete it.
+.TP
+.B Grid
+shows information about the current grid
+.br
+Clicking the \f1Hide Labels\fR button will hide the frame labels so that you can see what the screen will look like normally.
+.PP
+\f1Position and Formatting Menu\fR
+.TP 10
+.B Move
+Move the widget within its current frame
+.TP
+.B Spanning
+Change row and column spanning properties
+.TP
+.B Padding
+Set cell padding, checkbox selects internal or external padding
+.TP
+.B Position
+Adjust widget position, widget can be stretched if opposite positions are selected e.g. to flill horizontaly, select < and >
+.PP
+\f1New Menu\fR
+.PP
+Clicking on 'New' will bring up the pack menu, here you can set packing to down or right. This is used when a new widget is created. If the user has not selected an empty cell, the new widget will be placed either below or to the right of the currently selected widget. Clicking on '>>' will scroll the buttons within the menu to the left to allow access to those that might be off screen.
+.PP
+.SS Output Box
+Output and errors are reported here. This box may be hidden by clicking on the grey button located at the bottom of the main window.
+.PP
+.SH POPUP WINDOWS
+.B
+.PP
+.SS Config Window
+This window is opened by clicking on the red button located at the bottom of the main window. To configure a widget's options, the widget must be selected. To modify an option, type the new value required into the relevant entry box and click the 'set' button. Any output (including error messages) returned will be sent to the output box.
+.PP
+There are two template buttons at the bottom of the config window, set as default and save as default. Set will cause each new widget of the same type to be created with the same options as the currently selected widget. This default will not be remembered once \f1tktester\fR has been closed. Save does the same as set except the default is saved so it will be not be lost if \f1tktester\fR is closed.
+.PP
+Default Template Options
+.PP A few special characters can be used when setting default widget options.
+.TP 5
+.B %n
+the name of the widget e.g. .f.f1.b2
+.TP
+.B %t
+the widget type e.g. button
+.TP
+.B %i
+the number of the widget
+.PP
+By default, each widget with a -text option is set to {%t %i} e.g. button 2. Note: These options only work with default templates, setting the -text option of a specific button to {%t %i} will just cause '%t %i' to be displayed.
+.PP
+.SS Command Window
+This window is opened by clicking on the green button located at the bottom of the main window. To call the commands for a particular widget, the widget must be selected.
+.PP
+The command window is split into two listboxes and one entry box. The first listbox contains all the main commands available for the current widget type. Selecting a command will bring up a list of subcommands (if they exist) in the second listbox as well as displaying any arguments required above the entrybox. To run a command, first select the command (and any subcommand), then enter the required arguments into the entry box and click run. The command, as well as any output, is sent to the output box on the main window. If no output is returned, the output box will display 'ok'.
+.PP
+.SH OPTIONS
+.TP 10
+.B -import
+Tells
+.I tktester
+to import valid widget commands from the man pages. This data is saved in the
+.B tkwargs/
+directory, which must already exist.
+.SH FILES
+The file
+.B tkwargs/widgets
+must contain a list of widgets, one per line as follows:
+.IP
+.RI [ name ]
+.RB [ abv ]
+.PP
+with the fields separated by tabs or spaces.
+For example:
+.IP
+.B "menubutton mb"
+.br
+.B "listbox lb"
+.PP
+.SH SOURCE
+.B /appl/wm/tktester
+.SH BUGS
+The command window sometimes lists a command more than once. It does not matter which one is used.
+.PP
+In a saved file, any grid commands must put -row and -column options \f1before\fR -rowspan or -columnspan.
+.PP
+Tktester can crash when loading a file if it is not in the correct format.
+.PP
+.SH PROPOSED ADDITIONS
+.SS Allow renaming of widgets
+At the moment, \f1tktester\fR can only load, save and use tk commands where the widget names adhere to the format .abv[n] where abv is the abreviation for the widget type e.g. b for buttons, sb for scrollbars etc and n is an optional number. It would be better to allow users to have more meaningful names such as .f.fmenu. Implementing this would also make it possible to load in commands written outside of \f1tktester\fR for testing or modification purposes.
+.PP
+.SS Column and Row indicators
+This would more clearly show which rows and columns widgets were in (especially when widgets are spanning more than one). Also could be used to select individual rows and columns more explicity and maybe for multiple selections.
--- /dev/null
+++ b/man/1/toolbar
@@ -1,0 +1,99 @@
+.TH TOOLBAR 1
+.SH NAME
+toolbar \- window manager toolbar
+.SH SYNOPSIS
+.B wm/toolbar
+[
+.B -s
+] [
+.B -p
+]
+.SH DESCRIPTION
+.I Toolbar
+is designed to be run as the controlling application under
+an instance of
+.IR wm (1).
+It runs an initialisation shell script,
+provides a menu allowing the user to start new programs.
+and shows icons representing windows that have been hidden.
+.PP
+When
+.I toolbar
+is started, it configures itself by means of the
+.B /lib/wmsetup
+shell script.
+.I Toolbar
+loads the shell
+.IR sh (1),
+and defines the following
+shell built-in
+commands before executing the script:
+.HP
+.B menu
+.I title1
+.RI [ title2]
+.I command
+.br
+Insert an item at the top of the start menu.
+.I Title1
+is the text of the item on the main menu.
+If
+.I title2
+is given then
+.I title1
+is a sub-menu with
+.I title2
+as the menu item.
+.I Command
+is executed by the shell whenever the item is selected.
+An item with an empty command is displayed as a separator.
+.HP
+.B delmenu
+.br
+Forget all menu items.
+.PP
+The standard
+.B /lib/wmsetup
+script executes the script
+.BI /usr/ username /lib/wmsetup ,
+enabling each user to have their own window manager configuration.
+.PP
+Normally
+.I toolbar
+packs a menu button referring to the start menu at the left hand side of the tool bar.
+The
+.B -s
+option suppresses that.
+.PP
+.I Toolbar
+serves the shared
+.I "snarf buffer"
+used by cut and paste in
+.IR wm (1)
+applications,
+except in hosted Inferno where the host's standard clipboard system is used instead,
+via
+.IR snarf (3).
+If
+.I toolbar
+cannot find
+.B /chan/snarf
+or the
+.B -p
+option is given,
+.I toolbar
+will create its own snarf buffer, private to the set of
+applications running under the current instance of
+.IR wm (1).
+.SH FILES
+.TP
+.B /lib/wmsetup
+Initialisation shell-script.
+.SH SOURCE
+.B /appl/wm/toolbar.b
+.SH "SEE ALSO"
+.IR wm(1),
+.IR tkclient (2),
+.IR wmclient (2),
+.IR toolbar (1),
+.IR logon (1).
--- /dev/null
+++ b/man/1/touch
@@ -1,0 +1,27 @@
+.TH TOUCH 1
+.SH NAME
+touch \- update the modification time of one or more files
+.SH SYNOPSIS
+.B touch
+.RB [ -c ]
+[
+.BI -t " time"
+]
+.I files
+.SH DESCRIPTION
+.B Touch
+attempts to set the modification time of the specified files to
+.I time
+(by default, the current system time).
+If a file does not exist,
+.B touch
+will attempt to create it, unless the
+.B -c
+option is given.
+.SH SOURCE
+.B /appl/cmd/touch.b
+.SH SEE ALSO
+.IR ls (1),
+.IR chmod (1),
+.IR sys-stat (2),
+.IR stat (5)
--- /dev/null
+++ b/man/1/tr
@@ -1,0 +1,95 @@
+.TH TR 1
+.SH NAME
+tr \- translate characters
+.SH SYNOPSIS
+.B tr
+[
+.B -cds
+]
+[
+.I string1
+[
+.I string2
+]
+]
+.SH DESCRIPTION
+.I Tr
+copies the standard input to the standard output with
+substitution or deletion of selected characters (runes).
+Input characters found in
+.I string1
+are mapped into the corresponding characters of
+.IR string2 .
+When
+.I string2
+is short it is padded to the length of
+.I string1
+by duplicating its last character.
+Any combination of the options
+.B -cds
+may be used:
+.TP
+.B -c
+Complement
+.IR string1 :
+replace it with a lexicographically ordered
+list of all other characters.
+.TP
+.B -d
+Delete from input all characters in
+.IR string1 .
+.TP
+.B -s
+Squeeze repeated output characters that occur in
+.I string2
+to single characters.
+.PP
+In either string a noninitial sequence
+.BI - x\f1,
+where
+.I x
+is any character (possibly quoted), stands for
+a range of characters:
+a possibly empty sequence of codes running from
+the successor of the previous code up through
+the code for
+.IR x .
+The character
+.L \e
+followed by 1, 2 or 3 octal digits stands for the
+character whose
+16-bit
+value is given by those digits.
+The character sequence
+.L \ex
+followed by 1 to 6 hexadecimal digits stands
+for the character whose
+21-bit value is given by those digits.
+A
+.L \e
+followed by any other character stands
+for that character.
+.SH EXAMPLES
+Replace all upper-case
+.SM ASCII
+letters by lower-case.
+.IP
+.EX
+tr A-Z a-z <mixed >lower
+.EE
+.PP
+Create a list of all
+the words in
+.L file1
+one per line in
+.LR file2 ,
+where a word is taken to be a maximal string of alphabetics.
+.I String2
+is given as a quoted newline.
+.IP
+.EX
+tr -cs A-Za-z '
+\&' <file1 >file2
+.EE
+.SH SOURCE
+.B /appl/cmd/tr.b
--- /dev/null
+++ b/man/1/tsort
@@ -1,0 +1,26 @@
+.TH TSORT 1
+.SH NAME
+tsort \- topological sort
+.SH SYNOPSIS
+.B tsort
+.SH DESCRIPTION
+.I Tsort
+reads a set of partial order relations between labels (sequences of non-space characters)
+from its standard input,
+and lists the labels on its standard output one per line following a topological sort.
+Each input line represents a set of inequalities: the first label on the line is less than
+all the others on the same line, and should appear earlier
+in sorted order.
+(The relation might for instance represent arcs in a directed graph, from
+the first label on a line to the others, or dependency relationships.)
+Labels on a line are separated by space or tab.
+.SH DIAGNOSTICS
+If the input contains cycles,
+.I tsort
+prints a diagnostic on standard error for each cycle, listing its members.
+The members of each cycle will also appear on the standard output, in any order,
+but after any predecessors outside the cycle.
+.SH SOURCE
+.B /appl/cmd/tsort.b
+.SH SEE ALSO
+.IR sort (1)
--- /dev/null
+++ b/man/1/unicode
@@ -1,0 +1,62 @@
+.TH UNICODE 1
+.SH NAME
+unicode \- interpret Unicode characters
+.SH SYNOPSIS
+.B unicode
+[
+.B -nt
+]
+.IB hexmin - hexmax
+.PP
+.B unicode
+[
+.B -t
+]
+.I hex ...
+.PP
+.B unicode
+[
+.B -n
+]
+.I char ...
+.SH DESCRIPTION
+.I Unicode
+converts between UTF and character values from the Unicode Standard (see
+.IR utf (6)).
+.PP
+If given a range of hexadecimal numbers,
+.I unicode
+prints a table of the specified Unicode characters including their values and UTF representations.
+Otherwise, it translates from UTF to numeric value or numeric value to UTF, depending on the appearance of the supplied text.
+If converting to UTF, the characters are printed one per line.
+.PP
+The options are:
+.TP
+.B -n
+Forces numeric output to avoid ambiguity with numeric characters.
+.TP
+.B -t
+Output a single string containing the specified characters, rather than one per line.
+.PP
+The output of
+.I unicode
+might not be helpful if the characters printed are not available in the current font.
+.SH EXAMPLES
+.TP
+.B "unicode p"
+Print the hex value of
+.BR p .
+.TP
+.B "unicode 2200-22f1"
+Print a table of miscellaneous mathematical symbols.
+.SH FILES
+.TF /lib/unicode
+.TP
+.B /lib/unicode
+Table of characters and descriptions.
+.SH SOURCE
+.B /appl/cmd/unicode.b
+.SH "SEE ALSO"
+.IR tr (1),
+.IR utf (6),
+.IR font (6)
--- /dev/null
+++ b/man/1/uniq
@@ -1,0 +1,33 @@
+.TH UNIQ 1
+.SH NAME
+uniq \- report repeated lines in a file
+.SH SYNOPSIS
+.B uniq
+[
+.B -ud
+]
+[
+.I file
+]
+.SH DESCRIPTION
+.I Uniq
+copies the input
+.IR file ,
+or the standard input, to the
+standard output, comparing adjacent lines.
+In the normal case, the second and succeeding copies
+of repeated lines are
+removed.
+Repeated lines must be adjacent
+in order to be found.
+.TP
+.B -u
+Print unique lines.
+.TP
+.B -d
+Print (one copy of) duplicated lines.
+.SH SOURCE
+.B /appl/cmd/uniq.b
+.SH "SEE ALSO"
+.IR comm (1),
+.IR sort (1)
--- /dev/null
+++ b/man/1/units
@@ -1,0 +1,110 @@
+.TH UNITS 1
+.if n .ds / /
+.SH NAME
+units \- conversion program
+.SH SYNOPSIS
+.B units
+[
+.B -v
+]
+[
+.I file
+]
+.SH DESCRIPTION
+.I Units
+converts quantities expressed
+in various standard scales to
+their equivalents in other scales.
+It works interactively in this fashion:
+.IP
+.EX
+you have: inch
+you want: cm
+ * 2.54
+ / 0.3937008
+.EE
+.PP
+A quantity is specified as a multiplicative combination
+of units and floating point numbers.
+Operators have the following precedence:
+.IP
+.EX
+.ta \w'\fLXXXXXXXXXXXXXXX'u
+\fL+\fP \fL-\fP \f1add and subtract
+\fL*\fP \fL/\fP \fL×\fP \fL÷\fP \f1multiply and divide
+catenation multiply
+\fL²\fP \fL³\fP \fL^\fP \f1exponentiation
+\fL|\fP \f1divide
+\fL(\fP ... \fL)\fP \f1grouping
+.EE
+.PP
+Most familiar units,
+abbreviations, and metric prefixes are recognized,
+together with a generous leavening of exotica
+and a few constants of nature including:
+.IP
+.de fq
+\fL\\$1\\fP \\$2 \\$3 \\$4 \\$5 \\$6
+..
+.ta \w'\fLwaterXXX'u
+.nf
+.fq pi,\f1π\fP ratio of circumference to diameter
+.fq c speed of light
+.fq e charge on an electron
+.fq g acceleration of gravity
+.fq force same as \fLg\fP
+.fq mole Avogadro's number
+.fq water "pressure head per unit height of water"
+.fq au astronomical unit
+.fi
+.PP
+The
+.L pound
+is a unit of
+mass.
+Compound names are run together, e.g.
+.LR lightyear .
+British units that differ from their US counterparts
+are prefixed thus:
+.LR brgallon .
+Currency is denoted
+.LR belgiumfranc ,
+.LR britainpound ,
+etc.
+.PP
+The complete list of units can be found in
+.BR /lib/units .
+A
+.I file
+argument to
+.I units
+specifies a file to be used instead of
+.BR /lib/units.
+The
+.B -v
+flag causes
+.I units
+to print its entire database.
+.SH EXAMPLE
+.EX
+you have: 15 pounds force/in²
+you want: atm
+ * 1.020689
+ / 0.9797299
+.EE
+.SH FILES
+.B /lib/units
+.SH SOURCE
+.B /appl/cmd/units.y
+.br
+.B /appl/cmd/units.b
+.SH BUGS
+Since
+.I units
+does only multiplicative scale changes,
+it can convert Kelvin to Rankine but not Centigrade to
+Fahrenheit, except that the latter is handled as a special case.
+.br
+Currency conversions are only as accurate as the last time someone
+updated
+.BR /lib/units .
--- /dev/null
+++ b/man/1/uuencode
@@ -1,0 +1,79 @@
+.TH UUENCODE 1
+.SH NAME
+uuencode, uudecode \- encode/decode a file
+.SH SYNOPSIS
+.B uuencode
+[
+.I sourcefile
+]
+.I remotefile
+.PP
+.B uudecode
+[
+.B -p
+]
+[
+.I encodedfile ...
+]
+.SH DESCRIPTION
+.I Uuencode
+and
+.I Uudecode
+are used to transmit files over transmission mediums that do not support other than simple
+ASCII data.
+.PP
+.I Uuencode
+converts a file to a purely ASCII based representation. It encodes the contents of
+.I sourcefile
+or the standard input if no source file is given. The
+.I remotefile
+is included in the encoded file's header as the name of the file into which
+.I uudecode
+should place the decoded data. The header also includes the permission modes of the
+source file so that these can be preserved on decoding. The encoded output of
+.I uuencode
+is sent to the standard output.
+.PP
+.I Uudecode
+reads a file, ignoring any leading and trailing lines that are not part of the encoding, and
+recreates the original file with the filename and mode specified in it's header. The file
+to decode is
+.I encodedfile
+or standard input if none is given. The
+.B -p
+flag can be used to send the decoded data to standard output rather than saving it in
+the file whose name is specified in the header.
+.SH EXAMPLES
+.PP
+Encode a dis file limbo.dis so that it can be included in a mail message:
+.IP
+.EX
+uuencode limbo.dis limbo.dis > tmp
+<place in mail message and send to recipient>
+.EE
+.PP
+Decode the mail message(msg say):
+.IP
+.EX
+cat msg | uudecode
+.EE
+.PP
+This creates the file limbo.dis.
+.PP
+Decode the mail message into a file of your choosing(tmp.dis say):
+.IP
+.EX
+cat msg | uudecode -p > tmp.dis
+.EE
+.SH SOURCE
+.B /appl/cmd/uuencode.b
+.br
+.B /appl/cmd/uudecode.b
+.SH BUGS
+The encoded file is expanded by at least a third.
+.br
+Decoding a file may overwrite an existing file.
+.br
+Uuencode should take the remote file name to be the same as the source file if one
+is not given.
+
--- /dev/null
+++ b/man/1/vacget
@@ -1,0 +1,103 @@
+.TH VACGET 1
+.SH NAME
+vacget, vacput \- venti archive utilities
+.SH SYNOPSIS
+.B vacget
+[
+.B -vdpt
+] [
+.B -a
+.I addr
+]
+.I vac:score
+.br
+.B vacput
+[
+.B -vd
+] [
+.B -i
+|
+.B -x
+] [
+.B -a
+.I addr
+] [
+.B -b
+.I blocksize
+] [
+.B -n
+.I name
+] [
+.B -u uid
+] [
+.B -g gid
+]
+.I path ...
+.SH DESCRIPTION
+.I Vacget
+retrieves a venti archive from a venti server to the current working directory.
+.PP
+.I Vacput
+writes a venti archive to a venti server. The
+.I paths
+are walked recursively and all files and directories written to the archive. Temporary files, i.e. those with the
+.B DMTMP
+bit set, are skipped. Writing only changed files relative to a previously written archive is not implemented.
+.TP
+.B -d
+Print debug messages.
+.TP
+.B -p
+Try to preserve file permissions and owner/group. Only for vacget.
+.TP
+.B -v
+Be verbose. Prints files as they are being retrieved or written.
+.TP
+.B -t
+List files, do not write them. Only for vacget.
+.TP
+.BI -a " address"
+Dial
+.I address
+instead of the default venti server.
+.TP
+.BI -b " blocksize"
+Use blocks with
+.I blocksize
+bytes instead of the default 8192 byte blocks. Only for vacput.
+.TP
+.BI -n " name"
+Use
+.I name
+as the name in the root block. Only for vacput.
+.TP
+.BR -i " or " -x
+Read a list of files from stdin to include
+.RB ( -i )
+or exclude
+.RB ( -x )
+from the (recursively walked)
+.I paths
+specified on the command-line.
+Only for vacput.
+.TP
+.BI -u " uid"
+Use
+.I uid
+for all files.
+Only for vacput.
+.TP
+.BI -g " gid"
+Use
+.I gid
+for all files.
+Only for vacput.
+.SH SOURCE
+.B /appl/cmd/vacget.b
+.br
+.B /appl/cmd/vacput.b
+.SH SEE ALSO
+.IR venti (2),
+.IR vacfs (4)
+.SH BUGS
+These tools need more testing.
--- /dev/null
+++ b/man/1/wc
@@ -1,0 +1,29 @@
+.TH WC 1
+.SH NAME
+wc \- count lines, words, and characters
+.SH SYNOPSIS
+.B wc
+[
+.B -lwceb
+]
+[
+.I file ...
+]
+.SH DESCRIPTION
+.I Wc
+writes to standard output a tally of lines, words, and characters found in each
+.IR file ,
+assumed to be text in UTF format.
+If no files are named, standard input is read. One line is output per file. If several files are specified, an additional line is written giving totals.
+.PP
+`Words' are maximal sequences of characters separated by blanks, tabs and newlines.
+.PP
+Counts are output in the same order as the listing of the option letters
+.BR lwceb ;
+select lines, words, UTF characters, erroneously-encoded characters, and bytes, respectively.
+If no options are given, lines, words and characters are counted.
+.SH SOURCE
+.B /appl/cmd/wc.b
+.SH "SEE ALSO"
+.IR tr (1),
+.IR utf (6)
--- /dev/null
+++ b/man/1/webgrab
@@ -1,0 +1,141 @@
+.TH WEBGRAB 1
+.SH NAME
+webgrab \- fetch web page content as files
+.SH SYNOPSIS
+.B webgrab
+[
+.B -r
+] [
+.B -v
+] [
+.BI -o " stem"
+] [
+.BI -p " body"
+]
+.I url
+.SH DESCRIPTION
+.I Webgrab
+connects to the web server named in the
+.IR url .
+It fetches the content of the web page also determined by the
+.IR url ,
+and stores it locally in a file.
+If the page is written in HTML,
+.I webgrab
+reads it to build a list of sub-component pages (eg, frames) and images.
+It fetches those, saving the content in separate files.
+It adds a comment to the end of each HTML file giving the time, and the file's origin.
+It automatically follows redirections offered by the server.
+.PP
+The
+.I stem
+of the names of the output files is normally derived from a component of the
+.IR url .
+If the
+.I url
+contains a path name, the
+.I stem
+is the component of that path, less any dot-separated suffix and prefix.
+For example, given
+.IP
+.BR http://www.vitanuova.com/inferno/old.index.html
+.PP
+the stem would be
+.BR index .
+If there is no path name, but the
+.I url
+contains a domain name, the
+.I stem
+is the penultimate component of the domain name (eg, excluding
+trailing
+.BR .com ,
+and initial
+.BR www ,
+etc).
+For example, given
+.IP
+.B www.innerhost.vitanuova.com
+.PP
+the stem would be
+.BR vitanuova .
+If all else fails,
+.I webgrab
+uses the
+.I stem
+.BR webgrab .
+.PP
+Given a
+.IR stem ,
+the initial page is stored in
+.IB stem . suffix
+where
+.I suffix
+is the suffix (eg,
+.BR .html )
+of the name of the original page.
+Subordinate pages are saved in a similar way in files named
+.IB stem _1. suffix1,
+.IB stem _2. suffix2,
+\&... .
+.PP
+The options are:
+.TP
+.B -r
+do not fetch subcomponents (just the `raw' source of
+.I url
+itself)
+.TP
+.B -v
+print a progress report
+.TP
+.B -vv
+print a chatty progress report
+.TP
+.BI -o " stem"
+use the
+.I stem
+as given
+.TP
+.BI -p " body"
+Use HTTP
+.B POST
+instead of
+.BR GET ,
+posting
+.I body
+as the data
+.PP
+.I Webgrab
+reads the
+configuration file
+.B /services/webget/config
+(if it exists),
+to look for the address of an optional HTTP proxy
+(in the
+.L httpproxy
+entry), and list of domains for which a proxy should not be used
+(in the
+.B noproxy
+or
+.B noproxydoms
+entry). If symbolic network and service names might be involved, the
+connection server
+.B lib/cs
+needs to be already running.
+.SH FILES
+.B /services/webget/config
+.SH SOURCE
+.B /appl/cmd/webgrab.b
+.SH BUGS
+It should read the proxy name from the
+.IR charon (1)
+configuration file and not the
+.I webget
+configuration file.
+.br
+It cannot do `secure' transfers
+.RB ( https ).
+.br
+Its HTML parsing is naive, but on the other hand, it is less likely to trip over HTML novelties.
+.SH "SEE ALSO"
+.IR cs (8)
--- /dev/null
+++ b/man/1/wish
@@ -1,0 +1,86 @@
+.TH WISH 1
+.SH NAME
+wish \- interface to the Tk graphics toolkit
+.SH SYNOPSIS
+.B wish
+[
+.I file ...
+]
+.PP
+.B wm/wish
+[
+.B -k
+]
+[
+.BI -f " file"
+]
+.SH DESCRIPTION
+.I Wish
+provides a Tcl
+command line interface to the Limbo/Tk graphics toolkit.
+The input should be in the format of Tcl or Tk commands
+(see
+.IR intro (9)).
+There are two variants.
+.PP
+Plain
+.B wish
+must be run from the Inferno console instead of
+.IR mux (1)
+or
+.IR wm (1).
+It takes input from each
+.I file
+in turn, then prompts for further commands from the standard input.
+Its commands operate on a Tk toplevel covering the whole screen.
+.PP
+.BR Wm/wish
+runs instead in a shell window under
+.IR wm (1).
+It reads initial input from the optional
+.IR file ,
+then prompts for further commands on its standard input unless
+the
+.B -k
+option is given.
+Its commands operate on the Tk toplevel of a new window
+created by
+.B Wmlib->titlebar
+(see
+.IR wmlib (2)),
+initially titled
+.BR WishPad .
+.PP
+The following special input sequences are recognised:
+.TP
+.B \en
+newline
+.TP
+.B \et
+tab
+.TP
+.B \eb
+backspace
+.TP
+.B \e\e
+backslash
+.SH FILES
+.B /dev/pointer
+.br
+.B /dev/keyboard
+.SH SOURCE
+.B /appl/cmd/wish.b
+.br
+.B /appl/wm/wish.b
+.SH "SEE ALSO"
+.IR sh-tk (1),
+.IR tkcmd (1),
+.IR tk (2),
+.IR intro (9)
+.SH BUGS
+Arguably this has been superseded by
+.IR sh-tk (1)
+for scripting Tk applications,
+and
+.IR tkcmd (1)
+for development and testing of Tk configurations for use by Limbo programs.
--- /dev/null
+++ b/man/1/wm
@@ -1,0 +1,216 @@
+.TH WM 1
+.SH NAME
+wm \- window manager
+.SH SYNOPSIS
+.B wm/wm
+[
+.I command
+[
+.IR arg ...
+]
+]
+.SH DESCRIPTION
+.I Wm
+is an inferno window manager, providing the control mechanism for
+the user to manage to order and position of a dynamic collection
+of application windows.
+When started, it runs
+.IR command ,
+(by default
+.BR wm/toolbar ,
+see
+.IR toolbar (1))
+By itself,
+.I wm
+does not provide any means for starting new applications;
+that facility must be provided by an auxilliary program,
+.B wm/toolbar
+being one such example.
+.SS Control Interface
+.I Wm
+provides a control interface to programs running inside it
+through the
+.B Wmcontext
+adt that can be obtained from the
+.B Draw->Context
+that it passes to applications that it starts
+(see
+.IR draw-context (2)).
+Control messages it understands include:
+.TP
+.B start \fIwhat\fP
+Start input on
+.IR what .
+.I What
+can be
+.BR ptr
+(pointer events),
+.BR kbd
+(keyboard events)
+and
+.BR control
+(window manager control events, see below).
+.TP
+.B key \fIcharval\fP
+Simulate a key event.
+.I Charval
+is the decimal value of the character that has been
+pressed. The character will be sent exactly as if it
+had been typed on the keyboard. This facility
+is used by
+.IR keyboard (1).
+.TP
+.B !reshape \fItag\fP \fIreqid\fP \fIminx miny maxx maxy\fI \fR[\fIhow\fR]
+Reshape or create the window named
+.IR tag .
+.I Reqid
+is ignored;
+.I minx..maxy
+give the desired bounding rectangle of the
+new window.
+If
+.I how
+is not given, or is
+.BR exact ,
+then
+.I wm
+will attempt to satisfy the request exactly.
+Otherwise,
+.I how
+tells
+.I wm
+how to determine the rectangle of the resulting image;
+it can be one of
+.B place
+(choose some appropriate position and size on screen),
+.B onscreen
+(modify the requested rectangle only so as to bring
+it on screen), or
+.B max
+(request the maximum available rectangle).
+.TP
+.B delete \fItag\fP
+Delete the window named by \fItag\fP.
+.TP
+.B raise
+Raise all windows for the current context above the others.
+.TP
+.B lower
+Send all windows for the current context to the bottom.
+.TP
+.B !move \fItag\fP \fIreqid\fP \fIstartx\fP \fIstarty\fP
+Drag window
+.I tag
+interactively.
+.I Reqid
+is ignored.
+.I Startx
+and
+.I starty
+give the location of the pointer when the drag was initiated.
+.TP
+.B !size \fItag\fP \fIreqid\fP
+Interactively resize window \fItag\fP.
+.TP
+.B fixedorigin
+By default, if a window changes position but not size,
+.I wm
+changes the origin of the window without creating a new image.
+Sending
+.B fixedorigin
+caused
+.I wm
+always to create a new image in that case.
+.TP
+.B kbdfocus \fR[\fIin\fR]
+If the decimal integer
+.I in
+is non-zero, request the keyboard focus,
+otherwise lose the keyboard focus.
+.PP
+.I Wm
+generates control messages to inform applications of
+things that have happened. These include:
+.TP
+.B rect \fIminx miny maxx maxy\fP
+The screen rectangle has changed.
+.I "minx..maxy"
+gives the new bounding box of the screen.
+.TP
+.B haskbdfocus \fIin\fP
+Informs an application of its current keyboard focus state.
+This message is generated in response to pointer events,
+and due to
+.B kbdfocus
+requests.
+.TP
+.B exit
+The window manager is closing down.
+.SS Controlling Application
+The first application that starts under
+.I wm
+is given the privilege of being able to control
+other applications running under the same
+.IR wm .
+If it sends a
+.B start control
+message, then it will also see any control requests
+sent by applications that
+.I wm
+itself does not understand and information about applications
+starting and leaving.
+.I Wm
+accepts several other control messages from its
+controlling application:
+.TP
+.B ctl \fIid\fP \fImsg\fP
+Send message
+.I msg
+to application
+.IR id .
+.TP
+.B endcontrol
+Relinquish controller status.
+The next application that starts will get control status.
+This is used, for instance, to segue smoothly between
+.IR logon (1)
+and
+.IR toolbar (1).
+.PP
+If the controlling application has started control messages,
+.I wm
+sends it the following messages:
+.TP
+.B newclient \fIid\fP
+A new client has connected, identified by
+.IR id .
+.TP
+.B delclient \fIid\fP
+Client
+.I id
+has left.
+.TP
+.B request \fIid\fP \fImsg\fP
+Client
+.I id
+sent the request
+.I msg
+to the window manager, which it did not understand.
+This facility is used, for instance, by
+.IR toolbar (1)
+to implement the
+.B task
+and
+.B untask
+requests.
+.SH FILES
+.TP
+.B /chan/wmrect
+File holding current screen rectangle.
+.SH SOURCE
+.B /appl/wm/wm.b
+.SH "SEE ALSO"
+.IR toolbar (1),
+.IR logon (1),
+.IR tkclient (2),
+.IR wmclient (2)
--- /dev/null
+++ b/man/1/wm-misc
@@ -1,0 +1,247 @@
+.TH WM-MISC 1
+.SH NAME
+about, clock, coffee, colors, date, edit, mand, memory, polyhedra, reversi, rt, stopwatch, sweeper, task, tetris, unibrowse, view, winctl \- miscellaneous graphical applications
+.SH SYNOPSIS
+.B wm/about
+.br
+.B wm/clock
+.br
+.B wm/coffee
+.br
+.B wm/colors
+.br
+.B wm/date
+.br
+.B wm/edit
+.RI [ file ]
+.br
+.B wm/mand
+.br
+.B wm/memory
+.br
+.B wm/polyhedra
+.br
+.B wm/reversi
+.br
+.B wm/rt
+.br
+.B wm/stopwatch
+.br
+.B wm/sweeper
+.br
+.B wm/task
+.br
+.B wm/tetris
+[
+.B -b
+.I blocksize
+]
+.br
+.B wm/unibrowse
+.br
+.B wm/view
+[
+.B -i
+]
+.RI [ file... ]
+.br
+.B wm/winctl
+.SH DESCRIPTION
+A collection of simple applications and utilities that operate under the
+Wm window manager.
+Other Wm applications exist, see their respective manual pages for
+more information.
+.PP
+.TP
+.B wm/about
+Display system version and copyright information.
+.TP
+.B wm/clock
+Display an analogue clock.
+.TP
+.B wm/coffee
+A whimsical plaything.
+.TP
+.B wm/colors
+Displays the Inferno palette.
+Clicking on a particular colour displays its RGB values.
+.TP
+.B wm/date
+Displays the current date and time in a window.
+.TP
+.B wm/edit
+A simple cut-and-paste text editor.
+Several menus provide the usual editing commands.
+Text selections are dragged out using mouse button 1.
+Mouse button-2 displays a pop-up menu of the Cut, Copy and Paste commands.
+.TP
+.B wm/mand
+A fractal browser to explore the Mandelbrot and Julia sets.
+Button 1 drags a rectangle to zoom into, button 2 shows the Julia set at the chosen point, button 3 zooms out.
+To produce more accurate pictures, the iteration depth may be increased by altering
+the depth scale factor. The default number of iterations per point is 253. The sets are
+plotted by filling regions of (apparently) the same colour. Deselecting the fill option
+will plot the points in the usual fashion.
+.TP
+.B wm/memory
+Displays memory usage.
+Three usage bars are displayed, one for each of the Inferno memory
+pools: main, heap and image. The current usage (in bytes) is displayed
+to the left of each bar, and the number of blocks in use appears in red.
+The maximum permitted size of each pool is given (in megabytes) to the right of its
+usage bar.
+Each bar also sports a highwater mark.
+The usage data is re-read and displayed once every second.
+.TP
+.B wm/polyhedra
+A program to display convex regular polyhedra. The menu options allow the user
+to alter the speed of rotation and the axis of rotation. To display a different
+solid, move forward or back with the prev and next boxes. Selecting the dual
+box will show the dual of a solid rather than the original solid. Finally the
+edges, clear and faces boxes determine whether edges are shown, whether the
+screen is cleared before the next plot and whether faces are shown respectively.
+.TP
+.B wm/reversi
+An implementation of the popular game. The default set up is for black to be the
+machine and white the human player. Use the Black and White menu options to
+change this. The level of any machine player may be set using the Black level
+and White level boxes. This determines the amount of lookahead performed
+by the tree search algorithm.
+.TP
+.B wm/rt
+A Dis module inspector: it can show the Dis instructions, strings,
+types and other attributes of a module; it also allows the user
+to set some attributes stored in a module's header.
+.TP
+.B wm/stopwatch
+A simple-minded stopwatch.
+Only useful for coarse-grained timings.
+.TP
+.B wm/sweeper
+Mine sweeping game.
+.TP
+.B wm/task
+Task manager: it lists the processes running when it starts,
+and offers buttons to kill a selected process, kill its process group,
+show its open files, or debug it using
+.IR deb (1).
+A process is selected from the list using mouse button 1.
+.I Task
+does not automatically refresh the list; there is a
+.B Refresh
+button to prompt it to do so.
+.TP
+.B wm/tetris
+The ubiquitous and annoyingly addictive tile dropping game.
+The game keys are:
+.RB ` 7 '
+move left;
+.RB ` 8 '
+rotate (anti-clockwise);
+.RB ` 9 '
+move right;
+.RB ` p '
+pause;
+.RI ` space '
+drop and
+.RB ` q '
+quit.
+A mouse or stylus can also be used to guide the pieces (eg, by tapping the screen in the desired direction).
+Scores are stored in the file
+.BR /lib/scores/tetris .
+Score file updates are not interlocked \- it's only a game!
+.TP
+.B wm/unibrowse
+A handy utility for browsing the unicode character set, finding out what
+particular characters look like in different fonts, finding out exactly which
+characters a font provides, and finding the name of a character
+that you have managed to grab into the snarf buffer.
+.TP
+.B wm/view
+Image viewer.
+Displays GIF, Inferno
+.IR image (6),
+JPEG,
+PNG
+and X bitmap image files.
+The viewer creates a new window to display the contents of each
+.IR file .
+If no arguments are given, the file browser panel
+.IR filename (1)
+is displayed to prompt the user to select an image file to view.
+If the
+.B -i
+option is given,
+.I view
+continues to listen for requests from the
+.IR plumber (8);
+the
+.B -i
+option will normally appear only in rules in
+.IR plumbing (6)
+files.
+.TP
+.B wm/winctl
+Window management tool.
+Displays a set of buttons that provide for:
+raising a window to the top or lowering it to the bottom of the
+screen window stack; moving a window to a new position; iconising a window;
+deleting a window.
+.IP
+Click on the button for the required action then click on the window to apply it to.
+When moving a window, click and drag the target.
+Deleting a window is error-prone. Currently using this tool on a charon or acme
+window has strange effects.
+.SH PLUMBING
+.B wm/view
+receives
+.B view
+messages
+.SH FILES
+.TP
+.B /lib/polyhedra
+Polyhedra data base.
+.TP
+.B /lib/scores/tetris
+Tetris high score table.
+.TP
+.B /lib/unidata
+Directory holding Unicode character set information, used by
+.BR unibrowse .
+.TP
+.B /dev/memory
+Provides
+.B memory
+with memory usage statistics.
+.SH SOURCE
+.B /appl/wm/about.b
+.br
+.B /appl/wm/coffee.b
+.br
+.B /appl/wm/colors.b
+.br
+.B /appl/wm/date.b
+.br
+.B /appl/wm/edit.b
+.br
+.B /appl/wm/mand.b
+.br
+.B /appl/wm/memory.b
+.br
+.B /appl/wm/polyhedra.b
+.br
+.B /appl/wm/reversi.b
+.br
+.B /appl/wm/rt.b
+.br
+.B /appl/wm/stopwatch.b
+.br
+.B /appl/wm/task.b
+.br
+.B /appl/wm/tetris.b
+.br
+.B /appl/wm/unibrowse.b
+.br
+.B /appl/wm/view.b
+.br
+.B /appl/wm/winctl.b
--- /dev/null
+++ b/man/1/wm-sh
@@ -1,0 +1,274 @@
+.TH WM-SH 1
+.SH NAME
+sh, mash \- Window frames for the Inferno shells
+.SH SYNOPSIS
+.B wm/sh
+[
+.B -w
+.I width
+] [
+.B -h
+.I height
+] [
+.B -f
+.I font
+]
+.I sh-args
+.br
+.B wm/mash
+.I mash-args
+.br
+.SH DESCRIPTION
+Both
+.B wm/sh
+and
+.B wm/mash
+provide a graphical framework to their respective shells.
+Both wrappers manage the input and output of the shell.
+They provide facilities for scrolling and editing the output buffer
+and for constructing input to be sent to the shell.
+.PP
+.B Wm/sh
+invokes the shell
+.IR sh (1)
+with the arguments
+.B -n
+.IR sh-args ;
+.B wm/mash
+invokes
+.IR mash (1)
+with the arguments
+.IR mash-args .
+.B Wm/sh
+accepts the following additional options, which are
+not passed through to
+.IR sh :
+.HP
+.B -w
+.I width
+.br
+The window should be at least
+.I width
+pixels wide.
+.HP
+.B -h
+.I height
+.br
+The window should be at least
+.I height
+pixels high.
+.HP
+.B -f
+.I font
+.br
+Specify the font to use in the window.
+.I Font
+should be the name of a valid
+.IR font (6)
+file.
+.PP
+.B Wm/sh
+and
+.B wm/mash
+both provide their own versions of
+.B /dev/cons
+and
+.B /dev/consctl
+files in the namespace of the invoked shell
+(see
+.IR cons (3)
+for the originals) and attach the standard input
+of the invoked shell to the virtualised
+.B /dev/cons
+file.
+Output from the shell, or of any commands run by the shell, is displayed in
+a scrollable text window, appearing at the
+.IR "output position" ,
+which is at the end of any previously output text, before
+any as-yet-unread user input text.
+.PP
+Any text displayed on the console can be edited.
+Typed text is always inserted at the position of the input cursor.
+The input cursor can be moved to any point in the text by
+clicking mouse button-1 at the desired position.
+Selections can be made by dragging the mouse with button-1 held down.
+Typing into a selection copies its text to the Snarf buffer, the
+selected text is deleted and the typed character inserted.
+.PP
+Text typed beyond the output point will be made available
+to commands reading from
+.BR /dev/cons .
+Normally this text is made available when newline is typed,
+but typing ESC turns on
+.I hold
+mode (the text turns blue), deferring the availability of the text until ESC is
+typed again, turning hold mode off. This allows simple
+multi-line editing of the standard input to a command.
+.PP
+Writing
+.B rawon
+to
+.B /dev/consctl
+changes the above behaviour, making each character typed beyond
+the output point available to commands as soon as it is typed;
+the character is not automatically echoed. Writing
+.B rawoff
+to
+.B /dev/consctl
+reverses this behaviour.
+.PP
+In addition to dragging out selections, they can be made by double clicking
+mouse button-1.
+Double clicking over a word selects the whole word.
+Double clicking next to a brace or bracket selects the text between it and its matching
+brace or bracket.
+If there is no match then no selection is made.
+.PP
+Clicking mouse button-2 displays a pop-up menu of editing commands:
+.TP
+.B Cut
+Copy the current selection to the Snarf buffer and then delete
+the selected text.
+This command has no effect if there is no selected text, the Snarf buffer
+is not cleared.
+.TP
+.B Paste
+When there is no text selected, the contents of the Snarf buffer are
+inserted at the current input cursor.
+If a selection exits, its text is replaced by that of the Snarf buffer.
+The new text is then selected.
+The contents of the Snarf buffer remain unaltered.
+.TP
+.B Snarf
+Copy the selected text to the Snarf buffer.
+This command has no effect if there is no selected text.
+.TP
+.B Send
+If there is any text selected it is copied to the Snarf buffer.
+The contents of the Snarf buffer is then
+appended to the end of the current shell input line, forwarding
+any NewLine completed lines to the shell's input stream.
+.PP
+Mouse chording is implemented as in
+.IR acme (1).
+Dragging a selection with button-1 held down and then also clicking
+button-2 cuts the selected text into the Snarf buffer.
+Clicking button-3 instead of button-2 replaces the selected text with the contents
+of the Snarf buffer.
+.PP
+Clicking mouse button-3 plumbs the word or selection under the click point.
+See
+.IR plumber (8)
+for more information on plumbing.
+.PP
+.I Wm/sh
+also serves the file
+.BR /chan/shctl .
+The following commands may be written to this file:
+.HP
+.B cwd
+.I dir
+.br
+Causes any plumbing request generated by
+.I wm/sh
+to be created with
+.I dir
+as its ``current directory''. This is shown in the
+title bar of the window.
+Note that it is up to the command running inside
+.I wm/sh
+to keep this up to date (for instance, see EXAMPLES,
+below).
+.HP
+.B button
+.I "title sendtext"
+.br
+A Tk button is created at the top of the shell window, labeled
+with
+.IR title .
+When activated,
+.I sendtext
+will be sent to the shell window as if it had been typed.
+.HP
+.B action
+.I "title sendtext"
+.br
+A button is created as for the
+.B button
+command, except that activation of the button causes
+.I sendtext
+to be sent to any process reading from
+.BR /chan/shctl .
+.HP
+.B clear
+.br
+Delete any buttons that have been created.
+.PP
+Arguments to commands sent to
+.B /chan/shctl
+follow
+.IR sh (1)
+quoting rules (the same as implemented by
+.I quoted
+and
+.I unquoted
+in
+.IR string (2)).
+A process reading from
+.B /chan/shctl
+will block until an
+.B action
+button is activated, whereupon it will yield the
+.I sendtext
+associated with the button.
+.SH PLUMBING
+Both
+.B wm/sh
+and
+.B wm/mash
+plumb text selected by button 3;
+an empty selection plumbs the white-space bounded text
+surrounding the selection.
+.SH EXAMPLES
+Define a
+.IR sh (1)
+function to update the current directory automatically:
+.PP
+.EX
+ fn cd {builtin cd $*; echo cwd `{pwd} >/chan/shctl}
+.EE
+.PP
+Note that this will not work in all cases, as it is possible to
+change the current directory without using the
+.I cd
+command.
+.PP
+Create a button to automate a
+.I mount
+command (note the newline in the argument string):
+.PP
+.EX
+ echo ${quote button mount 'mount kremvax /n/remote
+ '} > /chan/shctl
+.EE
+.PP
+Create a new
+.I wm/sh
+window with the above button already created:
+.PP
+.EX
+ wm/sh -ic {
+ echo ${quote button mount 'mount kremvax /n/remote
+ '} > /chan/shctl
+ }
+.EE
+.SH SOURCE
+.B /appl/wm/sh.b
+.br
+.B /appl/wm/mash.b
+.br
+.SH "SEE ALSO"
+.IR sh (1),
+.IR mash (1),
+.IR wm (1),
+.IR plumber (8)
--- /dev/null
+++ b/man/1/xd
@@ -1,0 +1,92 @@
+.TH XD 1
+.SH NAME
+xd \- dump file contents in multiple formats
+.SH SYNOPSIS
+.B xd
+[
+.I option
+\&... ] [
+.BI - format
+\&... ] [
+.IR file ...
+]
+.SH DESCRIPTION
+.B Xd
+dumps the contents of each
+.I file
+in one or more formats.
+If no file is specified, standard input is read.
+Input is processed in 16 byte chunks.
+Each chunk is output in each of the specified
+.IR format s,
+one format per line.
+Each line of output is prefixed its file offset.
+This is zero padded for the first format; subsequent formats are blank padded.
+If more than one
+.I file
+is specified, the name of each file is output at the start of its dump.
+.PP
+Output formats are specified by a two character name,
+.B 4x
+by default.
+The first character defines the byte width of the format; the second character
+defines the style of output.
+.PP
+The available width specifiers are:
+.TF "1 or b"
+.TP
+.BR 1 " or " b
+1 byte units.
+.TP
+.BR 2 " or " w
+2 byte big-endian units.
+.TP
+.BR 4 " or " l
+4 byte big-endian units.
+.TP
+.BR 8 " or " v
+8 byte big-endian units.
+.PD
+.PP
+The available styles are:
+.TP 0
+.B o
+Octal
+.PD 0
+.TP
+.B d
+Decimal
+.TP
+.B x
+Hexadecimal
+.PD
+.PP
+In addition to the above format specifiers,
+.B -c
+can be used to denote ASCII format.
+This is the same as
+.B 1x
+except that codes are printed as printable ASCII characters or Limbo escape sequences
+where possible.
+.SH OPTIONS
+.TP 10
+.B -u
+Unbuffered output. The output buffer is flushed after the dump of each 16 byte input chunk
+has been generated.
+.TP
+.B -r
+Mark repeated 16 byte input chunks.
+The first chunk is output as per the format specifiers, followed by an asterisk representing
+1 or more occurrences of identical data.
+.TP
+.B -s
+Reverse the order of input bytes in chunks of 4 before processing for output.
+.TP
+.BI -a style
+Print file addresses in the given
+.IR style .
+.SH SOURCE
+.TP
+.B /appl/cmd/xd.b
+.SH BUGS
+There is no means of dumping 2 or 8 byte wide values in little-endian form.
--- /dev/null
+++ b/man/1/yacc
@@ -1,0 +1,349 @@
+.TH YACC 1
+.SH NAME
+yacc \- yet another compiler-compiler (Limbo version)
+.SH SYNOPSIS
+.B yacc
+[
+.I option ...
+]
+.I grammar
+.SH DESCRIPTION
+.I Yacc
+converts a context-free grammar and translation code
+into a set of
+tables for an LR(1) parser and translator.
+The grammar may be ambiguous;
+specified precedence rules are used to break ambiguities.
+.PP
+The output from
+.I yacc
+is a Limbo module
+.B y.tab.b
+containing the parse function
+.B yyparse
+which must be provided with a
+.B YYLEX
+adt providing the parser access to a lexical analyser
+routine
+.BR lex() ,
+an error routine
+.BR error() ,
+and any other context required.
+.PP
+The options are
+.TP "\w'\fL-o \fIoutput\fLXX'u"
+.BI -o " output
+Direct output to the specified file instead of
+.BR y.tab.b .
+.TP
+.BI -D n
+Create file
+.BR y.debug ,
+containing diagnostic messages.
+To incorporate them in the parser, give an
+.I n
+greater than zero.
+The amount of
+diagnostic output from the parser is regulated by
+value
+.IR n :
+.RS
+.TP
+1
+Report errors.
+.TP
+2
+Also report reductions.
+.TP
+3
+Also report the name of each token returned by
+.LR yylex .
+.RE
+.TP
+.B -v
+Create file
+.BR y.output ,
+containing a description of the parsing tables and of
+conflicts arising from ambiguities in the grammar.
+.TP
+.B -d
+Create file
+.BR y.tab.m ,
+containing the module
+declaration for the parser, along with
+definitions of the constants
+that associate
+.IR yacc -assigned
+`token codes' with user-declared `token names'.
+Include it in source files other than
+.B y.tab.b
+to give access to the token codes and the parser module.
+.TP
+.BI -s " stem
+Change the prefix
+.L y
+of the file names
+.BR y.tab.b ,
+.BR y.tab.m ,
+.BR y.debug ,
+and
+.B y.output
+to
+.IR stem .
+.TP
+.B -m
+Normally
+.I yacc
+defines the type of the
+.B y.tab.b
+module within the text of the module according
+to the contents of the
+.B %module
+directive.
+Giving the
+.B -m
+option suppresses this behaviour, leaving the implementation
+free to define the module's type from an external
+.B .m
+file. The module's type name is still taken from the
+.B %module
+directive.
+.TP
+.BI -n " size
+Specify the initial
+.I size
+of the token stack created for the
+parser (default: 200).
+.SS Differences from C yacc
+The Limbo
+.I yacc
+is in many respects identical to the C
+.IR yacc .
+The differences are summarised below:
+.PP
+Comments follow the Limbo convention (a
+.B #
+symbol gives a comment until the end of the line).
+.PP
+A
+.B %module
+directive is required, which replaces the
+.B %union
+directive. It is of the form:
+.RS
+.IP
+.B %module
+.I modname
+.B {
+.br
+.I module types, functions and constants
+.br
+.B }
+.RE
+.B Modname
+will be the module's implementation type;
+the body of the directive, augmented with
+.B con
+definitions for the
+.IR yacc -assigned
+token codes, gives the type of the module,
+unless the
+.B -m
+option is given, in which case no module
+definition is emitted.
+.PP
+A type
+.B YYSTYPE
+must be defined, giving the type
+associated with
+.I yacc
+tokens. If
+the angle bracket construction is used after
+any of the
+.BR %token ,
+.BR %left ,
+.BR %right ,
+.BR %nonassoc
+or
+.B %type
+directives in order to associate a type with a token or production,
+the word inside the angle brackets
+refers to a member of
+an instance of
+.BR YYSTYPE ,
+which should be an adt.
+.PP
+An adt
+.B YYLEX
+must be defined, providing context to the parser.
+The definition must consist of at least the following:
+.EX
+ YYLEX: adt {
+ lval: YYSTYPE;
+ lex: fn(l: self ref YYLEX): int;
+ error: fn(l: self ref YYLEX, msg: string);
+ }
+.EE
+.B Lex
+should invoke a lexical analyser to return the
+next token for
+.I yacc
+to analyse. The value of the token should
+be left in
+.BR lval .
+.B Error
+will be called when a parse error occurs.
+.B Msg
+is a string describing the error.
+.PP
+.B Yyparse
+takes one argument, a reference to the
+.B YYLEX
+adt that will be used to provide it with tokens.
+.PP
+The parser is fully re-entrant;
+.I i.e.
+it does not
+hold any parse state in any global variables
+within the module.
+.SH EXAMPLE
+The following is a small but complete example of the
+use of Limbo
+.I yacc
+to build a simple calculator.
+.EX
+%{
+ include "sys.m";
+ sys: Sys;
+
+ include "bufio.m";
+ bufio: Bufio;
+ Iobuf: import bufio;
+
+ include "draw.m";
+
+ YYSTYPE: adt { v: real; };
+ YYLEX: adt {
+ lval: YYSTYPE;
+ lex: fn(l: self ref YYLEX): int;
+ error: fn(l: self ref YYLEX, msg: string);
+ };
+%}
+
+%module Calc{
+ init: fn(ctxt: ref Draw->Context, args: list of string);
+}
+
+%left '+' '-'
+%left '*' '/'
+
+%type <v> exp uexp term
+%token <v> REAL
+
+%%
+top :
+ | top '\en'
+ | top exp '\en'
+ {
+ sys->print("%g\en", $2);
+ }
+ | top error '\en'
+ ;
+
+exp : uexp
+ | exp '*' exp { $$ = $1 * $3; }
+ | exp '/' exp { $$ = $1 / $3; }
+ | exp '+' exp { $$ = $1 + $3; }
+ | exp '-' exp { $$ = $1 - $3; }
+ ;
+
+uexp : term
+ | '+' uexp { $$ = $2; }
+ | '-' uexp { $$ = -$2; }
+ ;
+
+term : REAL
+ | '(' exp ')'
+ {
+ $$ = $2;
+ }
+ ;
+
+%%
+
+in: ref Iobuf;
+stderr: ref Sys->FD;
+
+init(nil: ref Draw->Context, nil: list of string)
+{
+ sys = load Sys Sys->PATH;
+ bufio = load Bufio Bufio->PATH;
+ in = bufio->fopen(sys->fildes(0), Bufio->OREAD);
+ stderr = sys->fildes(2);
+ lex := ref YYLEX;
+ yyparse(lex);
+}
+
+YYLEX.error(nil: self ref YYLEX, err: string)
+{
+ sys->fprint(stderr, "%s\en", err);
+}
+
+YYLEX.lex(lex: self ref YYLEX): int
+{
+ for(;;){
+ c := in.getc();
+ case c{
+ ' ' or '\et' =>
+ ;
+ '-' or '+' or '*' or '/' or '\en' or '(' or ')' =>
+ return c;
+ '0' to '9' or '.' =>
+ s := "";
+ i := 0;
+ s[i++] = c;
+ while((c = in.getc()) >= '0' && c <= '9' ||
+ c == '.' ||
+ c == 'e' || c == 'E')
+ s[i++] = c;
+ in.ungetc();
+ lex.lval.v = real s;
+ return REAL;
+ * =>
+ return -1;
+ }
+ }
+}
+.EE
+.SH FILES
+.TF /lib/yaccpar
+.TP
+.B y.output
+.TP
+.B y.tab.b
+.TP
+.B y.tab.m
+.TP
+.B y.debug
+.TP
+.B /lib/yaccpar
+parser prototype
+.SH SOURCE
+.B /appl/cmd/yacc.b
+.SH "SEE ALSO"
+S. C. Johnson and R. Sethi,
+``Yacc: A parser generator'',
+.I
+Unix Research System Programmer's Manual,
+Tenth Edition, Volume 2
+.br
+B. W. Kernighan and Rob Pike,
+.I
+The UNIX Programming Environment,
+Prentice Hall, 1984
+.SH BUGS
+The parser may not have full information when it writes to
+.B y.debug
+so that the names of the tokens returned by
+.L yylex
+may be missing.
--- /dev/null
+++ b/man/1/zeros
@@ -1,0 +1,44 @@
+.TH ZEROS 1
+.SH NAME
+zeros \- write sequence of bytes
+.SH SYNOPSIS
+.B zeros
+[
+.IR -r
+]
+[
+.IR -v value
+]
+[ [
+.IR blocksize ...
+[
+.IR numblocks
+] ]
+.SH DESCRIPTION
+.B Zeros
+writes a sequence of bytes to standard output. The arguments
+specify the nature of the bytes,
+block size in bytes, and the number of blocks to output.
+The
+.I -r
+option requests that each block be the same, but randomly
+generated. The
+.IR -v value
+option sets the value of each byte (default 0).
+Typically
+.IR zeros
+has a specialised use:
+ensuring a file has the desired number of blocks in it to hold a file system image,
+before reaming it.
+.SH EXAMPLE
+To create and initialize a file system containing 2048 1024 byte
+blocks
+.IP
+.EX
+zeros 1024 2048 >kfs.file
+mount -c {disk/kfs -r kfs.file} /n/local
+.EE
+.SH SOURCE
+.B /appl/cmd/zeros.b
+.SH SEE ALSO
+.IR kfs (4)
--- /dev/null
+++ b/man/10/0intro
@@ -1,0 +1,74 @@
+.TH INTRO 10
+.SH NAME
+intro \- introduction to hosted and native implementation
+.SH DESCRIPTION
+Inferno provides a collection of compiler suites, libraries and two closely-related
+kernels to span a range of host and native platforms.
+Section 10 of this manual is divided into subsections numbered
+in the same way as the main manual: 10.1 for commands, 10.2
+for library and kernel routines, and 10.6 for file formats.
+.PP
+Section 10.1 describes the various compiler and utility commands
+provided to support compilation and cross-compilation of native
+kernels.
+These are derived from similarly named programs of the system Plan 9 from Bell Labs,
+converted to ANSI C to
+provide a consistent, portable environment for cross-compiling
+any native kernel on any host platform.
+.PP
+Section 10.2 describes the functions publicly available to the authors of
+kernel code, particularly device drivers (real and virtual).
+This section will eventually be much expanded, but this makes a start.
+See the description of the conventional header files below.
+.PP
+Section 10.6 describes include the native object file formats,
+the Inferno (Plan 9) object library (archive) format,
+and system configuration files.
+.PP
+Section 10.8 describes bootstrap programs and procedures for
+native Inferno systems.
+.SS Native kernel declarations
+The
+.SM SYNOPSIS
+subsections in section 10.2 do not show the header files needed for
+the standard kernel declarations.
+The primary combinations summarised below:
+.IP
+.RS
+.ta \w'\fL#include 'u
+.nf
+.B
+#include "u.h"
+.B
+#include "../port/lib.h"
+.B
+#include "mem.h"
+.B
+#include "dat.h"
+.B
+#include "fns.h"
+.B
+#include "../port/error.h"
+.PP
+.I "furthermore, added in IP code:"
+.br
+.B
+#include "../ip/ip.h"
+.PP
+.I "furthermore, in hardware device drivers:"
+.br
+.B
+#include "io.h"
+.br
+.B
+#include "ureg.h"
+.PP
+.I "furthermore, in network interfaces or ether drivers:"
+.B
+#include "../port/netif.h"
+.fi
+.RE
+.PP
+There might also be specific include files needed by
+drivers on particular platforms or to use specialised kernel interfaces.
+The easiest method is to check the source of likely-looking drivers nearby.
--- /dev/null
+++ b/man/10/2a
@@ -1,0 +1,55 @@
+.TH 2A 10.1
+.SH NAME
+0a, 1a, 2a, 5a, 6a, 7a, 8a, ka, qa, va \- assemblers
+.SH SYNOPSIS
+.B 2a
+[
+.I option ...
+]
+[
+.I name ...
+]
+.br
+etc.
+.SH DESCRIPTION
+These programs
+assemble the named files into object files
+for the corresponding architectures; see
+.IR 2c (10.1)
+for the correspondence between an architecture and the character
+.RB ( 1 ,
+.RB 2 ,
+etc.) that specifies it.
+The assemblers handle the most common C preprocessor directives and the associated
+command-line options
+.BR -D
+and
+.BR -I .
+Other options are:
+.TP
+.BI -o " obj"
+Place output in file
+.I obj
+(allowed only if there is just one input file).
+Default is to take the last element of the input path name,
+strip any trailing
+.BR .s ,
+and append
+.RI . O ,
+where
+.I O
+is first letter of the assembler's name.
+.SH FILES
+The directory
+.B /sys/include
+is searched for include files after
+machine-dependent files in
+.BR /$objtype/include .
+.SH SOURCE
+.BR /utils/2a ,
+etc.
+.SH SEE ALSO
+.IR 2c (10.1),
+.IR 2l (10.1).
+.PP
+Rob Pike, ``A manual for the Plan 9/Inferno assembler'', Volume 2
--- /dev/null
+++ b/man/10/2c
@@ -1,0 +1,437 @@
+.TH 2C 10.1
+.SH NAME
+0c, 1c, 2c, 5c, 6c, 7c, 8c, kc, qc, vc \- C compilers
+.SH SYNOPSIS
+.B 2c
+[
+.I option ...
+]
+[
+.I file ...
+]
+.br
+etc.
+.SH DESCRIPTION
+These commands compile the named C
+.I files
+into object files for the corresponding architecture.
+Associated with each compiler is a string
+.IR objtype ,
+for example
+.TP 1.5i
+.B "0c spim
+Little-endian MIPS
+.TP
+.B "1c 68000
+Motorola MC68000
+.TP
+.B "2c 68020
+Motorola MC68020
+.TP
+.B "5c arm
+ARM 7500
+.TP
+.B "6c amd64
+AMD64 extension to x86
+.TP
+.B "7c alpha
+Digital Alpha APX
+.TP
+.B "8c 386
+Intel i386, i486, Pentium, etc.
+.TP
+.B "kc sparc
+Sun SPARC
+.TP
+.B "qc power
+Power PC,
+.TP
+.B "vc mips
+big-endian MIPS 3000 family
+.PP
+Let the first letter of the compiler name be
+.IR O =
+.BR 0 ,
+.BR 1 ,
+.BR 2 ,
+.BR 5 ,
+.BR 6 ,
+.BR 7 ,
+.BR 8 ,
+.BR k ,
+.BR q ,
+or
+.BR v .
+The output object files end in
+.RI . O .
+The letter is also the prefix of related programs:
+.IB O a
+is the assembler,
+.IB O l
+is the loader.
+.PP
+Plan 9 conventionally sets the
+.B $objtype
+environment variable to the
+.I objtype
+string appropriate to the current machine's type.
+Plan 9 also conventionally has
+.RI / objtype
+directories, which contain among other things:
+.BR include ,
+for machine-dependent include files;
+.BR lib ,
+for public object code libraries;
+.BR bin ,
+for public programs;
+and
+.BR mkfile ,
+for preconditioning
+.IR mk (10.1).
+.PP
+For Inferno cross-compilation on all platforms, not just Plan 9, both
+.B $objtype
+and
+.B $OBJTYPE
+are set by every native kernel
+.B mkfile
+to correspond to the target processor type.
+The Inferno
+.B mkfiles
+also set the
+.B -I
+option appropriately to search the Inferno include directories,
+since the Plan 9 defaults are inappropriate.
+.PP
+The compiler options are:
+.TP 1i
+.BI -o " obj"
+Place output in file
+.I obj
+(allowed only if there is just one input file).
+Default is to take the last element of the input file name,
+strip any trailing
+.BR .c ,
+and append
+.RI . O .
+.TP
+.B -w
+Print warning messages about unused variables, etc.
+.TP
+.B -B
+Accept functions without a new-style
+ANSI C function prototype.
+By default, the compilers reject functions
+used without a defined prototype,
+although ANSI C permits them.
+.TP
+.BI -D\*S name=def
+.br
+.ns
+.TP
+.BI -D \*Sname
+Define the
+.I name
+to the preprocessor,
+as if by
+.LR #define .
+If no definition is given, the name is defined as
+.LR 1 .
+.TP
+.B -F
+Warn when the elements of a format
+(eg, those used by
+.IR print )
+disagree with in type or size with the corresponding parameter,
+or there is a mismatch in number.
+See the discussion of extensions, below.
+.TP
+.BI -I \*Sdir
+An
+.L #include
+file whose name does not begin with
+slash
+or is enclosed in double quotes
+is always
+sought first in the directory
+of the
+.I file
+argument. If this fails,
+the
+.I -.
+flag is given or the name is enclosed in
+.BR <> ,
+it is then sought
+in directories named in
+.B -I
+options,
+then in
+.BR /sys/include ,
+and finally in
+.BR /$objtype/include .
+.TP
+.B -.
+Suppress the automatic searching for include files in
+the directory of the file argument.
+.TP
+.B -N
+Suppress automatic registerization and optimization.
+.TP
+.B -S
+Print an assembly language version of the object code
+on standard output as well as generating the
+.RI . O
+file.
+.TP
+.B -T
+Pass type signatures on all external and global entities.
+The signature is based on the C
+.B signof
+operator,
+an extension in this compiler.
+See
+.IR dynld (10.2).
+.TP
+.B -V
+By default, the compilers are non-standardly lax about type equality between
+.B void*
+values and other pointers; this flag requires ANSI C conformance.
+.TP
+.B -a
+Instead of compiling, print on standard output acid functions (see
+.IR acid (10.1))
+for examining structures declared in the source files.
+.TP
+.B -aa
+Like
+.B -a
+except suppress information about structures
+declared in included header files.
+.PP
+The compilers handle most preprocessing directives themselves, but support
+excludes the
+.B #if
+and
+.B #elif
+directives, and the
+.B ##
+preprocessor operation.
+.PP
+The compilers support several extensions to ANSI C:
+.TP
+\-
+A structure or union may contain unnamed substructures and subunions.
+The fields of the substructures or
+subunions can then be used as if they were members of the parent
+structure or union (the resolution of a name conflict is unspecified).
+When a pointer to the outer structure or union is used in a context
+that is only legal for the unnamed substructure, the compiler promotes
+the type and adjusts the pointer value to point at the substructure.
+If the unnamed structure or union is of a type with a tag name specified by a
+.B typedef
+statement,
+the unnamed structure or union can be explicitly referenced
+by <struct variable>.<tagname>.
+.TP
+\-
+A structure value can be formed with an expression such as
+.EX
+ (struct S){v1, v2, v3}
+.EE
+where the list elements are values for the fields of struct
+.BR S .
+.TP
+\-
+Array initializers can specify the indices of the array in square
+brackets, as
+.EX
+ int a[] = { [3] 1, [10] 5 };
+.EE
+which initializes the third and tenth elements of the eleven-element array
+.BR a .
+.TP
+\-
+Structure initializers can specify the structure element by using the name
+following a period, as
+.EX
+ struct { int x; int y; } s = { .y 1, .x 5 };
+.EE
+which initializes elements
+.B y
+and then
+.B x
+of the structure
+.BR s .
+These forms also accept the new ANSI C notation, which includes an equal sign:
+.EX
+ int a[] = { [3] = 1, [10] = 5 };
+ struct { int x; int y; } s = { .y = 1, .x = 5 };
+.EE
+.TP
+\-
+A global variable can be dedicated to a register
+by declaring it
+.B "extern register"
+in
+.I all
+modules and libraries.
+.TP
+\-
+A
+.B #pragma
+of the form
+.EX
+ #pragma lib "libbio.a"
+.EE
+records that the program needs to be loaded with file
+.BR /$objtype/lib/libbio.a ;
+such lines, typically placed in library header files, obviate the
+.B -l
+option of the loaders. To help identify files in non-standard directories,
+within the file names in the
+.B #pragmas
+the string
+.B $M
+represents the name of the architecture
+(e.g.,
+.BR mips )
+and
+.B $O
+represents its identifying character
+(e.g.,
+.BR v ).
+.TP
+\-
+Two
+.B #pragma
+requests to define rules for checking
+.IR print -like
+formats (see the
+.B -F
+option above).
+One
+.B #pragma
+tells for a given routine which argument is the format.
+For example:
+.EX
+ #pragma varargck argpos print 1
+ #pragma varargck argpos sprint 2
+.EE
+say that
+.I print
+has a format as its first argument,
+and
+.I sprint
+has one as its second.
+Another
+.B #pragma
+associates format character sequences and types:
+.EX
+ #pragma varargck type "lld" vlong
+ #pragma varargck type "lx" void*
+ #pragma varargck type "S" Rune*
+.EE
+where the format characters are those following the
+.B %
+in the format (ignoring any preceding formatting flags).
+Note the assumption that all formats arguments are compatible.
+The system include files have appropriate
+.B #pragma
+lines for the standard format elements and formatting functions.
+.TP
+\-
+A
+.B #pragma
+of the form
+.EX
+ #pragma incomplete \fItype\fP
+.EE
+tells the compiler that
+.I type
+should have its signature calculated as an incomplete type
+even when it is fully defined.
+This allows the type signature mechanism to work in the presence
+of opaque types declared in header files, with their full definitions
+visible only to the code which manipulates them.
+With some imported software it might be necessary to turn off the
+signature generation completely for a large body of code (typically
+at the start and end of a particular include file).
+If
+.I type
+is the word
+.BR _off_ ,
+signature generation is turned off; if
+.I type
+is the word
+.BR _on_ ,
+the compiler will generate signatures.
+.TP
+\-
+The C++ comment
+.RB ( //
+to end of line)
+is accepted as well as the normal
+convention of
+.B /*
+.BR */ .
+.TP
+\-
+The compilers accept
+.B long
+.B long
+variables as a 64-bit type.
+The standard header typedefs this to
+.BR vlong .
+Arithmetic on
+.B vlong
+values is usually emulated by a run-time library.
+.SH EXAMPLE
+For the 68020, produce a program
+.B prog
+from C files
+.BR main.c
+and
+.BR sub.c :
+.IP
+.EX
+2c -FVw main.c sub.c
+2l -o prog main.2 sub.2
+.EE
+.SH FILES
+.TF /$objtype/include
+.TP
+.B /sys/include
+host system area for machine-independent
+.B #include
+directives.
+.TP
+.B /$objtype/include
+host system area for machine-dependent
+.B #include
+directives.
+.SH SOURCE
+.TF /utils/2c,\ etc.
+.TP
+.B /utils/cc
+machine-independent part
+.TP
+.BR /utils/2c ,\ etc.
+machine-dependent part
+.SH "SEE ALSO"
+.IR 2a (10.1),
+.IR 2l (10.1),
+.IR mk (10.1),
+.IR inm (10.1),
+.IR acid (10.1),
+.PP
+Rob Pike,
+``How to Use the Plan 9 C Compiler''
+.SH BUGS
+The preprocessor only handles
+.LR #define ,
+.LR #include ,
+.LR #undef ,
+.LR #ifdef ,
+.LR #line ,
+and
+.LR #ifndef .
--- /dev/null
+++ b/man/10/2l
@@ -1,0 +1,201 @@
+.TH 2L 10.1
+.SH NAME
+0l, 1l, 2l, 5l, 6l, 7l, 8l, kl, ql, vl \- loaders
+.SH SYNOPSIS
+.B 2l
+[
+.I option ...
+]
+[
+.I file ...
+]
+.br
+etc.
+.SH DESCRIPTION
+These commands load the named
+.I files
+into executable files for the corresponding architectures; see
+.IR 2c (10.1)
+for the correspondence between an architecture and the character
+.RB ( 1 ,
+.BR 2 ,
+etc.)
+that specifies it.
+The files should be object files or libraries (archives of object files)
+for the appropriate architecture.
+Also, a name like
+.BI -l ext
+represents the library
+.BI lib ext .a
+in
+.BR /$objtype/lib ,
+where
+.I objtype
+is one of
+.BR 68000 ,
+etc. as listed in
+.IR 2c (10.1).
+The libraries must have tables of contents
+(see
+.IR iar (10.1)).
+.PP
+In practice,
+.B -l
+options are rarely necessary as the header files for
+the libraries cause their archives to be included automatically in the load
+(see
+.IR 2c (10.1)).
+For example, any program that includes header file
+.B libc.h
+causes the loader
+to search the C library
+.BR /$objtype/lib/libc.a .
+Also, the loader creates an undefined symbol
+.B _main
+(or
+.B _mainp
+if profiling is enabled) to force loading of the
+startup linkage from the C library.
+.PP
+The order of search to resolve undefined symbols is to load all files and libraries
+mentioned explicitly on the command line, and then to resolve remaining symbols
+by searching in topological order
+libraries mentioned in header files included by files already loaded.
+When scanning such libraries, the algorithm is to scan each library repeatedly until
+no new undefined symbols are picked up, then to start on the next library. Thus if library
+.I A
+needs
+.I B
+which needs
+.I A
+again, it may be necessary to mention
+.I A
+explicitly so it will be read a second time.
+.PP
+The loader options are:
+.TP 1i
+.B -l
+(As a bare option.)
+Suppress the default loading of the startup linkage and libraries
+specified by header files.
+.TP
+.BI -o " out"
+Place output in file
+.IR out .
+Default is
+.IB O .out\f1,
+where
+.I O
+is the first letter of the loader name.
+.TP
+.B -p
+Insert profiling code into the executable output; no special action is needed
+during compilation or assembly.
+.TP
+.B -s
+Strip the symbol tables from the output file.
+.TP
+.B -a
+Print the object code in assembly language, with addresses.
+.TP
+.B -v
+Print debugging output that annotates the activities of the load.
+.TP
+.BI -M
+.RI ( kl
+only) Generate instructions rather than calls to emulation routines
+for multiply and divide.
+.TP
+.BI -E symbol
+The entry point for the binary is
+.I symbol
+(default
+.BR _main ;
+.B _mainp
+under
+.BR -p ).
+.TP
+.B -x
+[
+.I file
+]
+Produce an export table in the executable.
+The optional
+.I file
+restricts the exported symbols to those listed in the file.
+See
+.IR dynld (10.2).
+.TP
+.B -u
+[
+.I file
+]
+Produce an export table, import table
+and a dynamic load section in the executable.
+The optional
+.I file
+restricts the imported symbols to those listed in the file.
+See
+.IR dynld (10.2).
+.TP
+.BI -H n
+Executable header is type
+.IR n .
+The meaning of the types is architecture-dependent; typically
+type 1 is Plan 9 boot format and type 2 is the
+regular Plan 9 format, the default. These are reversed on the MIPS.
+The Next boot format is 3. Type 4 in
+.I vl
+creates a MIPS executable for an SGI Unix system.
+.TP
+.BI -T t
+The text segment starts at address
+.IR t .
+.TP
+.BI -D d
+The data segment starts at address
+.IR d .
+.TP
+.BI -R r
+The text segment is rounded to a multiple of
+.I r
+(if
+.I r
+is nonzero).
+.PP
+The numbers in the above options can begin with
+.L 0x
+or
+.L 0
+to change the default base from decimal to hexadecimal or octal.
+The defaults for the values depend on the compiler and the
+header type.
+.PP
+The loaded image has several symbols inserted by the loader:
+.B etext
+is the address of the end of the text segment;
+.B bdata
+is the address of the beginning of the data segment;
+.B edata
+is the address of the end of the data segment;
+and
+.B end
+is the address of the end of the bss segment, and of the program.
+.SH FILES
+.TF /$objtype/lib
+.TP
+.B /$objtype/lib
+for
+.BI -l lib
+arguments.
+.SH SOURCE
+.B /utils/2l
+etc.
+.SH "SEE ALSO"
+.IR 2c (10.1),
+.IR 2a (10.1),
+.IR iar (10.1),
+.IR inm (10.1)
+.PP
+Rob Pike,
+``How to Use the Plan 9 C Compiler''
--- /dev/null
+++ b/man/10/5coff
@@ -1,0 +1,82 @@
+.TH 5COFF 10.1
+.SH NAME
+5coff \- converter to coff format
+.SH SYNOPSIS
+.B 5coff
+[
+.B -T
+.I t
+]
+[
+.B -D
+.I d
+]
+[
+.B -R
+.I r
+]
+[
+.B -E
+.I e
+]
+[
+.B -d
+]
+.I ifile ofile
+.SH DESCRIPTION
+.I 5coff
+converts an executable file
+.I ifile
+in
+.IR a.out (10.6)
+format as
+produced by
+.I 5l
+(see
+.IR 2l (10.1))
+to one in
+.SM COFF
+format, which it writes to
+.IR ofile .
+The options to
+.I 5coff
+are as follows:
+.TP
+.BI -T t
+The text segment starts at address
+.I t.
+.TP
+.BI -D d
+The data segment starts at address
+.I d.
+.TP
+.BI -R r
+The text segment is rounded up to a multiple of
+.I r
+if non-zero.
+.TP
+.BI -E e
+The entry point is at address
+.I e.
+.TP
+.B -d
+Print debugging information.
+.PP
+.SH EXAMPLE
+An executable built with the command
+.IP
+.EX
+5l -T0x04010000 -R4 -o abc ...
+.EE
+.PP
+can be converted to coff format by
+.IP
+.EX
+5coff -T0x04010000 -R4 abc abc.coff
+.EE
+.SH SOURCE
+.B /utils/5coff
+.SH SEE ALSO
+.IR 2l (10.1),
+.IR 5cv (10.1),
+.IR a.out (10.6)
--- /dev/null
+++ b/man/10/5cv
@@ -1,0 +1,127 @@
+.TH 5CV 10.1
+.SH NAME
+5cv, mkppcimage, sqz \- convert kernel executable to boot format
+.SH SYNOPSIS
+.B 5cv
+[
+.BI -D n
+] [
+.BI -H n
+] [
+.B -s
+]
+.I "executable outfile"
+.PP
+.B mkppcimage
+[
+.BI -l " loadaddr"
+]
+.I "executable outfile"
+.PP
+.B sqz
+[
+.B -w
+] [
+.B -t
+]
+.I executable
+.SH DESCRIPTION
+These commands convert a kernel executable in Inferno/Plan 9
+.IR a.out (10.5)
+format into another
+format used by a third party's boot loader.
+Most convert the input
+.I executable
+and write the new format to
+.IR outfile .
+.PP
+.IR 5cv
+converts an ARM executable into one of several alternative formats.
+The output format is controlled by the
+.B -H
+option:
+.TP 8n
+.BI -H1
+AIF for RISCOS.
+.TP
+.BI -H2
+Plan 9.
+.TP
+.BI -H3
+Boot for NetBSD.
+.TP
+.BI -H4
+Headerless, stripped, and padded to 2K in length. Used for the ROM resident serial
+bootstrap
+loader in a Cirrus EP72xx.
+.TP
+.BI -H5
+Headerless, and stripped, for general use.
+.TP
+.BI -H6
+EPOC IMG format. Not a complete conversion, currently sufficient for use with some
+NT based downloaders which autosense the file type by the "EP" signature, and then
+ignore the contents of the header.
+.PP
+The other options are:
+.TP
+.BI -s
+Strip symbol table.
+.TP
+.BI -D n
+Enables debug output.
+.PP
+.I Mkppcimage
+converts a PowerPC or ARM
+.I executable
+to a boot image format used by
+.SM PPCBOOT
+and
+.SM UBOOT\c
+\&.
+The output file has a
+.SM PPCBOOT
+image with one component labelled as an `OS kernel' for the appropriate architecture,
+containing the
+.IR a.out (10.6)
+header, text and initialised data, all uncompressed.
+Symbols are not included.
+By default the load address is deduced from the executable's entry point;
+the
+.B -l
+option allows
+.I loadaddr
+to be set explicitly, with the number in C syntax (decimal by default).
+Other attributes are deduced from the executable.
+.PP
+.I Sqz
+squeezes (compresses) the given
+ARM or PowerPC
+.I executable
+using a method that achieves respectable compression for executables but is much faster to decompress than
+(say)
+.BR gzip 's.
+By default, both the program text and initialised data are compressed; the
+.B -t
+option causes
+.I sqz
+to compress only the program text, leaving the data as-is.
+By default,
+.I sqz
+prints compression statistics on its standard error output;
+the
+.B -w
+option causes it also to write the compressed file on its standard output.
+Either the bootstrap that loads it must decompress the result, or a small uncompressed
+stub must also be loaded that decompresses the remainder.
+.SH SOURCE
+.B /utils/5cv
+.br
+.B /utils/mkppcimage
+.br
+.B /utils/sqz
+.SH "SEE ALSO"
+.IR 2l (10.1),
+.IR 5cv (10.1),
+.IR ms2 (10.1),
+.IR a.out (10.5)
--- /dev/null
+++ b/man/10/9load
@@ -1,0 +1,411 @@
+.TH 9LOAD 10.8
+.SH NAME
+9load, ld, 9pxeload \- PC bootstrap program
+.SH SYNOPSIS
+.I "(Under MS-DOS)
+.br
+[
+.I drive
+:][
+.I path
+.RB ] ld
+[
+.I 9load
+]
+.SH DESCRIPTION
+On the PC, bootstrap programs from Plan 9 are used to boot Inferno as well
+(hence the naming convention).
+.I 9load
+and
+.I ld
+are programs that reside in a FAT file system and bootstrap Inferno.
+.I 9load
+loads the kernel, but it cannot be run from DOS; use
+.I ld
+to bootstrap (by starting
+.IR 9load )
+if DOS is running.
+.I 9load
+is run automatically by the boot procedures described below;
+it cannot be run directly by hand.
+There are three bootstrap sequences:
+.IP \-
+BIOS, MBR, disk partition PBS,
+.IR 9load ,
+kernel
+.IP \-
+BIOS, floppy PBS,
+.IR 9load ,
+kernel
+.IP \-
+BIOS, MBR, DOS,
+.IR ld ,
+.IR 9load ,
+kernel.
+.PP
+Details follow.
+.PP
+.I 9load
+is a bootstrap program that loads and starts a program,
+typically the kernel, on a PC.
+It is run by the PC partition boot sector program (PBS),
+which usually resides in the first
+sector of the active partition.
+A copy of the Plan 9 PBS is kept in
+.BR /Inferno/386/pbs ,
+but due to the ``cylinder-head-sector'' (CHS) addressing mode of old BIOSes, it can only
+operate up to 8.5GB into the disk.
+Plan 9 partitions further into the disk
+can only be booted using
+.BR /Inferno/386/pbslba ,
+and then only if the machine's BIOS supports
+linear block addressing (LBA) mode for disk transfers.
+.PP
+When booting from floppy or hard disk, the BIOS loads the
+first sector of the medium at location 0x7C00. In the
+case of a floppy, this is the PBS. In the case of a hard
+disk it it the master boot record (MBR).
+The MBR copies itself to address
+.BR 0x600 ,
+finds the active partition and loads its PBS at address
+.BR 0x7C00 .
+A copy of the Plan 9 MBR is kept in
+.BR /Inferno/386/mbr ;
+some commercial MBRs cannot read sectors
+past 2GB.
+The Plan 9 MBR can read sectors up to 8.5GB into
+the disk, and further if the BIOS supports LBA.
+The single file
+.B /Inferno/386/mbr
+detects whether the BIOS supports LBA and
+acts appropriately, defaulting to CHS mode
+when LBA is not present.
+The PBSs cannot do this due to code size considerations.
+The Plan 9 MBR is suitable for booting non-Plan 9
+operating systems,
+and (modulo the large disk constraints just described)
+non-Plan 9 MBRs are suitable for booting Plan 9.
+.PP
+Thus the default sequence is: BIOS, MBR, PBS,
+.IR 9load ,
+kernel.
+.PP
+Because it contains many device drivers for different
+disks and networks,
+.I 9load
+is larger than 64K and cannot be run as a DOS
+.RB `` .com ''
+executable.
+A stripped-down version that knows about disks but not networks,
+called
+.I ld
+(really
+.BR ld.com ),
+fits in 64K and can be used under DOS to load and start a program (default
+.IR 9load )
+from the FAT16 partition.
+Its command line argument is of the same format as the
+.I bootfile
+specifiers described below.
+This profusion of loaders is unfortunate, but at least
+.I ld
+and
+.I 9load
+are compiled from the same source.
+.PP
+.I 9load
+begins execution at address
+.B 0x80010000
+(64K) and
+loads the
+.I bootfile
+at the entry address specified by the header,
+usually
+.BR 0x80100020 .
+After loading, control is passed to the entry location.
+.PP
+Finally,
+.I 9pxeload
+is a version of
+.I 9load
+that can be booted using the PXE download
+found on some ethernet card BIOSs.
+.PP
+In summary,
+Inferno and Plan 9 can be booted on a PC three different ways:
+either by booting MS-DOS and using
+.I ld
+to start
+.I 9load
+in the appropriate directory,
+by booting directly from an Inferno/Plan 9 boot floppy or disk
+partition
+prepared using
+.B format
+to install the appropriate files and bootstrap sectors
+(see
+.IR prep (8)),
+or by using a PXE capable BIOS to boot
+.I 9pxeload
+directly over the ethernet.
+.PP
+The
+.IR bootfile ,
+which may be compressed with
+.IR gzip (1),
+can be specified to
+.I 9load
+as a
+.B bootfile=
+entry in
+.IR plan9.ini ,
+or if booting from the ethernet, by a BOOTP server.
+If the
+.B plan9.ini
+file contains multiple
+.B bootfile=
+entries,
+.I 9load
+will present a numerical menu of the choices; type
+the corresponding number to select an entry.
+.PP
+The format of the
+.I bootfile
+name is
+.IB device ! file
+or
+.IB device ! partition ! file\f1.
+If
+.BI ! file
+is omitted, the default for the particular
+.I device
+is used.
+Supported
+.I devices
+are
+.TF \fLethern
+.TP
+.BI fd n
+An MS-DOS floppy disk.
+.I N
+specifies the floppy drive, either
+0 or 1.
+The
+.I bootfile
+is the contents of the MS-DOS
+.IR file .
+There is no default file.
+For compatibility with hard disks, a
+.I partition
+may be given, but only
+.B dos
+is recognized:
+.BI fd0!dos! file\f1.
+.TP
+.BI ether n
+Ethernet.
+.I N
+specifies the Ethernet device number.
+If a
+.I partition
+is specified, it is taken to be the name of a host machine
+from which to load the kernel.
+.I file
+is determined by the
+.B /lib/ndb
+(see
+.IR ndb (6))
+entry for this PC.
+.TP
+.BI sd Cn
+Non-floppy disk.
+The device name format is described in
+.IR sd (3).
+A
+.I partition
+must be given and must
+name a partition containing a FAT file system.
+The name
+.B dos
+refers to the first DOS partition on a given device.
+It is common for Inferno/Plan 9 partitions to contain a small
+FAT file system for configuration.
+By convention, this partition is called
+.BR 9fat .
+There is no default partition or pathname.
+.PD
+.PP
+When
+.I 9load
+starts running at physical address 0x10000,
+it switches to 32-bit mode.
+It then double maps the first 16Mb of physical memory to
+virtual addresses 0 and 0x80000000.
+Physical memory from 0x300000 upwards is used as data
+space.
+Next, in order to find configuration information,
+.I 9load
+searches all units on devices
+.BR fd
+and
+.BI sd Cn \fR,
+in that order, for a file called
+.B plan9\eplan9.ini
+or
+.B plan9.ini
+(see
+.IR plan9.ini (10.6))
+on a partition named
+.B dos
+or
+.BR 9fat .
+If one is found, searching stops and the file is read into memory
+at physical address 0x1200
+where it can be found later by any loaded
+.IR bootfile .
+Some options in
+.B plan9.ini
+are used by
+.IR 9load :
+.TF bootfile=manual
+.TP
+.B console
+.TP
+.B baud
+Specifies the console device and baud rate if not a display.
+.TP
+.BI ether n
+Ethernet interfaces. These can be used to load the
+.I bootfile
+over a network.
+Probing for Ethernet interfaces is too prone to error.
+.TP
+.BI bootfile= bootfile
+Specifies the
+.IR bootfile .
+This option is overridden by a command-line argument.
+.TP
+.B bootfile=auto
+Default.
+.TP
+.B bootfile=local
+Like
+.IR auto ,
+but do not attempt to load over the network.
+.TP
+.B bootfile=manual
+After determining which devices are available for loading from,
+enter prompt mode.
+.PD
+.PP
+When the search for
+.B plan9.ini
+is done,
+.I 9load
+proceeds to determine which bootfile to load.
+If there was no
+.I bootfile
+option,
+.I 9load
+chooses a default
+from the following prioritized device list:
+.EX
+ fd sd ether
+.EE
+.I 9load
+then attempts to load the
+.I bootfile
+unless
+the
+.B bootfile=manual
+option was given, in which case prompt mode is entered immediately.
+If the default device is
+.BR fd ,
+.I 9load
+will prompt the user for input before proceeding with the
+default bootfile load after 5 seconds;
+this prompt is omitted if
+a command-line argument or
+.I bootfile
+option
+was given.
+.PP
+.I 9load
+prints the list of available
+.IR device s
+and
+enters prompt mode on encountering any error
+or if directed to do so by a
+.B bootfile=manual
+option.
+In prompt mode, the user is required to type
+a
+.IB bootfile
+in response to the
+.L "Boot from:
+prompt.
+.PP
+.I 9load
+parses the master boot record and Plan 9 partition tables
+(see
+.IR prep (8)),
+leaving partitioning information appended to the
+in-memory contents of
+.I plan9.ini
+for the
+.IR bootfile .
+This is used by
+.IR sd (3)
+to initialize partitions so that a
+file system in a partition can be found and mounted as the root file system.
+A more extensive partitioning is typically done by system initialisation in
+.B osinit.dis
+(see
+.IR root (3)).
+.PP
+A
+control-P
+character typed at any time on the console causes
+.B 9load
+to perform a hardware reset
+(Ctrl-Alt-Del can also be used on a PC keyboard).
+.PP
+When loaded from a PBS (rather than from
+.IR ld.com ),
+.I 9load
+must be contiguously allocated on
+the disk.
+See
+.IR dossrv (4)
+for information on ensuring this.
+.SH FILES
+.RI [ drive :]
+[
+.I path
+.RB ] 9load
+.br
+.RI [ drive :]
+[
+.I path
+.RB ] ld
+.br
+.IB "FAT filesystem" :\eplan9\eplan9.ini
+.br
+.IB "FAT filesystem" :\eplan9.ini
+.SH SOURCE
+.B /os/boot/pc
+.SH "SEE ALSO"
+.IR plan9.ini (10.6),
+.IR prep (8)
+.SH BUGS
+Much of the work done by
+.B 9load
+is duplicated by the loaded kernel.
+.PP
+If
+.I ld
+detects an installed MS-DOS Extended Memory Manager,
+it attempts to de-install it, but the technique
+used may not always work.
+It is safer not to install the Extended Memory Manager before running
+.IR ld .
--- /dev/null
+++ b/man/10/INDEX
@@ -1,0 +1,265 @@
+intro 0intro
+0a 2a
+1a 2a
+2a 2a
+5a 2a
+6a 2a
+7a 2a
+8a 2a
+ka 2a
+qa 2a
+va 2a
+0c 2c
+1c 2c
+2c 2c
+5c 2c
+6c 2c
+7c 2c
+8c 2c
+kc 2c
+qc 2c
+vc 2c
+0l 2l
+1l 2l
+2l 2l
+5l 2l
+6l 2l
+7l 2l
+8l 2l
+kl 2l
+ql 2l
+vl 2l
+5coff 5coff
+5cv 5cv
+mkppcimage 5cv
+sqz 5cv
+9load 9load
+9pxeload 9load
+ld 9load
+a.out a.out
+acid acid
+adjustblock allocb
+allocb allocb
+blen allocb
+blocklen allocb
+checkb allocb
+concatblock allocb
+copyblock allocb
+freeb allocb
+freeblist allocb
+iallocb allocb
+packblock allocb
+padblock allocb
+pullblock allocb
+pullupblock allocb
+trimblock allocb
+ar ar
+atoi atoi
+atol atoi
+charstod atoi
+strtod atoi
+strtol atoi
+strtoll atoi
+strtoul atoi
+c2l c2l
+conf conf
+addclock0link delay
+delay delay
+microdelay delay
+dev dev
+devattach devattach
+devbread devattach
+devbwrite devattach
+devclone devattach
+devcreate devattach
+devdir devattach
+devdirread devattach
+devgen devattach
+devinit devattach
+devopen devattach
+devremove devattach
+devreset devattach
+devshutdown devattach
+devstat devattach
+devwalk devattach
+devwstat devattach
+openmode devattach
+dmacount dmainit
+dmadone dmainit
+dmaend dmainit
+dmainit dmainit
+dmasetup dmainit
+dynfindsym dynld
+dynfreeimport dynld
+dynld dynld
+dynloadfd dynld
+dynloadgen dynld
+dynobjfree dynld
+dyntabsize dynld
+error error
+nexterror error
+poperror error
+waserror error
+eve eve
+iseve eve
+getfields getfields
+tokenize getfields
+iar iar
+inb inb
+inl inb
+ins inb
+insb inb
+insl inb
+inss inb
+outb inb
+outl inb
+outs inb
+outsb inb
+outsl inb
+outss inb
+inm inm
+intrdisable intrenable
+intrenable intrenable
+kbdclock kbdputc
+kbdputc kbdputc
+kbdq kbdputc
+kbdrepeat kbdputc
+kproc kproc
+pexit kproc
+setpri kproc
+swiproc kproc
+kprof kprof
+ksize ksize
+kstrip kstrip
+canlock lock
+ilock lock
+iunlock lock
+lock lock
+unlock lock
+calloc malloc
+free malloc
+malloc malloc
+mallocz malloc
+realloc malloc
+smalloc malloc
+master master
+master.local master
+memccpy memory
+memchr memory
+memcmp memory
+memcpy memory
+memmove memory
+memory memory
+memset memory
+mk mk
+ms2 ms2
+cclose newchan
+chanfree newchan
+eqchan newchan
+eqqid newchan
+fdtochan newchan
+isdir newchan
+namec newchan
+newchan newchan
+ntsrv ntsrv
+odbc odbc
+panic panic
+parsecmd parsecmd
+plan9.ini plan9.ini
+fprint print
+print print
+seprint print
+smprint print
+snprint print
+sprint print
+vfprint print
+vseprint print
+vsmprint print
+vsnprint print
+qbread qio
+qbwrite qio
+qcanread qio
+qclose qio
+qconsume qio
+qcopy qio
+qdiscard qio
+qflush qio
+qfree qio
+qfull qio
+qget qio
+qhangup qio
+qio qio
+qiwrite qio
+qlen qio
+qnoblock qio
+qopen qio
+qpass qio
+qproduce qio
+qread qio
+qreopen qio
+qsetlimit qio
+qwindow qio
+qwrite qio
+canqlock qlock
+qlock qlock
+qunlock qlock
+rlock qlock
+runlock qlock
+wlock qlock
+wunlock qlock
+readnum readnum
+readstr readnum
+decref ref
+incref ref
+ref ref
+chartorune rune
+fullrune rune
+rune rune
+runelen rune
+runetochar rune
+utflen rune
+utfrrune rune
+utfrune rune
+utfutf rune
+hz seconds
+ms2hz seconds
+ms2tk seconds
+seconds seconds
+ticks seconds
+tk2ms seconds
+tk2sec seconds
+return0 sleep
+sleep sleep
+tsleep sleep
+wakeup sleep
+islo splhi
+splhi splhi
+spllo splhi
+splx splhi
+srclist srclist
+strcat strcat
+strchr strcat
+strcmp strcat
+strcpy strcat
+strdup strcat
+strlen strcat
+strncmp strcat
+strncpy strcat
+strrchr strcat
+strstr strcat
+convd2m styx
+convm2d styx
+convm2s styx
+convs2m styx
+dirfmt styx
+dirmodefmt styx
+fcall styx
+fcallfmt styx
+sized2m styx
+sizes2m styx
+statcheck styx
+styx styx
+styxserver styxserver
+xalloc xalloc
+xfree xalloc
+xspanalloc xalloc
--- /dev/null
+++ b/man/10/a.out
@@ -1,0 +1,242 @@
+.TH A.OUT 10.6
+.SH NAME
+a.out \- native kernel object file format
+.SH SYNOPSIS
+.B #include <a.out.h>
+.SH DESCRIPTION
+An executable native binary file has up to six sections:
+a header, the program text, the data,
+a symbol table, a PC/SP offset table (MC680x0 only),
+and finally a PC/line number table.
+The header, given by a structure in
+.BR <a.out.h> ,
+contains 4-byte integers in big-endian order:
+.PP
+.EX
+typedef struct Exec {
+ long magic; /* magic number */
+ long text; /* size of text segment */
+ long data; /* size of initialized data */
+ long bss; /* size of uninitialized data */
+ long syms; /* size of symbol table */
+ long entry; /* entry point */
+ long spsz; /* size of pc/sp offset table */
+ long pcsz; /* size of pc/line number table */
+} Exec;
+#define _MAGIC(b) ((((4*b)+0)*b)+7)
+#define A_MAGIC _MAGIC(8) /* 68020 */
+#define I_MAGIC _MAGIC(11) /* intel 386 */
+#define J_MAGIC _MAGIC(12) /* intel 960 */
+#define K_MAGIC _MAGIC(13) /* sparc */
+#define V_MAGIC _MAGIC(16) /* mips 3000 */
+#define X_MAGIC _MAGIC(17) /* att dsp 3210 */
+#define M_MAGIC _MAGIC(18) /* mips 4000 */
+#define D_MAGIC _MAGIC(19) /* amd 29000 */
+#define E_MAGIC _MAGIC(20) /* arm 7-something */
+#define Q_MAGIC _MAGIC(21) /* powerpc */
+#define N_MAGIC _MAGIC(22) /* mips 4000-le */
+#define L_MAGIC _MAGIC(23) /* dec alpha */
+.EE
+.DT
+.PP
+Sizes are expressed in bytes.
+The size of the header is not included in any of the other sizes.
+.PP
+When a Plan 9 binary file is executed,
+a memory image of three segments is
+set up: the text segment, the data segment, and the stack.
+The text segment begins at a virtual address which is
+a multiple of the machine-dependent page size.
+The text segment consists of the header and the first
+.B text
+bytes of the binary file.
+The
+.B entry
+field gives the virtual address of the entry point of the program.
+The data segment starts at the first page-rounded virtual address
+after the text segment.
+It consists of the next
+.B data
+bytes of the binary file, followed by
+.B bss
+bytes initialized to zero.
+The stack occupies the highest possible locations
+in the core image, automatically growing downwards.
+.PP
+The next
+.B syms
+(possibly zero)
+bytes of the file contain symbol table
+entries, each laid out as:
+.IP
+.EX
+uchar value[4];
+char type;
+char name[\f2n\fP]; /* NUL-terminated */
+.EE
+.PP
+The
+.B value
+is in big-endian order and
+the size of the
+.B name
+field is not pre-defined: it is a zero-terminated array of
+variable length.
+.PP
+The
+.B type
+field is one of the following characters:
+.RS
+.TP
+.B T
+text segment symbol
+.PD0
+.TP
+.B t
+static text segment symbol
+.TP
+.B L
+leaf function text segment symbol
+.TP
+.B l
+static leaf function text segment symbol
+.TP
+.B D
+data segment symbol
+.TP
+.B d
+static data segment symbol
+.TP
+.B B
+bss segment symbol
+.TP
+.B b
+static bss segment symbol
+.TP
+.B a
+automatic (local) variable symbol
+.TP
+.B p
+function parameter symbol
+.RE
+.PD
+.PP
+A few others are described below.
+The symbols in the symbol table appear in the same order
+as the program components they describe.
+.PP
+The Plan 9 compilers implement a virtual stack frame pointer rather
+than dedicating a register;
+moreover, on the MC680x0
+there is a variable offset between the stack pointer and the
+frame pointer.
+Following the symbol table,
+MC680x0 executable files contain a
+.BR spsz -byte
+table encoding the offset
+of the stack frame pointer as a function of program location;
+this section is not present for other architectures.
+The PC/SP table is encoded as a byte stream.
+By setting the PC to the base of the text segment
+and the offset to zero and interpreting the stream,
+the offset can be computed for any PC.
+A byte value of 0 is followed by four bytes that hold, in big-endian order,
+a constant to be added to the offset.
+A byte value of 1 to 64 is multiplied by four and added, without sign
+extension, to the offset.
+A byte value of 65 to 128 is reduced by 64, multiplied by four, and
+subtracted from the offset.
+A byte value of 129 to 255 is reduced by 129, multiplied by the quantum
+of instruction size
+(e.g. two on the MC680x0),
+and added to the current PC without changing the offset.
+After any of these operations, the instruction quantum is added to the PC.
+.PP
+A similar table, occupying
+.BR pcsz -bytes,
+is the next section in an executable; it is present for all architectures.
+The same algorithm may be run using this table to
+recover the absolute source line number from a given program location.
+The absolute line number (starting from zero) counts the newlines
+in the C-preprocessed source seen by the compiler.
+Three symbol types in the main symbol table facilitate conversion of the absolute
+number to source file and line number:
+.RS
+.TP
+.B f
+source file name components
+.TP
+.B z
+source file name
+.TP
+.B Z
+source file line offset
+.RE
+.PP
+The
+.B f
+symbol associates an integer (the
+.B value
+field of the `symbol') with
+a unique file path name component (the
+.B name
+of the `symbol').
+These path components are used by the
+.B z
+symbol to represent a file name: the
+first byte of the name field is always 0; the remaining
+bytes hold a zero-terminated array of 16-bit values (in big-endian order)
+that represent file name components from
+.B f
+symbols.
+These components, when separated by slashes, form a file name.
+The initial slash of a file name is recorded in the symbol table by an
+.B f
+symbol; when forming file names from
+.B z
+symbols an initial slash is not to be assumed.
+The
+.B z
+symbols are clustered, one set for each object file in the program,
+before any text symbols from that object file.
+The set of
+.B z
+symbols for an object file form a
+.I history stack
+of the included source files from which the object file was compiled.
+The value associated with each
+.B z
+symbol is the absolute line number at which that file was included in the source;
+if the name associated with the
+.B z
+symbol is null, the symbol represents the end of an included file, that is,
+a pop of the history stack.
+If the value of the
+.B z
+symbol is 1 (one),
+it represents the start of a new history stack.
+To recover the source file and line number for a program location,
+find the text symbol containing the location
+and then the first history stack preceding the text symbol in the symbol table.
+Next, interpret the PC/line offset table to discover the absolute line number
+for the program location.
+Using the line number, scan the history stack to find the set of source
+files open at that location.
+The line number within the file can be found using the line numbers
+in the history stack.
+The
+.B Z
+symbols correspond to
+.B #line
+directives in the source; they specify an adjustment to the line number
+to be printed by the above algorithm. The offset is associated with the
+first previous
+.B z
+symbol in the symbol table.
+.SH "SEE ALSO"
+.IR acid (10.1),
+.IR 2a (10.1),
+.IR 2l (10.1),
+.IR inm (10.1)
+.SH BUGS
+There is no type information in the symbol table.
--- /dev/null
+++ b/man/10/acid
@@ -1,0 +1,373 @@
+.TH ACID 10.1
+.SH NAME
+acid \- debugger
+.SH SYNOPSIS
+.B acid
+[
+.BI -l " libfile
+]
+[
+.B -wq
+] [
+.B -m
+.I machine
+] [
+.I pid
+]
+[
+.I textfile
+]
+.SH DESCRIPTION
+.I Acid
+is a programmable symbolic debugger.
+It can inspect one or more processes that share an address space.
+A program to be debugged may be specified by the process id of
+a running or defunct process,
+or by the name of the program's text file
+.RB ( v.out
+by default).
+At the prompt,
+.I acid
+will store function definitions or print the value of expressions.
+Options are
+.TP .9i
+.B -w
+Allow the textfile to be modified.
+.TP
+.B -q
+Don't print variable renamings at startup.
+.TP
+.BI -l " library
+Load from
+.I library
+at startup; see below.
+.TP
+.BI -m " machine
+Assume instructions are for the given CPU type
+(one of
+.BR 386 ,
+.BR 86 ,
+.BR 68020 ,
+.BR 960 ,
+.BR power ,
+.BR arm ,
+.BR mips ,
+.BR mipsco ,
+.BR sparc ,
+or
+.BR sunsparc )
+instead of using the magic number to select
+the CPU type.
+.PP
+At startup,
+.I acid
+obtains standard function definitions from the library file
+.BR /lib/acid/port ,
+architecture-dependent functions from
+.BR /lib/acid/$objtype ,
+user-specified functions from
+.BR $home/lib/acid ,
+and further functions from
+.B -l
+files.
+Definitions in any file may override previously defined functions.
+If the function
+.IR acidinit ()
+is defined, it will be invoked after all modules have been loaded.
+See
+.IR 2c (10.1)
+for information about creating
+.I acid
+functions for examining data structures.
+.SS Language
+Symbols of the program being debugged become integer
+variables whose values are addresses.
+Contents of addresses are obtained by indirection.
+Local variables are qualified by
+function name, for example
+.BR main:argv .
+When program symbols conflict with
+.I acid
+words, distinguishing
+.B $
+signs are prefixed.
+Such renamings are reported at startup; option
+.B -q
+suppresses them.
+.PP
+Variable types
+.RI ( "integer, float, list, string" )
+and formats are inferred from assignments.
+Truth values false/true are attributed to zero/nonzero
+integers or floats and to empty/nonempty lists or strings.
+Lists are sequences of expressions surrounded by
+.BR {\^}
+and separated by commas.
+.PP
+Expressions are much as in C,
+but yield both a value and a format.
+Casts to complex types are allowed.
+Lists admit the following operators, with
+subscripts counted from 0.
+.IP
+.BI head " list
+.br
+.BI tail " list
+.br
+.BI append " list", " element
+.br
+.BI delete " list", " subscript
+.PP
+Format codes are the same as in
+.IR db (10.1).
+Formats may be attached to (unary) expressions with
+.BR \e ,
+e.g.
+.BR (32*7)\eD .
+There are two indirection operators,
+.B *
+to address a core image,
+.B @
+to address a text file.
+The type and format of the result are determined by the format of the operand,
+whose type must be integer.
+.PP
+Statements are
+.IP
+.BI if " expr " then " statement " "\fR[ \fPelse\fI statement \fR]
+.br
+.BI while " expr " do " statement
+.br
+.BI loop " expr" , " expr " do " statement
+.br
+.BI defn " name" ( args ") {" " statement \fP}
+.br
+.BI local " name
+.br
+.BI return " expr
+.br
+.BR whatis " [ \fI name \fP]
+.PP
+Here is a partial list of functions; see the manual for a complete list.
+.TF asm(address)
+.TP
+.B stk()
+Print a stack trace for current process.
+.TP
+.B lstk()
+Print a stack trace with values of local variables.
+.TP
+.B gpr()
+Print general registers.
+Registers can also be accessed by name, for example
+.BR *R0 .
+.TP
+.B spr()
+Print special registers such as program counter and stack pointer.
+.TP
+.B fpr()
+Print floating-point registers.
+.TP
+.B regs()
+Same as
+.BR spr();gpr() .
+.TP
+.BI fmt( expr , format )
+Expression
+.I expr
+with format given by the character value of expression
+.IR format .
+.TP
+.BI src( address )
+Print 10 lines of source around the program address.
+.TP
+.BI Bsrc( address )
+Get the source line for the program address
+into a window of a running
+editor
+and select it.
+(This works only on Plan 9, or a Unix-like system running `Plan 9 Ports'.)
+.TP
+.BI line( address )
+Print source line nearest to the program address.
+.TP
+.B source()
+List current source directories.
+.TP
+.BI addsrcdir( string )
+Add a source directory to the list.
+.TP
+.BI filepc( where )
+Convert a string of the form
+.IB sourcefile : linenumber
+to a machine address.
+.TP
+.BI pcfile( address )
+Convert a machine address to a source file name.
+.TP
+.BI pcline( address )
+Convert a machine address to a source line number.
+.TP
+.BI bptab()
+List breakpoints set in the current process.
+.TP
+.BI bpset( address )
+Set a breakpoint in the current process at the given address.
+.TP
+.BI bpdel( address )
+Delete a breakpoint from the current process.
+.TP
+.B cont()
+Continue execution of current process and wait for it to stop.
+.TP
+.B step()
+Execute a single machine instruction in the current process.
+.TP
+.B func()
+Step repeatedly until after a function return.
+.TP
+.BI stopped( pid )
+This replaceable function is called automatically when the given process
+stops.
+It normally prints the program counter and returns to the prompt.
+.TP
+.BI asm( address )
+Disassemble 30 machine instructions beginning at the given address.
+.TP
+.BI mem( address , string )
+Print a block of memory
+interpreted according to a string of format codes.
+.TP
+.BI dump( address , n , string\fP)
+Like
+.BR mem (),
+repeated for
+.I n
+consecutive blocks.
+.TP
+.BI print( expr , ... )
+Print the values of the expressions.
+.TP
+.BI newproc( arguments )
+Start a new process with arguments given as a string
+and halt at the first instruction.
+.TP
+.B new()
+Like
+.IR newproc (),
+but take arguments (except
+.BR argv[0] )
+from string variable
+.BR progargs .
+.TP
+.B win()
+Like
+.IR new (),
+but run the process in a separate window.
+.TP
+.BI start( pid )
+Start a stopped process.
+.TP
+.BI kill( pid )
+Kill the given process.
+.TP
+.BI setproc( pid )
+Make the given process current.
+.TP
+.BI rc( string )
+Escape to the shell,
+.....IR rc (10.1),
+to execute the command string.
+.SH EXAMPLES
+Start to debug
+.BR /bin/ls ;
+set some breakpoints; run up to the first one:
+.IP
+.EX
+% acid /bin/ls
+/bin/ls: mips plan 9 executable
+/lib/acid/port
+/lib/acid/mips
+acid: new()
+70094: system call _main ADD $-0x14,R29
+70094: breakpoint main+0x4 MOVW R31,0x0(R29)
+acid: pid
+70094
+acid: argv0 = **main:argv\es
+acid: whatis argv0
+integer variable format s
+acid: *argv0
+/bin/ls
+acid: bpset(ls)
+acid: cont()
+70094: breakpoint ls ADD $-0x16c8,R29
+acid:
+.EE
+.PP
+Display elements of a linked list of structures:
+.IP
+.EX
+complex Str { 'D' 0 val; 'X' 4 next; };
+complex Str s;
+s = *headstr;
+while s != 0 do{
+ print(s.val, "\en");
+ s = s.next;
+}
+.EE
+.PP
+Note the use of the
+.B .
+operator instead of
+.BR -> .
+.PP
+Display an array of bytes declared in C as
+.BR "char array[]" .
+.IP
+.EX
+*(array\es)
+.EE
+.PP
+This example gives
+.B array
+string format, then prints the string beginning at the address (in
+.I acid
+notation)
+.BR *array .
+.SH FILES
+.B /proc/*/text
+.br
+.B /proc/*/mem
+.br
+.B /proc/*/ctl
+.br
+.B /proc/*/note
+.br
+.B /lib/acid/$objtype
+.br
+.B /lib/acid/port
+.br
+.B $home/lib/acid
+.SH SOURCE
+.B /utils/acid
+.SH "SEE ALSO"
+.IR 2a (10.1),
+.IR 2c (10.1),
+.IR 2l (10.1),
+.IR mk (10.1),
+.IR db (10.1)
+.br
+Phil Winterbottom,
+``Acid Manual''.
+.SH DIAGNOSTICS
+At termination, kill commands are proposed
+for processes that are still active.
+.SH BUGS
+There is no way to redirect the standard input and standard output
+of a new process.
+.br
+Source line selection near the beginning of a file may pick
+an adjacent file.
+.br
+With the extant stepping commands, one cannot step through instructions
+outside the text segment and it is hard to debug across process forks.
--- /dev/null
+++ b/man/10/allocb
@@ -1,0 +1,314 @@
+.TH ALLOCB 10.2
+.SH NAME
+allocb, iallocb, freeb, freeblist, BLEN, blocklen, concatblock, copyblock, trimblock, packblock, padblock, pullblock, pullupblock, adjustblock, checkb \- data block management
+.SH SYNOPSIS
+.ta \w'\fLBlock* 'u
+.B
+Block* allocb(int size)
+.PP
+.B
+Block* iallocb(int size)
+.PP
+.B
+void freeb(Block *b)
+.PP
+.B
+void freeblist(Block *b)
+.PP
+.B
+long BLEN(Block *b)
+.PP
+.B
+int blocklen(Block *b)
+.PP
+.B
+Block* concatblock(Block *b)
+.PP
+.B
+Block* copyblock(Block *b, int n)
+.PP
+.B
+Block* trimblock(Block *b, int offset, int n)
+.PP
+.B
+Block* packblock(Block *b)
+.PP
+.B
+Block* padblock(Block *b, int n)
+.PP
+.B
+int pullblock(Block **bph, int n)
+.PP
+.B
+Block* pullupblock(Block *b, int n)
+.PP
+.B
+Block* adjustblock(Block *b, int n)
+.PP
+.B
+void checkb(Block *b, char *msg)
+.SH DESCRIPTION
+A
+.B Block
+provides a receptacle for data:
+.IP
+.EX
+.DT
+typedef
+struct Block
+{
+ Block* next;
+ Block* list;
+ uchar* rp; /* first unconsumed byte */
+ uchar* wp; /* first empty byte */
+ uchar* lim; /* 1 past the end of the buffer */
+ uchar* base; /* start of the buffer */
+ void (*free)(Block*);
+ ulong flag;
+} Block;
+.EE
+.PP
+Each
+.B Block
+has an associated buffer, located at
+.BR base ,
+and accessed via
+.B wp
+when filling the buffer, or
+.B rp
+when fetching data from it.
+Each pointer should be incremented to reflect the amount of data written or read.
+A
+.B Block
+is empty when
+.B rp
+reaches
+.BR wp .
+The pointer
+.B lim
+bounds the allocated space.
+Some operations described below accept lists of
+.BR Block s,
+which are
+chained via their
+.B next
+pointers, with a null pointer ending the list.
+.B Blocks
+are usually intended for a
+.B Queue
+(see
+.IR qio (10.2)),
+but can be used independently.
+.PP
+A
+.B Block
+and its buffer are normally allocated by one call to
+.IR malloc (10.2)
+and aligned on an 8 byte (\fLBY2V\fP) boundary.
+Some devices with particular allocation constraints
+(eg, requiring certain addresses for DMA) might allocate their own
+.B Block
+and buffer;
+.B free
+must then point to a function that can deallocate the specially allocated
+.BR Block .
+.PP
+Many
+.B Block
+operations cannot be used in interrupt handlers
+because they either
+.IR sleep (10.2)
+or raise an
+.IR error (10.2).
+Of operations that allocate blocks, only
+.IR iallocb
+is usable.
+.PP
+.I Allocb
+allocates a
+.B Block
+of at least
+.IR size
+bytes.
+The block
+is initially empty:
+.B rp
+and
+.B wp
+point to the start of the data.
+If it cannot allocate memory,
+.I allocb
+raises an
+.IR error (10.2);
+it cannot be used by an interrupt handler.
+.PP
+.IR Iallocb
+is similar to
+.IR allocb
+but is intended for use by interrupt handlers,
+and returns a null pointer if no memory is available.
+It also limits its allocation to a quota allocated at system initialisation to interrupt-time buffering.
+.PP
+.I Freeb
+frees a single
+.B Block
+(and its buffer).
+.PP
+.I Freeblist
+frees the whole
+list of blocks headed by
+.IR b .
+.PP
+.I BLEN
+returns the number of unread bytes in a single block
+.IR b ;
+it is implemented as a macro.
+.PP
+.I Blocklen
+returns the number of bytes of unread data in the whole list of blocks headed by
+.IR b .
+.PP
+.I Concatblock
+returns
+.I b
+if it is not a list, and otherwise
+returns a single
+.B Block
+containing all the data in the list of blocks
+.IR b ,
+which it frees.
+.PP
+.I Copyblock
+by contrast returns a single
+.B Block
+containing a copy of the first
+.I n
+bytes of data in the block list
+.IR b ,
+padding with zeroes if the list contained less than
+.I n
+bytes.
+The list
+.I b
+is unchanged.
+.PP
+.I Padblock
+can pad a single
+.B Block
+at either end, to reserve space for protocol headers or trailers.
+If
+.IR n ≥ 0 ,
+it inserts
+.I n
+bytes at the start of the block,
+setting the read pointer
+.B rp
+to point to the new space.
+If
+.IR n < 0 ,
+it adds
+.I n
+bytes at the end of the block,
+leaving the write pointer
+.B wp
+pointing at the new space.
+In both cases, it allocates a new
+.B Block
+if necessary, freeing the old, and
+it always returns a pointer to the resulting
+.BR Block .
+.PP
+.I Trimblock
+trims the list
+.I b
+to contain no more than
+.I n
+bytes starting at
+.I offset
+bytes into the data of the original list.
+It returns a new list, freeing unneeded parts of the old.
+If no data remains, it returns a null pointer.
+.PP
+.I Packblock
+examines each
+.B Block
+in the list
+.IR b ,
+reallocating any block in the list that has four times more available space than actual data.
+It returns a pointer to the revised list.
+.PP
+.I Pullblock
+discards up to
+.I n
+bytes from the start of the list headed by
+.BI * bph \f1.\f0
+Unneeded blocks are freed.
+.I Pullblock
+sets
+.BI * bph
+to point to the new list head
+and returns the number of bytes discarded (which might be less than
+.IR n ).
+It is used by transport protocols to discard ack'd data at
+the head of a retransmission queue.
+.PP
+.I Pullupblock
+rearranges the data in the list of blocks
+.I b
+to ensure that there are at least
+.I n
+bytes of contiguous data in the first block,
+and returns a pointer to the new list head.
+It frees any blocks that it empties.
+It returns a null pointer if there is not enough data in the list.
+.PP
+.I Adjustblock
+ensures that the block
+.I b
+has at least
+.I n
+bytes of data, reallocating or padding with zero if necessary.
+It returns a pointer to the new
+.BR Block .
+(If
+.I n
+is negative, it frees the block and returns a null pointer.)
+.PP
+.I Checkb
+does some consistency checking of
+the state of
+.IR b ;
+a
+.IR panic (10.2)
+results if things look grim.
+It is intended for internal use by the queue I/O routines (see
+.IR qio (10.2))
+but could be used elsewhere.
+.PP
+The only functions that can be called at interrupt level are
+.IR iallocb ,
+.IR freeb ,
+.IR freeblist ,
+.IR BLEN ,
+.IR blocklen ,
+.IR trimblock
+and
+.IR pullupblock .
+The others allocate memory and can potentially block.
+.SH DIAGNOSTICS
+Many functions directly or indirectly can raise an
+.IR error (10.2),
+and callers must therefore provide for proper error recovery
+as described therein to prevent memory leaks and other bugs.
+Except for
+.IR iallocb ,
+any functions that allocate new blocks or lists
+are unsuitable for use by interrupt handlers.
+.IR Iallocb
+returns a null pointer when it runs out of memory.
+.SH SOURCE
+.B /os/port/qio.c
+.br
+.B /emu/port/qio.c
+.SH SEE ALSO
+.IR qio (10.2)
--- /dev/null
+++ b/man/10/ar
@@ -1,0 +1,98 @@
+.TH AR 10.6
+.SH NAME
+ar \- archive (library) file format
+.SH SYNOPSIS
+.B #include <ar.h>