IMD 1.16: 28/05/2007 16:54:38 -FOG/UTL029         -FOG/UTL029CAL C 0CAT C CH C CMP C COMM C "CRT C DISK DOC +FIND C $HCAT C INCL C  !KWIC C "LLINE C #LPR C $%MAKDOC C &'README UTS()UTDIR COMPVSPLIT COMG WC COM< CRCKLISTCRC**K͞+((D1'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o  #z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r!͐+! ~#fo##ͭ`i6#6͐͐]! ~#fo͐)~#fo!Ͱ`i^#Vr+s#ͳ!9utdir: error in wildexputdir: no matching files%s !9DM͐ ~#fo`is#r͐ ~#fo! s#r! w#w`i~#fo͐n! ~#fo͐n} `i~#fo! ^#V+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77r+sn} !@ `i~#fo͐n! ~#fo͐nѯgW@ !9^ :ÓÞÖq!9DM*s*s*s! ~#fo͐ ~#fo)* s#r*6**s#r! 6#6`i6#6͐͐ ~#fo w} ! ~#fo͐)!a{   `OE!y6$ -7rBo&))T])))!y':7?h#D/6:?>$:?$:)?$l,:>#)Ÿ#>67:+?7#*+?|°#2ͩ7#>67:+?7>#7>67:,?7#*+?"?)~#fon}< | +N >e ó ! ~#fo͐)~#fo#n}< À *! ~#fo͐)~#fo#L #|Œ ! ~#fo͐)~#fo#! !O R *6! ! ~#fo͐)~#foU | *n&|g}os *4! ~#fo͐)~#fo#* s#r! ~#>7:+?7>s7>@2?#2ͩ7#)$:"?=2"?))$>s7#͎)5$2:>/$2ͩ7#3ͩ7#* ?"?*+?"?:)?ʟ$:>€$)s$>>7:+?72ͩ7#2ͩ72?#)s$>7:+?7>{72ͩ7#)¸$:)?‘$>}72v$:)?1.͎)$>&773v$:)#fo͐)~#fo#n}K ! ~#fo͐)! s#r! ~#fo͐)* s#re *n&|g}os! ~#fo͐)~#fo#n} ! !O R ! ~#fo͐)~#fo#X *! ~#fo͐)~#fo#[ #| ! ~#fo͐)~#fo#! !O R *?$l,Ä#:?$u-l,$:)?>%>7l,>7>@2)?$* ?"?R3ͩ7:?2?"?|O%}@%3ͩ7V%C%4ͩ7>G>)7[%#͔+:*ͅ-öÞ! I e+ !9DM! ! ͤ#|!iͧ͐! ͪ͐+|!ͧ*4w}Š ͐! s#r͐͐ ~#fod ! ~#fo͐)! ~#fo͐#)~#fos#r! ^#Vr+s ͐ ^#Vr+s`i^#Vr+s* ^#Vr+sð ͐ ͐s#r! ~#fo͐ ~#fo)w#wþ ! ^#Vr+s`i^#Vr+s !9Can't open %s '>N>3>\>?>o>K>ʂí! n&! n&!! n&!! n} š! !! n&!͐##^#Vr+s| !͐͐~#fo|!͐##6#6͐is#6͐|!3͐|,`i6 #6͐3!9K:Óv!9DM!E`is#rw}! n} Œ͐n} ʌ*! ?͐! ns*! n&?#|!F!BEw&|g}o|<! H|!H+++|E! ns#r͐^#Vr+s! ns&8gø!9DM͐Q!n͐##~#fo|j!n͐##~#fo`is#r͐͐͐~#fo/͐ʷ!n͐+?`is#r͐##~#fo|G!͐͐͐2͐##} ͐n} ! !H! n&!H͐! ns!9File output error; disk full? kÌ!9DM͐͐k! s#r͉͐! s#r͐|ʽ͐͐k! s#r͐͐! s#r͐͐! s#r͐ `is#r͐͐ڥ͐͐~#fo͐s#r͐~#fo͐s#r!!͐~#fo5n͐##6#6͐͐s#r!n!9ÃKv#!9DM͐|šzF͐+++|±!}F͐##^#Vr+s|/!͐͐~#fò`is#r!|͐##^#Vr+s ! s#r͐|ڏ͐͐ ͐͐͐!B!9~#fo|QÏ͐ ͐͐͐͐h! ~#fo͐s#r`i~#fo͐s#r! ~#fo͉s#rÛ!9T!y9DM! `i`i!9Ç!9F͐##͐?+s#r͐͐s#r͐^#Vr+sn&F!9!9DM`iw#w! ^#Vr+sn}|`i^#Vr+s]͐Ã!9Òg!9DM̓`i̓͏̓̓̓ ͏̓̓ `i͏!9Ø*!h9DM!   ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{E`in}%/! ! s#r! 6#6! s! s! s͐n}-„! ^#Vr+s! 4͐n}0”! 4͐n&}ʱ! ô!! s#r! ^#Vr+sn`is{.! ! s#r! 4! ^#Vr+sn`is`in&#Vr+snѯg`is#r͐!!90d!9DM! n&-|W! n&^! n&&!9DM! n&|ͯڏ! n&|ͩ  !\&!7*!&*!&!&="&! BL<"e}D(UdXmOvCʼS͐~#fo|d! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 |! 6|! 6! ~#fo! n&! ^#Vr+s~#fo! ѯgs#re! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+se! n}! 6#6=L=Ù7*^#V#zx2D+V+^+'* :Do&9! !j96  #F#xq~#d7:O*7,2q*&:q):==r:qo&ÖÇ7*\!*#! ^#Vr+s~#fo! s#r͐n}e͐|e! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s͐6! ! s#r! n}¼! ^#Vr+s!|ڼ! ^#Vr+s! n}ʳ!0ö! sÁ͐! ^#Vr+sns{! ^#Vr+sü! n}! ^#Vr+s!|7:)~:,"s!"u*|*ue*~#<"*s*ue#"u*+")7*|DM**ږ><~# xŠ ><~+ x¦|}þô 7:,*ͻ:*}|2q ! ^#Vr+s6 ,! ^#Vr+s`insB! ^#Vr+s`ins#͐6!9Z<!9DM͐n}ʄ! ^#Vr+sn&WbÌ!9DM! ^#Vr+sn`is{`in} ͐! ͉͐`in&͉#|!Ô!!9!9DM͐:qw! {w7:)~:,"s!"u*|y**s~! ~y6*u*+"*"*u#"uE7*!9& 6C#6O#6M*|!\&!\&*|!!l&!9͐ D͐^#Vr+s͐1͐09͐7s!&Ï͐ ͐͐ ͉͐`is͐ ͐͐ )͐`in&#&Ï!9!9DM! n&|ͯ! n&|ͩØ!9DM`iw#w͐~#fon&}͐ ?͐^~#fo > +́ #~ ## xSJ 2  EXECL: Too much text $!p !*w#V *:1p *y !y !a{ ѷ! , FNxg>Goy $ ÆÓ+ !9DM!͐ !  !! 0!vM($~(@%O(h&!9DM!!!n s͐{~#fo! s#r͐y~#fo! s#r`i6#6!l w#w!!! s#rz‘!!$!o 6#6͐o͐#! ~#fo͐o)~#fon}!%"͐o+|!! ~#fo͐)!$s#r! ^#Vr+s!l ^#Vr+sn} &G&! ~#fo! ^#Vr+s! ~#fo͐ns`i^#Vr+s%! ~#fo͐6͐_&!9!9DM! ~#fo#n}:&! ~#fo#n}:&! ~#fon&! n&&! ~#fo##s#r&!''! ~#fo#n}:'! ~#fon&! n& '! ~#f)!D ! ~#fo͐o)~#fo#s#r#! ~#fo͐o)~#fo!|w"! ~#fo`i^#Vr+s)! ~#fo͐o)~#fos#r#! ~#fo͐o)~#fo! !!!. !B s#r! ~#fo͐o)~#fo#n!/ s{:#! ~#fo͐o)~#fon!. s!0 !B s#r!. n&!!o##s#r'!'! ^#Vr+sn`is{'`in}?`'! ^#Vr+sn`is{W'`in}.W'']'!''`in}*¼'͐n`is{ʑ'! ^#Vr+s`in}.Ž'Ñ'i'͐n`is{ʹ'! ^#Vr+s`in}.¶'ù'Ñ''`in! ^#Vr+sn}'''!''͐n}'!''!'!!- 6! !- n}#!#!!!, s!, n}8#ô#!- 6!, n& ?͐B$!! ~#fo͐)!. '!#!s#rz‹#!$!. ! ~#fo`i^#Vr+s)~#fo*!#!n n&!!!o ^#Vr+sÚ!!o w#w͐o͐l$!q 6#6͐q͐9!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{=((͐D(!9 *s(+*|/g}/o#9w(s(#"z{7*~# ʅ( ʅ(+*&!7Һ$!n n&! ~#fo͐q)~#fo͐o)!D ~#fo-!|ʬ$͐q`i^#Vr+sT$ì$͐q!s s#r͐s͐ҩ$! ~#fo͐s)! ~#fo͐s#)~#fos#r!s ^#Vr+s`$$!q ^#Vr+s#!o ^#Vr+s#͐y͐s#r͐{͐s#r!$!u9*.*!9DM!*K͞+q$q$-'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z ^#Vr+sn`is{1%`in}*(%`in}?.%!7%$!7%!9!9DM! w#w`i6#6͐|ҵ%! ~#fo͐n} }%õ%! ~#fo! ^#Vr+s! ~#fo͐ns`i^#Vr+sW%! ~#fo n} %! ~#fo! ^#Vr+s6.`i6 #6͐|G&! ~#fo7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o  #z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2rͧ|! s#r`is#rñ! ! ~#fo##~#foͧ|K`i6#6! w#wñ! ! ~#fo##~#foͧ|z`iw#w! 6#6ñ! ! ~#fo##~#foͧ|ʩ! s#r`is#rñ! ͤ! ~#fo~#foͪ! s#r!! ͭ|j ! Ͱ+! 6͐| ! +w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77! ͐! ͳ5 ! ! ͐! Ͷ͐|T ! ! !͹g ! ! !͹ͼ!9usage: vsplit option colLLLRRLRRvsplit: valid options are ll lr rl rr%s %s 0ü!9DM! ~#fon} ! ~#fo! ~#foss !a{   `OE!y6$ -7rBo&))T])))!y':7?h#D/6:?>$:?$:)?$l,:>#)Ÿ#>67:+?7#*+?|°#2ͩ7#>67:+?7>#7>67:,?7#*+?"?) ͐ |* ! ~#fo6͐͐ ͐ ͐ [ ͐͐ ! ~#fo6 `iw#w͐͐ Ҡ ! ~#fo͐! ~#fo͐ns`i^#Vr+sa ! ~#fo͐6! w#w! ~#fo͐! ~#fo`i^#Vr+sns! ~#fo͐n} ! ^#>7:+?7>s7>@2?#2ͩ7#)$:"?=2"?))$>s7#͎)5$2:>/$2ͩ7#3ͩ7#* ?"?*+?"?:)?ʟ$:>€$)s$>>7:+?72ͩ7#2ͩ72?#)s$>7:+?7>{72ͩ7#)¸$:)?‘$>}72v$:)?1.͎)$>&773v$:)#Vr+sù !9 ü !9DM͐ ͐`is#r͐ ͐ ͐͐ !9l x !9DM!͐c !! c i f !9DM͐n͐n} ͐n} !! ^#Vr+s! ^#Vr+sã !  ( ÷!9DM?$l,Ä#:?$u-l,$:)?>%>7l,>7>@2)?$* ?"?R3ͩ7:?2?"?|O%}@%3ͩ7V%C%4ͩ7>G>)7[%#͔+:*ͅ-ÿ ` Û ÿü  !e9DM̓! ̓͡|!v ͤ! ! ~#fo##~#fo*s*s*s! ~#fo͐ ~#fo)* s#r*6**s#r! 6#6`i6#6͐͐ ~#fodw}ʋ d! ~#fo͐)~#fon}<ʸ |l + > M! ~#fo͐)~#fo#n} *! ~#fo͐)~#fo# #|& !   ~#fo͐)~#fo#!m! *6!|! ~#fo͐)~#fo |i *n&|g}osÜ*4! ~#fo͐)~#fo#* s#r! ~#fo͐)~#fo#n} ! ~#fo͐)!s#r! ~#fo͐)* s#r *n&|g}os! n} &͐n} &*! ͐! ns*! n&#|^!!w&|g}o|u! |ʕ!+++|•! n} ¸͐n} ʸ! !! n&!͐! ns!9File output error; disk full?  ~#fo͐)~#fo#n}*!! ! ~#fo͐)~#fo# *! ~#fo͐)~#fo# #|”! ~#fo͐)~#fo#!! *4w}$͐! s#r͐͐ ~#fo! ~#fo͐)! ~#fo͐#)~#fos#r! ^#Vr+sñ͐Õ!9DM`iw#w! 6#6͐ n! s{ 8! n} F! ^#Vr+s! n}-e! 6#6! ^#Vr+s! ^#Vr+sn! s|ʦ͐ ?! nѯg`is#re͐͐?ö!9ý!9DM`i6#6͐ ! s#r͐ ! s#r!|͐ ^#Vr+s`i^#Vr+s* ^#Vr+sJ͐ ͐s#r! ~#fo͐ ~#fo)w#wX! ^#Vr+s`i^#Vr+sk !9Can't open %s r3 Ò  w}*w&|#| !ó! ^#Vr+s͐s{ W͐͐ #T͐++n} T! ^#Vr+s6 Ê`i^#Vr+szʊ͐ ! s#rzʊ͐| ͐|¦͐ ͐͐6͐ ó!9!9DM`iw#w! ^#Vr+sn}`i^#Vr+s͐!98g}o|!w}ʜ*!**!!!w}ʜ\ !s#r\ w#w\ \ #|œ!!tempin.$$$tempin.$$$tempin.$$$tempout.$$$!9DM! ^#Vr+sn`is{`in} ´͐! {͐`in&{#|!Æ!!9!!9DM͐!͐2*`is#r!|/*`is#rßMn}‡**s#r*#*6**6 *^#Vr+sn`is#6͐|²!͐|`i6 #6͐!9> !9DM!`is#rw}u!s#rz!͐##w#w͐~#fo!9DM`iw#w! ~#fo͐n! ~#fo͐n}‚! ~#fo`i^#Vr+sn}!î6! ~#fo͐n! ~#fo͐nѯgWî!9ýS!!9DM͐͐ͺs#rz!͐͐s#r͐##6  #6͐~#foÄ!!9DM͐-!͐~#foJ Ç!!9DM͐͐>m>ʔ>y>ʢ>…>ʵ>‘>! n&A! n&!D! n&!D! n} ! !D! n&!D͐##^#Vr+s!! s#r! ^#Vr+sn`is{.O! A! s#r! 4! ^#Vr+sn`is`in&D}D{UʷXOCS@l͐~#fo|ҷ! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 ! 6! 6! ~#fo! n&! ^#Vr+s~#fo! ;|R!͐͐~#foG|1!͐##6#6͐͐s#r͐^#Vr+s! ns&~Ç!!@"!9DM͐ڗ!ô͐##~#fo|°!ô͐##~#fo`is#r͐͐͐~#fou͐!ô͐ѯgs#rø! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+sø! n}S! 6#6! ^#Vr+s~#fo! s#r͐n}ʸ͐|ʸ! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+sn͐6! ! s#r! n}! ^#Vr+s!|! ^#Vr+s! n}+?`is#r͐##~#fo|ʍ!͐͐͐x͐##~#fo͐s#r͐~#fo͐s#r!!͐~#fo{ô͐##6#6͐͐s#r!ô!9 ë"!9DM͐|Ì͐+++|!Ì͐##^#V!0 ! s͐! ^#Vr+sns{8! ^#Vr+s! n}i! ^#Vr+s!|i! ^#Vr+s6 B! ^#Vr+s`insÕ! ^#Vr+s`insv͐6!9íç!9DM͐͐ ͐^#Vr+s͐͐0͐7s!&F͐ r+s|u!͐͐~#fo`is#r!|H͐##^#Vr+sÌ͐##͐?+s#r͐͐s#r͐^#Vr+sn&Ì!9!9DM! n&|ͯ! n&|ͩ!#!9DM͐|! n&͐͐##~#fo͐͐ ͉͐ͪ`is͐ ͐͐ )͐ͪ`in&#&F!9UÕ!9DM`iw#w͐~#fon&R}ʢ͐ ?͐^#Vr+snѯg`is#rc͐é!9ø!9DM! n&͵|! n&! n&&!9DM! n&|| !͐^#Vr+s! ns͐##^#Vr+s!GçÕOò!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{ʘ`in}%‚! ! s#r! 6#6! s! s! s͐n}-! ^#Vr+s! 4͐n}0! 4͐n&>}! Aͯ ! n&|ͩ  !\&!7*!] &*!m &] !&="&! BL<"e=L=Ø 0#7*^#V#z  x2 +V+^+¯ *͕ : o&9! !j96  #F#x ~# 7  :O*7,2q*&:q):K!=K!=r:qo&\! !7*V!\!*Y!#7:)~:,"s!"u*|*u!*~#!"*s*u!#"u*+"ñ!7*|DM**"><"~# x" ><."~+ x."|}F"K$7:,*C":*h"}|2q ʙ"":qwʊ"! {w7:)~:,"s!"u*|#**s#! ~#6*u*+"*"*u#"u":wo2w&7*!9& 6C#6O#6M_#*|u#!\&Ç#!\&*|‡#!!l&!9~#foʷ#> +$#~¥###Ù#xS## Z#EXECL: Too much text $!p!$!*w##*:1$*$!$!a{ ѷ! , FNxg>Goyo$$‡#!!l&!9~#foʷ#> +$#~¥###Ù#xS## Z#EXECL: Too much text $!p!$!*w##*:1*K͞+'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o  #z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r}os#r! ^#Vr+s͐|+! ^#Vr+s͐|R͐|R͐|]! w#wz͐|z! 6#6! ^#Vr+s͐͐͐!!ͧͪ! 9lines=%u words=%u chars=%u Ã]Æ!9DM*s*s*s!+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77 ~#fo͐ ~#fo)* s#r*6**s#r! 6#6`i6#6͐͐ ~#foE w}l E ! ~#fo͐)~#fon}<ʙ |M + > . ! ~#fo͐)~#fo#n}· *! ~#fo͐)~#fo##| ! ~#fo͐)~#fo#!N !!a{   `OE!y6$ -7rBo&))T])))!y':7?h#D/6:?>$:?$:)?$l,:>#)Ÿ#>67:+?7#*+?|°#2ͩ7#>67:+?7>#7>67:,?7#*+?"?)*6!] ! ~#fo͐)~#fo|J *n&|g}os} *4! ~#fo͐)~#fo#* s#r! ~#fo͐)~#fo#n} ! ~#fo͐)!i s#r! ~#fo͐)* s#r *n&|g}os! ~#fo͐)~#fo#n} !v !#>7:+?7>s7>@2?#2ͩ7#)$:"?=2"?))$>s7#͎)5$2:>/$2ͩ7#3ͩ7#* ?"?*+?"?:)?ʟ$:>€$)s$>>7:+?72ͩ7#2ͩ72?#)s$>7:+?7>{72ͩ7#)¸$:)?‘$>}72v$:)?1.͎)$>&773v$:)! ~#fo͐)~#fo#*! ~#fo͐)~#fo##|u ! ~#fo͐)~#fo#! !*4w} ͐! s#r͐͐ ~#fo ! ~#fo͐)! ~#fo͐#)~#fos#r! ^#Vr+sÒ ͐ ^#Vr+s`i^#Vr+s* ^#Vr?$l,Ä#:?$u-l,$:)?>%>7l,>7>@2)?$* ?"?R3ͩ7:?2?"?|O%}@%3ͩ7V%C%4ͩ7>G>)7[%#͔+:*ͅ-í æ !9DM͐! ͡! s#r! s#r! s#r! w#wͤ`is#rz}`i~#fo|g+s+ ͐ ͐s#r! ~#fo͐ ~#fo)w#w9 ! ^#Vr+s`i^#Vr+sL !9Can't open %s ¢>>®>>º>>>(! n&v! n&!y! n&!y!! s#r! 4! ^#Vr+sn`is`in&}DJUʆXʏOʘCS;͐~#fo|҆! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 Þ! 6Þ! 6! ~#fo! n&! ^#Vr+s~#fo! ѯgs#rÇ! ^#Vr+s! ^#Vr+s~#fo  s! ^#Vr+sÇ! n}"! 6#6! ^#Vr+s~#fo! s#r͐n}ʇ͐|ʇ! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s=͐6! ! s#r! n}! ^#Vr+s!|! ^#Vr+s! n}!0! sã͐! ^#Vr+sns{! ^#V:,"s!"u*|*uU*~#,"*s*uU#"u*+"7*|DM**چ><~+ x–|}îä7:,*ͫ:*}|2q :qwr+s! n}8! ^#Vr+s!|8! ^#Vr+s6 N! ^#Vr+s`insd! ^#Vr+s`insE͐6!9|s!9DM! ^#Vr+sn`is{`in} ²͐! y͐`in&y#|!Ä!!9!9DM͐͐ 4͐! {w7:)~:,"s!"u*|i**sn! ~i6*u*+"*"*u#"u57*!9& 6C#6O#6M¸*|!\&!\&*|!!l&!9~#fo> +q^#Vr+s͐!͐0)͐7s!&͐ ͐͐ ͉͐`is͐ ͐͐ )͐`in&#&!9!9DM! n&|ͯڳ! n&|ͩýÈ!9DM`iw#w͐~#fon&ͺ} ͐ ?͐^#Vr+snѯg#~##xS:" óEXECL: Too much text $!pz!*w#F*:1`*i!i!a{ ѷ! , FNxg>Goy$`is#r͐!9 T!9DM! n&|G! n&N! n&&!9DM! n&|ͯ! n&|ͩ  !\&!7*!&*!&!&="&! BL<"e=L=É7*^#V#zx24+V+^+*:4o&9! !j96  #F#xa~#T7:O*7,2q*&:q):ʳ=ʳ=r:qo&Æw7*;\!*#7:)~  /* cal.c -- UTOOL. Calendar. Print lines with date match. author: David H. Wolen last change: 6/2/83 usage: cal file mm/dd/yy prog |cal -r mm/dd/yy mm/dd/yy cal file -ge mm/dd/yy options: -g (>) in=FALSE; /* file input */ if(fopen(*++argv,ibuf)==ERROR) error("cal: can't open file"); --argc; } else isstdin=TRUE; while(--argc > 0 && (*++argv)[0] == '-') for -l (<) -e (=) -r (>= date1 and <= date2) input: file or STDIN output: STDOUT notes: -ge, -le, -gl, are ok (effect is "or" relation) only first valid date on line is exam(s=argv[0]+1; *s != '\0'; s++) switch (*s) {case 'E': eq=TRUE; break; case 'G': gt=TRUE; break; case 'L': ined for match if -r, no other options are allowed if no options, default is -e linkage: a:clink cal -f dio -ca (uses deff3.crl) */ #include "a:bdscio.h" #include "a:dio.h" #define STDIN 0 #define STDOUT 1 #d lt=TRUE; break; case 'R': range=TRUE; break; default: error("cal: invalid option"); } if(convdate(*argv++,&argdate1)==ERROefine BASEYR 45 /* yy < BASEYR converted to 20yy */ /* yy >= BASEYR converted to 19yy */ struct date {int day; int month; int year; }; main(argc,argv) int argc; char *argv[]; { struct dateR) error("cal: invalid date1"); if(range) {if(convdate(*argv,&argdate2)==ERROR) error("cal: invalid date2"); if(eq || gt || lt) error("cal: no other options allowed with -r");  argdate1, argdate2, linedate; int gt, lt, eq, range, isstdin; char *s, line[MAXLINE], cdate[9], ibuf[BUFSIZ]; dioinit(&argc,argv); eq=gt=lt=range=FALSE; if(*(argv+1)[0] != '-' && !isdigit(*(argv+1)[0])) {isstd } if(!eq && !gt && !lt && !range) /* default -e if no options */ eq=TRUE; while(isstdin ? fgets(line,STDIN) : fgets(line,ibuf)) {if(!finddate(line,cdate)) continue; else convdate(cdat  e,&linedate); if(eq && datecmp(&linedate,&argdate1)==0) fputs(line,STDOUT); if(gt && datecmp(&linedate,&argdate1) > 0) fputs(line,STDOUT); if(lt && datecmp(&linedate,&argdate1) < 0)  case 9: case 11: if(tday > 30) return(ERROR); break; case 2: if(tyear % 4 == 0 && tyear % 100 != 0 || tyear % 400 == 0) {if(tday > 29) /* leap year */  fputs(line,STDOUT); if(range && datecmp(&linedate,&argdate1) >= 0 && datecmp(&linedate,&argdate2) <= 0) fputs(line,STDOUT); } dioflush(); } /* convdate -- convert mm/dd/yy return(ERROR); break; } else {if(tday > 28) /* not leap year */ return(ERROR); break;  to structure date */ convdate(mmddyy,pd) char *mmddyy; struct date *pd; { int tmonth, tday, tyear; char mm[3], dd[3], yy[3]; mm[0]=mmddyy[0]; mm[1]=mmddyy[1]; dd[0]=mmddyy[3]; dd[1]=mmddyy[4]; yy[0]=mmddyy[ } default: error("in convdate -- can't happen"); } pd->day=tday; pd->month=tmonth; pd->year=tyear; return(OK); } /* finddate -- find mm/dd/yy in line */ finddate(line,mmddyy) char 6]; yy[1]=mmddyy[7]; mm[2]=dd[2]=yy[2]='\0'; tmonth=atoi(mm); tday=atoi(dd); tyear=atoi(yy); if(tyear < BASEYR) tyear += 2000; else tyear += 1900; if(tmonth < 1 || tmonth > 12) re*line, *mmddyy; { struct date dtest; char ctemp[9]; int i, len, start; if((start=index(line,"/")) < 0) return(FALSE); start=max(start-2,0); len=strlen(line); for(i=start; i 31) return(ERROR); switch(tmonth) {case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(tday > 31) return(ERROR); break; case 4: case 6:e,i)) {movmem(&line[i],ctemp,8); ctemp[8]='\0'; if(convdate(ctemp,&dtest) != ERROR) {strcpy(mmddyy,ctemp); return(TRUE); } }    return(FALSE); } /* dpat -- see if the pattern nn/nn/nn starts at line[i] */ dpat(line,i) char *line; int i; { if(!isdigit(line[i++])) return(FALSE); if(!isdigit(line[i++])) return(FALSE); if(line[i++] != '/') returfile cat ifile1 ifile2 >ofile (3) concat input files and pass to std input of prog2 cat ifile1 ifile2 |prog2 (4) clean up WordStar doc file cat -w file.doc >ofile option: -w n(FALSE); if(!isdigit(line[i++])) return(FALSE); if(!isdigit(line[i++])) return(FALSE); if(line[i++] != '/') return(FALSE); if(!isdigit(line[i++])) return(FALSE); if(!isdigit(line[i++])) return(FALSE); return(Tclean up WordStar doc files by zeroing hi bits and converting strange characters to blanks input: files or STDIN output: STDOUT linkage: a:clink cat -f dio -ca */ #include "a:bdscioRUE); } /* datecmp -- compare two date structures. Return <0, 0, >0 if first is <,==,> second. */ datecmp(pd1,pd2) struct date *pd1, *pd2; { if(pd1->year > pd2->year) return(1); if(pd1->year < pd2->year) return(-1); .h" #include "a:dio.h" #define STDERR 4 main(argc,argv) int argc; char *argv[]; { char ibuf[BUFSIZ], undoc(), *s; int c, isstdin, wsflg; dioinit(&argc,argv); wsflg=FALSE; while(--argc > 0 && (*++argv)[0] == '-') if(pd1->month > pd2->month) return(1); if(pd1->month < pd2->month) return(-1); if(pd1->day > pd2->day) return(1); if(pd1->day < pd2->day) return(-1); return(0); }  for(s=argv[0]+1; *s != '\0'; s++) switch(*s) {case 'W': wsflg=TRUE; break; default: fprintf(STDERR,"cat: invalid option\n"); exit(dioflush()); /* cat.c -- UTOOL. Concatenate files ver 2. author: David H. Wolen last change: 6/12/83 usage: (1) copy console input to file (^z to stop) cat >ofile (2) concat inp files and write on output  } if(argc <= 0) isstdin=TRUE; else isstdin=FALSE; if(isstdin) /* std input */ while((c=getchar()) != EOF) {if(wsflg) putchar(undoc(c));    else putchar(c); } if(!isstdin) /* files */ while(argc-- > 0) {if(fopen(*argv++,ibuf)==ERROR) {fprintf(STDERR,"cat: can't open %s\n",*argv);  exit(dioflush()); } while((c=getc(ibuf)) != EOF && c != CPMEOF) {if(wsflg) putchar(undoc(c)); else putchar(c); } } dioflush(); }  {if(wsflg) putchar(undoc(c)); else putchar(c);  /* ch.c -- UTOOL. Change pattern in text file. author: David H. Wolen last change: 3/4/83 usage: ch pattern [newstuff] input: STDIN output: STDOUT notes: 1. metacharacters in pattern (same as find) ,argv) int argc; char *argv[]; { char lin[MAXLINE], pat[MAXLINE], sub[MAXLINE], arg[MAXLINE]; dioinit(&argc,argv); if(argc <= 1) error("ch: missing pattern"); rcarg(arg,*++argv); if(!getpat(arg,pat))  % begin of line # # enclose capital letters " " enclose imbedded blanks ? match any char except newline $ end of line [c1-c2] char  error("ch: illegal 'from' pattern"); if(argc == 2) /* null 'to' string */ arg[0]='\0'; else rcarg(arg,*++argv); if(!getsub(arg,sub)) error("ch: illegal 'to' string"); while(fgets(class [!c1-c2] negated char class * closure (0 or more occurrences of prev 1 char pattern) escaped chars: \n (newline) \t (tab) \r (cr) \f (form feed) \b (backspacelin,STDIN)) subline(lin,pat,sub); dioflush(); } /* subline -- substitute sub for pat in lin and print */ subline(lin,pat,sub) char *lin, *pat, *sub; { int i, lastm, m; lastm= -1; i=0; while(lin[i]) \q (") \p (#) 2. If newstuff is omitted, deletion of pattern occurs. 3. Newstuff consists of zero or more of the following: c literal char & ditto, i.e. whatever was matched  != '\0') {m=amatch(lin,i,pat,0); if(m >= 0 && lastm != m) /* replace matched text */ {putsub(lin,i,m,sub); lastm=m; } if(m < 0 || m == i) /* no match or null \c escaped char # # and " " as above linkage: a:clink ch -f dio -ca (uses deff3.crl) */ #include "a:bdscio.h" #include "dio.h" #define STDIN 0 #define DITTO 127 /* rubout */ main(argc match */ {putchar(lin[i]); i++; } else /* skip matched text */ i=m; } } /* getsub -- get substitution string into sub */ getsub(arg,s  ub) char *arg, *sub; { return(makesub(arg,0,'\0',sub) >= 0); } /* makesub -- make substitution string from arg in sub */ makesub(arg,from,delim,sub) char *arg, delim, *sub; { int i, j; j=0; i=from; while(arg[i] != delim && arg[i] != '\0') {if(arg[i] == '&') addstr(DITTO,sub,&j,MAXLINE); else addstr(esc(arg,&i),sub,&j,MAXLINE); i++; } if(arg[i] != delim) /* missing delimite/* cmp.c -- UTOOL. Compare 2 files or file and std input for equality. author: David H. Wolen last change: 11/23/82 usage: cmp file1 file2 prog |cmp file1 input: 2 files or file and STDIN output: r */ return(-1); else if(!addstr('\0',sub,&j,MAXLINE)) /* no room */ return(-1); else return(i); } /* putsub -- output substitution text */ putsub(lin,s1,s2,sub) char *lin, *sub; int s1, s2; {  STDOUT linkage: a:clink cmp -f dio -ca (uses deff3.crl) */ #include "a:bdscio.h" #include "dio.h" #define STDIN 0 main(argc,argv) int argc; char *argv[]; { char buf1[BUFSIZ], buf2[BUFSIZ], line1[MAXLINE], line2[MAXLIN int i, j; i=0; while(sub[i] != '\0') {if(sub[i] == DITTO) for(j=s1; j <= s2-1; j++) putchar(lin[j]); else putchar(sub[i]); i++; } } E]; int isstdin, lineno, m1, m2; dioinit(&argc,argv); switch(argc) { case 2: /* stdin and 1 file */ isstdin=TRUE; if(fopen(argv[1],buf2)==ERROR) error("cmp: can't open file"); break; case 3: /* 2 files */ isstdin=FALSE; if(fopen(argv[1],buf1)==ERROR) error("cmp: can't open file 1"); if(fopen(argv[2],buf2)==ERROR)    error("cmp: can't open file 2"); break; default: error("usage: cmp file1 file2 or STDIN file"); } lineno=0; while(1) {m1=(isstdin) ? fgets(line1,STDIN) :  (default is print all 3) input: 2 files or file and STDIN output: STDOUT notes: (1) if only one file is given, STDIN is file 2 (2) col 1 is lines only in file 1 col 2 is fgets(line1,buf1); m2=fgets(line2,buf2); if(!m1 || !m2) break; lineno++; if(!eqs(line1,line2)) printf("%d\n%s%s",lineno,line1,line2); } if(!m1 && m2) lines only in file 2 col 3 is lines in both files linkage: a:clink comm -f dio -ca (uses deff3.crl) */ #include "a:bdscio.h" #include "dio.h" #define STDIN 0 #define STDOUT 1 main(argc,argv) int argc; char *arout("cmp: eof on file 1"); else if(!m2 && m1) out("cmp: eof on file 2"); dioflush(); }  if(!eqs(line1,line2)) printf("%d\n%s%s",lineno,line1,line2); } if(!m1 && m2) gv[]; { int isstdin, c1flg, c2flg, c3flg, stat1, stat2, k; char *s, buf1[BUFSIZ], buf2[BUFSIZ], line1[MAXLINE], line2[MAXLINE]; dioinit(&argc,argv); c1flg=c2flg=c3flg=FALSE; /* process options */ while(--argc > 0 && (*++argv)[0] == '-') for(s=argv[0]+1; *s != '\0'; s++) switch(*s) {case '1': c1flg=TRUE; break; case '2': c2flg=TRUE; break; case '3': c3flg=TRUE; /* comm.c -- UTOOL. Print lines common to two sorted files author: David H. Wolen last change: 11/29/82 usage: comm -123 file1 file2 prog |comm file1 options: -n (n=1,2,3) print only named columns break; default: error("comm: invalid option"); } if(!c1flg && !c2flg && !c3flg) c1flg=c2flg=c3flg=TRUE; /* open file or files */ switch(argc) {case 1: /* 1 file   and STDIN */ isstdin=TRUE; if(fopen(*argv,buf1)==ERROR) error("comm: can't open file"); break; case 2: /* 2 files */ isstdin=FALSE; if(f stat1=fgets(line1,buf1); stat2=(isstdin) ? fgets(line2,STDIN) : fgets(line2,buf2); } } if(!stat1 && c2flg) /* end of file 1, print rest of file 2 */ while(stat2) {prntcopen(*argv++,buf1)==ERROR) error("comm: can't open file 1"); if(fopen(*argv,buf2)==ERROR) error("comm: can't open file 2"); break; default: error("usage: col(line2,2,c1flg,c2flg,c3flg); stat2=(isstdin) ? fgets(line2,STDIN) : fgets(line2,buf2); } else if(!stat2 && c1flg) /* end of file 2, print rest of file 1 */ while(stat1) {prntcol(line1,1,c1fomm [-123] file1 file2 or file STDIN"); } /* process */ stat1=fgets(line1,buf1); stat2=(isstdin) ? fgets(line2,STDIN) : fgets(line2,buf2); while(1) {if(!stat1 || !stat2) break; k=strcmp(line1,lg,c2flg,c3flg); stat1=fgets(line1,buf1); } dioflush(); } /* prntcol -- print line as column col */ prntcol(line,col,c1flg,c2flg,c3flg) char *line; int col, c1flg, c2flg, c3flg; { int i; fline2); if(k < 0) /* line only in file 1 */ {if(c1flg) prntcol(line1,1,c1flg,c2flg,c3flg); stat1=fgets(line1,buf1); } else if(k > 0) /* line only in file 2 */ {if(cor(i=0; isspace(line[i]); i++) ; /* skip leading white space */ switch(col) {case 1: fputs(&line[i],STDOUT); break; case 2: if(c1flg) /* 15 blanks */ f2flg) prntcol(line2,2,c1flg,c2flg,c3flg); stat2=(isstdin) ? fgets(line2,STDIN) : fgets(line2,buf2); } else /* line in both files */ {if(c3flg) prntcol(line1,3,c1flg,c2flg,c3flg); puts(" ",STDOUT); fputs(&line[i],STDOUT); break; case 3: if(c1flg) /* 10 blanks */ fputs(" ",STDOUT); if(c2flg) /* 15 blanks */    fputs(" ",STDOUT); fputs(&line[i],STDOUT); break; default: error("prntcol: can't happen"); } } /* crt.c -- UTOOL. Display text file (including ws doc) a screen at a time. author: David H. Wolen last change: 6/12/83 usage: crt -n file prog |crt forward a screen anything else to quit option: -n line numbers input: file or STDIN output: STDOUT linkage: a:clink crt -f dio -ca (uses deff3.crl) */ #include "a:bdscio.h" #include "a:dio.h" #define PSIZE 22 /* lines per screen */ #defi  ne STDIN 0 main(argc,argv) int argc; char *argv[]; { char ibuf[BUFSIZ], line[MAXLINE], *s; int lnflag, lcount, lineno, i, isstdin, len; dioinit(&argc,argv); lnflag=FALSE; lineno=1; lcount=1; while(--arg) continue; if(bdos(1)=='\r') /* console input */ {lcount=1; continue; } else break; } dioflush(); } c>0 && (*++argv)[0]=='-') for(s=argv[0]+1; *s != '\0'; s++) switch(*s) {case 'N': /* line numbers */ lnflag=TRUE; break; defau/* find.c -- UTOOL. Find patterns in text files (ver. 3) author: David H. Wolen last change: 5/2/83 usage: find [-axn] pattern1 [pattern2 ... pattern10] options: -a output lines which contain all patterns lt: error("usage: crt -n file or STDIN"); } switch(argc) {case 0: /* STDIN */ isstdin=TRUE; break; case 1: /* file input */  (default is output lines matching any pattern) -x output lines that fail the match criteria -n line numbers for output -c just output count of matching lines -f fold (ignore ca isstdin=FALSE; if(fopen(*argv,ibuf)==ERROR) error("crt: can't open file"); break; default: error("usage: crt -n file or STDIN"); } while(isstdin ? fgetse in character comparisons) input: STDIN output: STDOUT notes: 1. -x pat1 pat2 : output if line contains neither pat 2. -ax pat1 pat2 : output if line doesn't contain both pats 3. metacharacters(line,STDIN) : fgets(line,ibuf)) {len=strlen(line); for(i=0; i < len; i++) line[i]=undoc(line[i]); if(lnflag) printf("%4d: ",lineno++); puts(line); if(++lcount <= PSIZEs in pattern % match pattern at beginning of line # # enclose capital letters " " enclose embedded blanks ? match any char except newline $   end of line [c1-c2] character class [!c1-c2] negated character class * closure (0 or more occurrences of prev pattern) escaped chars: \n (newline) \t (tab) \r (cr) UE; break; case 'X': except=TRUE; break; case 'C': count=TRUE; break; case 'F': fold=TRUE; break; default: error("find: invalid option");  \f (form feed) \b (backspace) \q (") \p (#) 4. first pattern can't begin with "-" 5. up to MAXPATS patterns allowed (currently 10) 6. if -c and -n, the latter will be ignored  } /* process patterns */ if(argc <= 0) error("find: missing pattern"); while(argc > 0) {if(++numpats > MAXPATS) error("find: too many patterns"); rcarg(newarg,*argv++); if(fold)  linkage: a:clink find -f dio -ca (uses deff3.crl) */ #include "a:bdscio.h" #include "dio.h" #define STDIN 0 #define MAXPATS 10 /* max patterns */ main(argc,argv) int argc; char *argv[]; { int lineno, except, number,{stoupper(foldtemp,newarg); strcpy(newarg,foldtemp); } if(!getpat(newarg,pat[numpats-1])) error("find: illegal pattern"); argc--; } /* look for patterns in stdin */  all, numpats, print, count, icount, fold; char line[MAXLINE], *s, newarg[MAXLINE], foldtemp[MAXLINE], pat[MAXPATS][MAXLINE]; dioinit(&argc,argv); lineno=0; except=number=all=count=fold=FALSE; numpats=i while(fgets(line,STDIN)) {lineno++; if(fold) stoupper(foldtemp,line); else strcpy(foldtemp,line); if(gmatch(foldtemp,pat,numpats,all)) print=TRUE; count=0; /* process options */ while(--argc > 0 && (*++argv)[0] == '-') for(s=argv[0]+1; *s != '\0'; s++) switch(*s) {case 'A': all=TRUE; break; case 'N': number=TRelse print=FALSE; if(except) print= !print; if(print && !count) {if(number) printf("%d: ",lineno); printf("%s",line); } else if(print && count)    icount++; } if(count) printf("%d matched\n",icount); dioflush(); } /* gmatch -- match patterns */ gmatch(line,pat,numpats,all) char *line, pat[MAXPATS][MAXLINE]; int numpats, all; { int gotone, i; for(i=0; i < numpats; i++) {gotone=match(line,pat[i]); if(!all && gotone) return(TRUE); else if(all && !gotone) return(FALSE); } return(all); } /* match -- find match anywhere in line */ match(lin,pat) char *lin, *pat; { int i, pos; pos= -1; i=0; while(lin[i] != '\0' && pos < 0) {pos=amatch(lin,i,pat,0); i++; } return(pos >= 0); } /* stoupper -- convert string to upper case usage: stoupper(outstr,instr); */ stoupper(s,t) char *s, *t; { while(*s++ = toupper(*t++)) ; }   /* hcat.c -- UTOOL. Horizontally concatenate text files. author: David H. Wolen last change: 3/16/83 usage: hcat file1 n2 file2 n3 file3 ... hcat file1 31 file2 51 file3 (begin file1 in col uff[i].ibuf) == ERROR) /* files */ error("hcat: can't open file"); fstuff[i].iseof = FALSE; } nfiles=i; /* process */ while(hcmore(fstuff,nfiles)) /* until all files are at eof */ 1, file2 in col 31, file3 in col 51) input: one or more files output: STDOUT notes: 1. max of 6 input files 2. first file starts in col 1 linkage: a:clink hcat -f dio -ca (uses deff3.crl) */ #inclu {for(i=0; i < nfiles; i++) /* get line from each file */ {if(!fstuff[i].iseof) if(!fgets(fstuff[i].line,fstuff[i].ibuf)) fstuff[i].iseof=TRUE; } setmem(oude "a:bdscio.h" #include "dio.h" #define MAXHCFILS 6 /* max input files */ struct fs /* file data */ {char ibuf[BUFSIZ]; char line[MAXLINE]; int iseof; int col; }; main(argc,argv) int argc;tline,MAXLINE,' '); for(i=0; i < nfiles; i++) /* form output line */ {if(!fstuff[i].iseof) dohc(fstuff[i].line,fstuff[i].col,outline,MAXLINE); } if(hcmore(fstuff,nfiles))  char *argv[]; { int i, nfiles; char outline[MAXLINE]; struct fs fstuff[MAXHCFILS]; dioinit(&argc,argv); if(argc/2 > MAXHCFILS) error("hcat: too many input files"); /* process arguments */ for(i {trail(outline,MAXLINE); /* delete trailing blanks */ puts(outline); } } dioflush(); } /* hcmore -- return false if all input files at eof; else true */ hcmore(fstuff,nfiles) =0; i < argc/2; i++) {if(i == 0) /* start cols (1 for first file) */ fstuff[i].col=1; else if((fstuff[i].col=atoi(*++argv)) <= 0) error("hcat: bad column argument"); if(fopen(*++argv,fststruct fs fstuff[]; int nfiles; { int i; for(i=0; i < nfiles; i++) {if(!fstuff[i].iseof) return(TRUE); } return(FALSE); } /* dohc -- insert line into outline starting at col. Won't in  sert past end of outline. */ dohc(line,col,outline,maxout) char *line, *outline; int col, maxout; { int i, j; for(i=0, j=col-1; j < (maxout-1) && line[i] != '\n'; i++, j++) outline[j]=line[i]; } /* trail -- delete trailing blanks from line */ trail(outline,maxout) char *outline; int maxout; { int i, nfiles; for(i=maxout-3; i >= 0; i--) if(outline[i] != ' ') break; outline[++i]='\n'; outline[++i]='\0'; }/* incl.c -- UTOOL. Expand included files author: David H. Wolen last change: 12/5/82 usage: incl = 0; i--) if(outline[i] != ' ') break; outline[++i]='\n'; outline[++i]='\0'; } with file contents. The #include doesn't have to start in column 1. Up to 8 open files at a time. linkage: a:clink incl -f dio -ca (uses deff3.crl) */ #include "a:bdscio.h" #include "dio.h" #define STDIN 0 #define STDOUT 1 #define STDERR 4 main(argc,argv) int argc; char *argv[]; { int isstdin; char ibuf[BUFSIZ]; dioinit(&argc,argv); if(argc==1) isstdin=TRUE; else {isstdin=FALSE;  if(fopen(*++argv,ibuf)==ERROR) {fprintf(STDERR,"incl: can't open %s\n",*argv); exit(dioflush()); } } finclude(ibuf,isstdin); dioflush(); } /* finclude -- recursive file inc  lude */ finclude(ibuf,isstdin) char *ibuf; int isstdin; { char fbuf[BUFSIZ], line[MAXLINE], str[MAXLINE]; int loc, i; while( isstdin ? fgets(line,STDIN) : fgets(line,ibuf)) {loc=getword(line,0,str); if(!eqs(str,"#include")) fputs(line,STDOUT); else {loc=getword(line,loc,str); str[strlen(str)-1]='\0'; /* remove quotes */ for(i=0; ioutfile input: STDIN output: STDOUT compiler: BDS C ver. 1.46 (with dio) linkage: clink b:lline -f a:dio -o b: (uses deff3.crl) */ #include "a:bdscio.h" #include "a:dio.h" #define STDIN 0 main(argc,argv) int argc; char *argv[]; { int len, maxlen; char line[MAXLINE], savline[MAXLINE]; dioinit(&argc,argv); maxlen=0; while(fgets(line,STDIN)) {len=strlen(line) -1; /* don't count \n */ if(len > maxlen) {maxlen=len; strcpy(savline,line); } } if(maxlen == 0) error("lline: empty input"); printf("longest line is %d characters long:\n",maxlen); printf("%s",savline); dioflush(); } /* lpr.c -- UTOOL. Send stdin to printer author: David H. Wolen last change: 12/1/82 usage: prog |lpr -lnp 5 55 lpr to resume, anything else to quit. (default false) input: STDIN output: printer notes: (1) form feed after each page and at eof    (2) if both -l and -n are used, margin value must preceed page size value. linkage: a:clink lpr -f dio -ca (uses deff3.crl) */ #include "a:bdscio.h" #include "dio.h" #define STDIN 0 #define STDLST 2  else {fputs("\f",STDLST); lcount=1; if(pause) {if(bdos(1)=='\r') continue; else break; } } main(argc,argv) int argc; char *argv[]; { int margflg, lmarg, psflg, psize, pause, lcount, i; char line[MAXLINE], *s; dioinit(&argc,argv); margflg=psflg=pause=FALSE; lmarg=8; psize=50; while(--argc > 0 &&  } if(lcount > 1) fputs("\f",STDLST); dioflush(); } ='\r') continue; else break; } } (*++argv)[0]=='-') for(s=argv[0]+1; *s != '\0'; s++) switch(*s) {case 'L': margflg=TRUE; break; case 'N': psflg=TRUE; break; case 'P': pause=TRUE; break;  default: error("lpr: invalid option"); } if(margflg) {if( (lmarg=atoi(*argv++)) < 0) error("lpr: left margin < 0"); } if(psflg) {if( (psize=atoi(*argv)) < 1) error("lpr: page size < 1"); } lcount=1; while(fgets(line,STDIN)) {for(i=0; i 0 && (*++argv)[0]=='-') for(s=argv[0]+1; *s != '\0'; s++) switch(*s) {case 'P': udoc=FALSE; break; default: error("makdoc: invalid option"); } if(argc/* makdoc.c -- UTOOL. Make documentation from C source. author: David H. Wolen last change: 7/1/83 usage: makdoc -p prog.c >prog.pdo (programmer doc) makdoc prog.c >prog.hlp (user help file) options: -p output <= 0) isstdin=TRUE; else {isstdin=FALSE; if(fopen(*argv,ibuf) == ERROR) error("makdoc: can't open file"); } print=FALSE; if(udoc) /* make user doc */ {while"  (isstdin ? fgets(line,STDIN) : fgets(line,ibuf)) {if(index(line,"/*")==0) print=TRUE; if(print && index(line,"linkage:") < 0 && index(line,"compiler:") < 0) fputs(line,STDOUT);  if(index(line,"*/") >= 0) break; } } if(!udoc) /* make programmer doc */ {while(isstdin ? fgets(line,STDIN) : fgets(line,ibuf)) {if(index(line,"/*")==0) print=TRUE;  if(print) fputs(line,STDOUT); if(index(line,"*/") >= 0) print=FALSE; } } dioflush(); } #  file: readme.uts date: 9/10/83 author: David H. Wolen This disk contains the source for the UTOOLS -- a set of utility programs I recently submitted to the foglib. See the appropriate foglib disks for user oriented documentation. The programs areines on mylib3.c that aren't used by the UTOOLS. Note -- there's a bug in 1.46 that prevents deff3.crl from being picked up automatically if you compile with source on b and b as the logged drive. 4. Before my upgrade to doubl written in C, using version 1.46 of the BDS compiler. The following notes about bringing up the UTOOLS on your own are disorganized and probably incomplete -- that should be fair warning. Also, note that you'll need some files from the BDS C distribe density, I kept dio.h and dio.crl on the same drive as the source. With double density, I keep everything but the source on A and compile with A as the logged drive. Some of the "linkage" comments in the source code reflect the first ution package to complete this package. I'm not including them because I'm not sure if the source for them is public domain. 1. I've enabled alloc and free by making the appropriate change to bdscio.h and recompiling the indicated libraries. method, while others reflect the second -- you've been warned. Also, you may have to change the drive designation in the #include lines to correspond to your compile procedure. 5. The utdir tool needs wildexp.c which comes with theSee the instructions in bdscio.h. Alloc and free are only (I think) used by the tail tool. The other tools that do storage allocation don't need to free it so they use sbrk instead (reducing memory requirements and the size of the BDS C distribution package. 6. spltscan.c contains a set of character handling functions. Only two of them (I think) are used by a UTOOL (vsplit). Documentation for these functions is on spltscan.doc. Forgive the few gotos -- thi .com file). 2. I've enabled console buffering by making the appropriate change to dio.h. See the instructions in dio.h. 3. Just about all the UTOOLS use something from mylib3.c. I've made it my deff3.crl. There are probably some routs was some of the first C code I wrote. 7. There are two tools here that I didn't include in the set of .com files I submitted to foglib -- lline and makdoc. 8. I haven't experimented with the compiler options to optimize space or $   time. That might be a useful thing for someone to try. That's all that I can think of that you need to know. Please forgive any omissions.  --> FILE: -FOG/UTL.029 CRC = 00 00 --> FILE: CAL .C CRC = 12 25 --> FILE: CAT .C CRC = EA 2D --> FILE: CH .C CRC = E3 56 --> FILE: CMP .C CRC = EB BC --> FILE: COMM .C CRC = 4E A2 --> FILE: CRT .C CRC = EA 54 --> FILE: DISK .DOC CRC = 88 CD --> FILE: FIND .C CRC = EF 85 --> FILE: HCAT .C CRC = 7B C9 --> FILE: INCL .C CRC = 55 CE --> FILE: KWIC .C CRC = 69 C4 --> FILE: LLINE .C CRC = 20 3A --> FILE: LPR .C CRC = D3 91 --> FILE: MAKDOC .C CRC = BC 69 --> FILE: README .UTS CRC = 53 24 --> FILE: UTDIR .COM CRC = B1 37 --> FILE: VSPLIT .COM CRC = 2D 9C --> FILE: WC .COM CRC = 68 55 ---------------------> SUM OF CRCS = 02 87  --> FILE: UTDIR .COM CRC = B1 37 --> FILE: VSPLIT .COM CRC = 2D 9C --> FILE: WC .COM CRC = 68 55 -----%  bes the source files. Ji Woolley FO Dis Librarian October 1983  Tools publications by Kernighan and Plauger. They are written in the BDS version of C; source files are included. They provide functions similar to UNIX; hence, the name UTOOLS. README.UT is a text file describing an overview of the system. The file UTOOL.DOC provides examples of use of the various tools. UTOOL.MAN contains a structured description of each, after the pattern of UNIX manual pages. The file UTKWIC.DAT, which briefly identifies the function of each tool, was used with the KWIC tool to make the keyword in context index contained in UTKWIC.OUT. Each of these files may be found on FOG/UTL.026. The actual tools are contained on FOG/UTL.026 thru 029. Source files are on 029 and 030. README.UTS on 029 describes the source files. Jim Woolley FOG Disk Librarian October 1983  DISK.DOC FOG/UTL.029 First Osborne Group (FOG) Utilities Disk FOG/UTL.026 thru 030 contain the UTOOLS system of utilities (tools) submitted by David H. Wolen. Most were derived from the Software&  '