Newsgroups: fj.sources,fj.lang.perl
Path: galaxy.trc.rwcp.or.jp!coconuts.jaist!wnoc-tyo-news!news.iij.ad.jp!dnp-news!dps-dnp-news!pix!a_kuroe
From: Akihiko Kuroe <a_kuroe@gaken.dnp.co.jp>
Subject: RATS (aRchiving cAT Series, was PPACK) v1.00
Content-Type: text/plain; charset=ISO-2022-JP
Message-ID: <D4qsGs.G1q@pix.gaken.dnp.co.jp>
Followup-To: fj.sources.d
Sender: news@pix.gaken.dnp.co.jp (Usenet ews/.nameNews System)
Reply-To: rats@kuroe.aoba.yokohama.jp
Organization: IIRI , Dai Nippon Printing Co.,Ltd. , Tokyo , Japan
X-Newsreader: gn [Version 1.32 beta Jan.11,1994 (Unix)]
Mime-Version: 1.0
Date: Wed, 1 Mar 1995 03:31:38 GMT
Lines: 828
Xref: galaxy.trc.rwcp.or.jp fj.sources:3050 fj.lang.perl:350
X-originally-archived-at: http://galaxy.rwcp.or.jp/text/cgi-bin/newsarticle2?ng=fj.lang.perl&nb=350&hd=a
X-reformat-date: Mon, 18 Oct 2004 15:18:22 +0900
X-reformat-comment: Tabs were expanded into 4 column tabstops by the Galaxy's archiver. See http://katsu.watanabe.name/ancientfj/galaxy-format.html for more info.

$B9u9>!w2#IM;T@DMU6h$G$9!#(BPPACK$B$N5!G=$r3HD%$7$?(BRATS$B$r$*FO$1$7$^$9!#(B

RATS$B$O!V(BaRchiving cAT Series$B!W$NN,$G!"(Brat$B!"(Bunrat$B!"(Brat2mbox$B$H$$$&(B
$B%3%^%s%I$N%;%C%H$K$J$C$F$$$^$9!#(Bperl$B$b$7$/$O(Bjperl[.exe]$B$,I,MW$G$9!#(B

rat$B$O(Bppack$B$N5!G=3HD%HG$G!"%G%#%l%/%H%j$4$H$N%"!<%+%$%V$b2DG=$G$9!#(B

unrat$B$O(Bpunpack$B$N5!G=3HD%HG$G!"$(!<$H!"$^$"$$$m$$$m$G$-$^$9!#(B(^^;;

rat2mbox$B$O!"%a!<%k$r$^$H$a$?(BRAT$B%U%!%$%k$r!"%a!<%k%\%C%/%97A<0$K(B
$BJQ49$9$k%U%#%k%?$G$9!#!V$^$H$aAw$j!W$r(BUCB mail$B$GFI$`?M8~$1$G$9!#(B

$B%?%0$bA}$($F$$$^$9!#(B
$B!V(B=BEGIN: filename$B!W(B $B%U%!%$%k$N3+;O$r<($9!#(B
$B!V(B=END$B!W(B             $B%U%!%$%k$N=*N;$r<($9!#(B
$B!V(B=DIR: directory$B!W(B  $B%U%!%$%k$rE83+$9$k@h$N%G%#%l%/%H%j$r<($9!#(B
$B!V(B=NO_ESC$B!W(B          $B9TF,$N(B'='$B$r(B'= ='$B$K$7$F$$$J$$$3$H$r<($9!#(B

$B>\:Y$O!"Cf$N%I%-%e%a%s%H$rFI$s$G2<$5$$(B($B$"$s$^$j>\$7$/$J$$$+$b(B)$B!#(B

RATS$B$N46A[$d%P%0Js9p$r4s$;$F$b$i$C$?$j!"%Y!<%?HG$rHRI[$9$k$?$a$K!"(B
$B%a!<%j%s%0%j%9%H$r:n$j$^$7$?!#(B<rats@kuroe.aoba.yokohama.jp>$B$G$9!#(B
$B%a!<%k$rAw$k$@$1$J$i!"FC$K%a%s%P!<EPO?$r$9$kI,MW$O$"$j$^$;$s$,!"(B
$B%Y!<%?HG$rF~<j$7$?$$>l9g$O!VEPO?4uK>!W$HL@5-$7$F$$$?$@$1$l$P<jF0(B
$B$G!"$"$k$$$O!"(B<rats-request@kuroe.aoba.yokohama.jp>$B08$F$KK\J8$,(B
#join
$B$H$$$&%a!<%k$rAw$C$F$$$?$@$1$l$P<+F0E*$K!"(BRATS-ML$B$KEPO?$5$l$^$9!#(B

$B0J2<$O<+8JE83+%"!<%+%$%V$K$J$C$F$$$^$9!#@Z$j<h$C$F<B9T$7$F2<$5$$!#(B

#!/usr/local/bin/perl
#
# rat's self-extract-archive-file unit
# Copyright 1995  Akihiko Kuroe <a_kuroe@kuroe.aoba.yokohama.jp>
#
while (<DATA>) {
    if (/^=+BEGIN:\s*([^>]+)>*(UU[^>]*)?>*(\d*)$/io) {
        $ff = $1; $ff =~ s/\n//; $uu = $2; $pp = int($3); $oo = 1;
        &md($ff);
        print STDERR "File: $ff";
        print STDERR ', uuencode file' if $uu;
        print STDERR " (part $pp)" if $pp;
        print STDERR "\n";
        if ($pp > 1) {open(OUT, ">>$ff") || die "$ff, $!\n";}
        if ($pp < 2) {open(OUT,  ">$ff") || die "$ff, $!\n";}
        binmode OUT if $uu;
        next;
    }
    if (/^=+END/io) {
        close(OUT); undef ($oo, $uu, $ee); next;
    }
    unless ($oo) {
        $ee = 1 if (/^=+NO_ESC/io);
        next;
    }
    s/^= =/=/ unless $ee;
    $_ = unpack(u, $_) if $uu;
    print OUT;
}
sub md {
    $path = @_;
    for (;;) {
        $pos = rindex($path, '/');
        last if ($pos < 0);
        substr($path, $pos) = ''; unshift(@dir, $path);
    }
    foreach $i (@dir) {mkdir("$i", 0755);}
}
__END__
=====BEGIN: >>STDOUT
                      RATS : aRchiving cAT Series
                            Copyright 1995
            Akihiko Kuroe <a_kuroe@kuroe.aoba.yokohama.jp>
                            rat      v1.00
                            unrat    v1.00
                            rat2mbox v1.00
=====END
=====BEGIN: rat.doc
$B!|(Brat (current version: 1.00)

    usage: rat [options] [FILE ...]
    options: -o OUT       ... output to file 'OUT'
             -a OUT       ... append to file 'OUT'
             -d DIR       ... default directory name 'DIR'
             -s[NUM[K|M]] ... split files, under NUM lines
                              (or about NUM KB/MB with uuencoding)
             -u           ... uuencode
             -e           ... make self-extract-archive-file
             -r           ... recursive archiving
             -n           ... no escape '='

$B!V(BRAT$B!W$NM3Mh$O!V(BRaw Archiver into Text$B!W$b$7$/$O!V(BaRchiving cAT$B!W$G$9!#(B
$B!V(Brat$B!W!V(Bunrat$B!WEy$NAm>N$O!V(BRATS$B!W$G$9!#(B

$B;XDj$7$?%U%!%$%k$NFbMF$r!"A08e$K%?%0$rIU$1$FI8=`=PNO$K=q$-=P$7$^$9!#J#(B
$B?t$N%U%!%$%k$r;XDj$G$-$^$9!#(B

$B%*%W%7%g%s(B[-o]$B$r;XDj$9$k$H!"$=$ND>8e$N0z?t$r!"=PNO@h$N%"!<%+%$%V%U%!%$(B
$B%kL>$H$7$^$9!#4{$K%U%!%$%k$,B8:_$9$k>l9g$O6/@)=*N;$7$^$9!#(B

$B%*%W%7%g%s(B[-O]$B$r;XDj$9$k$H!"$=$ND>8e$N0z?t$r!"=PNO@h$N%"!<%+%$%V%U%!%$(B
$B%kL>$H$7$^$9!#4{$K%U%!%$%k$,B8:_$9$k>l9g$O>e=q$-$7$^$9!#(B

$B%*%W%7%g%s(B[-a]$B$r;XDj$9$k$H!"$=$ND>8e$N0z?t$r!"=PNO@h$N%"!<%+%$%V%U%!%$(B
$B%kL>$H$7!"$=$3$XDI2C=PNO$7$^$9!#BgJ8;z!?>.J8;z$N6hJL$O$7$^$;$s!#(B

$B%*%W%7%g%s(B[-d]$B$r;XDj$9$k$H!"$=$ND>8e$N0z?t$r!"%"!<%+%$%V%U%!%$%k$rE83+(B
$B$9$k:]$N%G%#%l%/%H%jL>$H$7$F!V(B=====DIR:$B!W%?%0$K5-O?$7$^$9!#$3$l$rM-8z$K(B
$B$9$k$+$I$&$+$O!"(Bunrat$B$N(B[-d]$B%*%W%7%g%s$G;XDj$7$^$9!#BgJ8;z!?>.J8;z$N6hJL(B
$B$O$7$^$;$s!#(B

$B%*%W%7%g%s(B[-s]$B$r;XDj$9$k$H!"%"!<%+%$%V%U%!%$%k$rJ,3d$7$^$9!#BgJ8;z!?>.(B
$BJ8;z$N6hJL$O$7$^$;$s!#%G%U%)%k%H$O(B500$B9T$G$9$,!"(B[-s]$B$KB3$1$F?t;z(B[NUM]$B$r(B
$BM?$($k$H(B[NUM]$B9T$K$J$j$^$9!#(B[NUM]$B$KB3$1$F!V(BK$B!W!V(BM$B!W$rIU$1$k$H!"(Buuencode
$B$7!"$=$l$>$l(B1024$B%P%$%H!"(B1024*1024$B%P%$%H$r3]$1$?%5%$%:DxEY$K$J$k$h$&$KJ,(B
$B3d$5$l$^$9!#J,3d$9$k$H%?%0$NKvHx$K!V(B>>(part$BHV9f(B)$B!W$,IU2C$5$l$^$9!#(B

$B%*%W%7%g%s(B[-u]$B$rIU$1$?>l9g$OA4$F$N%U%!%$%k$r6/@)E*$K!"$^$?$O%P%$%J%j%U%!(B
$B%$%k$,4^$^$l$?>l9g$O<+F0G'<1$7$F!"(Buuencode$B$7$?$b$N$r=q$-=P$7$^$9!#$3$N(B
$B>l9g!"%U%!%$%kJ]8n%b!<%I$O!V(B644$B!W$K$J$j$^$9!#(Buuencode$B$7$?>l9g!"%?%0$NKv(B
$BHx$K!V(B>>UU$B!W$,IU2C$5$l$^$9!#BgJ8;z!?>.J8;z$N6hJL$O$7$^$;$s!#(B

$B%*%W%7%g%s(B[-e]$B$r;XDj$9$k$H!"<+8JE83+%"!<%+%$%V$r:n$j$^$9!#BgJ8;z!?>.J8(B
$B;z$N6hJL$O$7$^$;$s!#C"$7!"%*%W%7%g%s(B[-s]$B$,;XDj$5$l$F$$$k>l9g$O!":G=i$N(B
part$B$K$N$_<+8JE83+%b%8%e!<%k$,IU2C$5$l$^$9!#(B

$B%*%W%7%g%s(B[-r]$B$r;XDj$9$k$H!"%U%!%$%kL>$NBX$o$j$K;XDj$7$?%G%#%l%/%H%j$N(B
$B2<$r:F5"E*$K%"!<%+%$%V$7$^$9!#BgJ8;z!?>.J8;z$N6hJL$O$7$^$;$s!#(B

rat$B$O!"%?%0$r3N<B$KG'<1$G$-$k$h$&$K9TF,$N!V(B=$B!W$r!V(B= =$B!W$K%(%9%1!<%W$7$^(B
$B$9$,!"%*%W%7%g%s(B[-n]$B$r;XDj$9$k$H!"$3$l$r9T$$$^$;$s!#$^$?!"$=$N$3$H$r<((B
$B$9!V(B=====NO_ESC$B!W%?%0$rIU2C$7$^$9!#BgJ8;z!?>.J8;z$N6hJL$O$7$^$;$s!#C"$7!"(B
$B$=$N4V$K%?%0$HJ6$i$o$7$$FbMF$,$"$C$?$j!"(BRAT$B%U%!%$%k$,F~$l;R$K$J$C$F$$$k(B
$B>l9g$O!"$&$^$/E83+$5$l$J$$2DG=@-$,$"$j$^$9!#(B

$B%U%!%$%k$r;XDj$7$J$+$C$?>l9g!"I8=`F~NO$r%"!<%+%$%V$7$^$9!#%U%!%$%kL>$N(B
$BBX$o$j$K!V(B>>STDOUT$B!W$,%?%0$K5-O?$5$l$^$9!#$3$l$r(Bunrat$B$GE83+$9$k:]$OI8=`(B
$B=PNO$K=q$-=P$5$l$^$9!#(B

rat$B$N=PNO$O!"F|K\8l$,(BJIS$B$G$"$l$P!"(BASCII text$B$J$N$G!"(BNetNews$B$N5-;v$d%a!<(B
$B%k$K$=$N$^$^4^$a$k$3$H$,2DG=$G$9!#$^$?!"FbMF$N2DFI@-$r;}$C$?(B(uuencode$B$5(B
$B$l$F$$$k>l9g$r=|$/(B)$B%"!<%+%$%V%U%!%$%k$H$7$F$bMxMQ$G$-$^$9$,!"%?%$%`%9%?%s(B
$B%W$d%U%!%$%kJ]8n%b!<%I$OJ]B8$5$l$^$;$s!#(B

$B%"!<%+%$%V%U%!%$%kL>$OG$0U$G$9$,!"$=$N3HD%;R$H$7$F$O!V(B.rat$B!W$r?d>)$7$^$9!#(B
$B$^$?!"$3$l$r!V(BRAT$B%U%!%$%k!W$H8F$V$3$H$,$"$j$^$9!#(B
=====END
=====BEGIN: unrat.doc
$B!|(Bunrat (current version: 1.00)

    usage: unrat [options] [FILE ...]
    options: -l ... list
             -f ... force output
             -a ... append output
             -r ... recursive output
             -d ... directory tag is available
             -m ... mail (numerical filename)
             -n ... no escape '='

RAT$B%U%!%$%k$N%?%0$rFI$_<h$j!"$=$NFbMF$rA3$k$Y$-%U%!%$%k$K=q$-=P$7$^$9!#(B
$BE83+8e$N%U%!%$%kL>$rJQ99$9$k>l9g$O!"%?%0Cf$N!V(B=====BEGIN: $B!W$KB3$/J8;z(B
$BNs$r=q$-49$($F$*$-$^$9!#(B

rat$B$K$h$jJ,3d$5$l$?%U%!%$%k$N>l9g$O7k9g$7$^$9!#%?%0Cf$N!V(B>>(part$BHV9f(B)$B!W(B
$B$NM-L5$K$h$C$FH=JL$7$F$$$k$N$G!"$3$l$r=|5n$9$k$H7k9g$7$^$;$s!#(B

uuencode$B%U%!%$%k$N>l9g$O(Buudecode$B$r$7$^$9!#%?%0Cf$N!V(B>>UU$B!W$NM-L5$K$h$j(B
$BH=JL$7$F$$$k$N$G!"$3$l$r=|5n$9$k$H(Buudecode$B$7$^$;$s!#!V(B>>UU$B!W$,$"$k>l9g(B
$B$OCf?H$,(Buuencode$B%U%!%$%k$G$J$/$F$b(Buudecode$B$7$h$&$H$7$^$9$,!"<B9T7k2L$K(B
$B$D$$$F$OJ]>Z$5$l$^$;$s!#$^$?!"%U%!%$%k$,%F%-%9%H%U%!%$%k$@$C$?>l9g$G$b(B
$B%P%$%J%j%b!<%I$GE83+$9$k$N$G!"(BDOS$B$G;H$&>l9g$O2~9T%3!<%I$KCm0U$7$F2<$5$$!#(B

$B%?%0Cf$K!V(B>>STDOUT$B!W$,$"$C$?>l9g$O!"(Brat$B$,I8=`F~NO$r%"!<%+%$%V$7$?$b$N$H(B
$BH=JL$7!"I8=`=PNO$K=q$-=P$7$^$9!#(B

$B!V(B>>$B!W$H$$$&J8;zNs$O!"%?%0$N%*%W%7%g%s;XDj$K$O;H$($^$9$,!"%U%!%$%kL>$K(B
$B$O;H$($^$;$s!#$^$?!"%?%0$r=q$-=P$9:]!"%*%W%7%g%s$N=g=x$K$O7h$^$j$,$"$j!"(B
$B!V(B=====BEGIN: ($B%U%!%$%kL>(B)>>UU>>(part$BHV9f(B)$B!W$N=g$G$9!#(Brat$B$O$3$N=g$K@8@.(B
$B$7$^$9!#(B

$B%*%W%7%g%s(B[-l]$B$r;XDj$9$k$H!"(BRAT$B%U%!%$%k$+$i%?%0$rFI$_<h$j!"%U%!%$%k$N0l(B
$BMw$rI=<($7$^$9!#4{B8$N%U%!%$%k$d(Buuencode$B%U%!%$%k$,$"$l$P$=$N;]$b%3%a%s(B
$B%H$7$^$9!#(B

$B%G%U%)%k%H$G$O4{B8$N%U%!%$%k$O%9%-%C%W$7$^$9$,!"%*%W%7%g%s(B[-f]$B$rIU$1$k(B
$B$H!"(BRAT$B%U%!%$%k$+$iE83+$9$k:]!"6/@)E*$K>e=q$-$7$^$9!#$3$N>l9g!"(BRAT$B%U%!(B
$B%$%k<+?H$r>e=q$-$7$J$$$h$&Cm0U$7$F2<$5$$!#(B

$B%*%W%7%g%s(B[-a]$B$r;XDj$9$k$H!"4{B8$N%U%!%$%k$,$"$l$PDI2C$G=q$-=P$7$^$9!#(B

$B%*%W%7%g%s(B[-l][-f][-a]$B$O!"$3$l$i$N$&$A!":G8e$K;XDj$5$l$?$b$N$,M-8z$G$9!#(B

$B%*%W%7%g%s(B[-r]$B$r;XDj$9$k$H!":F5"E*$K%U%!%$%k$rE83+$7$^$9!#C"$7!"%*%W(B
$B%7%g%s(B[-l]$B$,;XDj$5$l$F$$$k>l9g$OL58z$H$J$j!":F5"E*$J8!:w$O$5$l$^$;$s!#(B

$B%*%W%7%g%s(B[-d]$B$r;XDj$9$k$H!"!V(B=====DIR$B!W%?%0$,M-8z$K$J$j!"%?%0$KB3$/J8(B
$B;zNs$r!"E83+@h$N%5%V%G%#%l%/%H%jL>$H$7$^$9!#(B

$B%*%W%7%g%s(B[-m]$B$r;XDj$9$k$H!"?t;z$N$_$G9=@.$5$l$k%U%!%$%kL>$J$i$P@hF,$N(B
$B!V(B0$B!W$r(B($B$"$l$P$"$k$@$1(B)$B=|5n$7$^$9!#Nc$($P!V(B01234$B!W$,!V(B1234$B!W$K$J$j$^$9!#(B
$B%a!<%j%s%0%j%9%H$+$i!V$^$H$aAw$j!W$5$l$?%a!<%kEy$KE,MQ$G$-$k$G$7$g$&!#(B

unrat$B$O!"(Brat$B$K$h$C$F9TF,$N!V(B=$B!W$,%(%9%1!<%W$5$l$F$$$k$3$H$rA0Ds$K!"9TF,(B
$B$N!V(B= =$B!W$r!V(B=$B!W$KJQ49$7$^$9$,!"%*%W%7%g%s(B[-n]$B$r;XDj$9$k$H!"$3$l$r9T$$(B
$B$^$;$s!#$^$?!"!V(B=====NO_ESC$B!W%?%0$r8!CN$7$?D>8e$N%U%!%$%k$G$b9T$$$^$;$s!#(B
$BC"$7!"$=$N4V$K%?%0$HJ6$i$o$7$$FbMF$,$"$C$?$j!"(BRAT$B%U%!%$%k$,F~$l;R$K$J$C(B
$B$F$$$k>l9g$O!"$&$^$/E83+$5$l$J$$2DG=@-$,$"$j$^$9!#(B

$B$3$l$i$N%*%W%7%g%s$OBgJ8;z!?>.J8;z$N6hJL$r$7$^$;$s!#(B

$B%U%!%$%kL>$r;XDj$7$J$+$C$?>l9g$O!"I8=`F~NO$rE83+$7$^$9!#(B
=====END
=====BEGIN: rat2mbox.doc
$B!|(Brat2mbox (current version: 1.00)

    usage: rat2mbox

$B%a!<%k$r$^$H$a$?(BRAT$B%U%!%$%k$r!"(BUCB mail$B$N(Bmailbox$B7A<0$KJQ49$9$k%U%#%k%?!#(B
UNIX From$B$N@8@.$K$O!":9=P?M$O(BFrom:$B$r!";~9o$O(BDate:$B$rMxMQ$7$^$9!#(B
=====END
=====BEGIN: rat
#!/usr/local/bin/perl
#
# rat --- Raw Archiver into Text (aRchiving cAT)
# Copyright 1995  Akihiko Kuroe <a_kuroe@kuroe.aoba.yokohama.jp>
#
$usage  = "<<rat v1.00>>\n";
$usage .= "usage: rat [options] [FILE ...]\n";
$usage .= "options: -o OUT       ... output to file 'OUT'\n";
$usage .= "         -a OUT       ... append to file 'OUT'\n";
$usage .= "         -d DIR       ... default directory name 'DIR'\n";
$usage .= "         -s[NUM[K|M]] ... split files, under NUM lines\n";
$usage .= "                          (or about NUM KB/MB with uuencoding)\n";
$usage .= "         -u           ... uuencode\n";
$usage .= "         -e           ... make self-extract-archive-file\n";
$usage .= "         -r           ... recursive archiving\n";
$usage .= "         -n           ... no escape '='\n";

$begin = '=====BEGIN: ';
$end   = '=====END';
$noesc = '=====NO_ESC';
$dir   = '=====DIR: ';
$uutmp = '_uu_tmp_.$$';

while ($_ = $ARGV[0], s/^-(.+)$/$1/ && shift) {
    next if ($_ eq '');
    s/^o//o && do {
        $ofile = $' || shift; next;
    };
    s/^O//o && do {
        $force = 1;
        $ofile = $' || shift; next;
    };
    s/^a//io && do {
        $force = 1; $append = 1;
        $ofile = $' || shift; next;
    };
    s/^d//io && do {
        $dname = $' || shift; next;
    };
    s/^s//io && do {
        $split = 1;
        if (/m$/io) {
            $max_lines = int(($` * 1024 * 1024) / 63); $opt_u = 1;
        }
        elsif (/k$/io) {
            $max_lines = int(($` * 1024) / 63); $opt_u = 1;
        }
        else {
            $max_lines = int($');
        }
        $max_lines = 500 if ($max_lines == 0);
        $max_lines =   3 if ($max_lines <  3);
        next;
    };
    s/^u//io && do {
        $opt_u = 1; redo;
    };
    s/^e//io && do {
        $opt_e = 1; redo;
    };
    s/^r//io && do {
        $opt_r = 1; redo;
    };
    s/^n//io && do {
        $opt_n = 1; redo;
    };
    print $usage;
    exit;
}

&open_outfile;

if ($ARGV[0] eq '') {
    print "$noesc\n" if ($opt_n);
    print "$begin>>STDOUT\n";
    while (<STDIN>) {
        s/^=/= =/ unless ($opt_n);
        print;
    }
    print "$end\n";
    exit;
}

foreach $fname (@ARGV) {
    $fname =~ s/\\/\//g;
    $fname =~ s/\/$//g;
    &main_loop_1($fname);
}

close(OUT);
unlink($ofile) if (-z $ofile);

## end of main

sub
main_loop_1
{
    local($fname) = @_;
    print STDERR "File: $fname";
    if (-d $fname) {
        print STDERR ", directory";
        unless ($opt_r) {
            print STDERR ", skip\n";
            next;
        }
        print STDERR ", sub\n";
        opendir(DIR, "$fname") || next;
        local(@f_names) = sort(readdir(DIR));
        foreach $i (@f_names) {
            next if ($i eq '.');
            next if ($i eq '..');
            &main_loop_1("$fname/$i");
        }
        closedir(DIR);
        next;
    }
    &main_loop_2($fname);
}

sub
main_loop_2
{
    local($fname) = @_;
    unless (open(FILE, "$fname")) {
        print STDERR ", $!, skip\n";
        next;
    }
    if ($opt_u || (-B $fname)) {
        binmode FILE;
        $enc = 1;
        print STDERR ', binary file' if (-B $fname);
    }
    else {
        $enc  = 0;
        $uu_s = '';
    }
    if ($enc) {
        $uu_s = '>>UU';
        print STDERR ', uuencoding';
        open(UU, ">$uutmp") || die "tmp error!\n";
        print UU "begin 644 $fname\n";
        while (read(FILE, $_, 900)) {
            print UU pack(u, $_);
        }
        print UU "`\nend\n";
        close(UU);
        close(FILE);
        open(FILE, "$uutmp") || die "tmp error!\n";
    }
    if ($split > 0) {
        $count = 1;
        $sp_s  = ">>$count";
        $sp_e  = ".$split";
    }
    print "$noesc\n" if ($opt_n);
    print "$begin$fname$uu_s$sp_s\n";
    $line++;
    while (<FILE>) {
        s/^=/= =/ unless ($opt_n);
        print;
        if ($line == $max_lines) {
            print "$end\n";
            print STDERR ", splitting\n";
            $split++;
            &open_outfile;
            print STDERR "File: $fname";
            print "$noesc\n" if ($opt_n);
            print "$begin$fname$uu_s$sp_s\n";
        }
        $line++;
    }
    print "$end\n";
    close(FILE);
    unlink($uutmp) if (-e $uutmp);
    print STDERR " ... packed\n";
    $line++;
}

sub
open_outfile
{
    close(OUT);
    select(STDOUT);
    if ($split > 0) {
        $count++;
        $sp_s = ">>$count";
        $sp_e = ".$split";
    }
    if ($ofile) {
        if (!$force && (-e $ofile.$sp_e)) {
            die "$ofile$sp_e, already exists, stop!\n";
        }
        else {
            if ($append) {
                open(OUT, ">>$ofile$sp_e") || die "$ofile$sp_e, $!!\n";
                select(OUT);
                print STDERR ">>> append to [$ofile$sp_e] <<<\n";
            }
            else {
                open(OUT, ">$ofile$sp_e") || die "$ofile$sp_e, $!!\n";
                select(OUT);
                print STDERR ">>> output to [$ofile$sp_e] <<<\n";
            }
        }
    }
    if ($opt_e && !$append && ($count < 2)) {
        print while (<DATA>);
    }
    $line = 2;
    print "\n" if (!$opt_e && !$ofile);
    print "$dir$dname\n" if ($dname);
}

__END__
#!/usr/local/bin/perl
#
# rat's self-extract-archive-file unit
# Copyright 1995  Akihiko Kuroe <a_kuroe@kuroe.aoba.yokohama.jp>
#
while (<DATA>) {
    if (/^=+BEGIN:\s*([^>]+)>*(UU[^>]*)?>*(\d*)$/io) {
        $ff = $1; $ff =~ s/\n//; $uu = $2; $pp = int($3); $oo = 1;
        &md($ff);
        print STDERR "File: $ff";
        print STDERR ', uuencode file' if $uu;
        print STDERR " (part $pp)" if $pp;
        print STDERR "\n";
        if ($pp > 1) {open(OUT, ">>$ff") || die "$ff, $!\n";}
        if ($pp < 2) {open(OUT,  ">$ff") || die "$ff, $!\n";}
        binmode OUT if $uu;
        next;
    }
    if (/^=+END/io) {
        close(OUT); undef ($oo, $uu, $ee); next;
    }
    unless ($oo) {
        $ee = 1 if (/^=+NO_ESC/io);
        next;
    }
    s/^= =/=/ unless $ee;
    $_ = unpack(u, $_) if $uu;
    print OUT;
}
sub md {
    $path = @_;
    for (;;) {
        $pos = rindex($path, '/');
        last if ($pos < 0);
        substr($path, $pos) = ''; unshift(@dir, $path);
    }
    foreach $i (@dir) {mkdir("$i", 0755);}
}
__END__
=====END
=====BEGIN: unrat
#!/usr/local/bin/perl
#
# unrat --- UNpack & list RAT-file
# Copyright 1995  Akihiko Kuroe <a_kuroe@kuroe.aoba.yokohama.jp>
#
$usage  = "<<unrat v1.00>>\n";
$usage .= "usage: unrat [options] [FILE ...]\n";
$usage .= "options: -l ... list\n";
$usage .= "         -f ... force output\n";
$usage .= "         -a ... append output\n";
$usage .= "         -r ... recursive output\n";
$usage .= "         -d ... directory tag is available\n";
$usage .= "         -m ... mail (numerical filename)\n";
$usage .= "         -n ... no escape '='\n";

$begin = '^=+BEGIN:\s*';
$end   = '^=+END';
$noesc = '^=+NO_ESC';
$dir   = '^=+DIR:\s*';

while ($_ = $ARGV[0], s/^-(.+)$/$1/ && shift) {
    next if ($_ eq '');
    s/^l//io && do {$opt   = 1; redo;}; #list
    s/^f//io && do {$opt   = 2; redo;}; #force
    s/^a//io && do {$opt   = 3; redo;}; #append
    s/^r//io && do {$opt_r = 1; redo;};
    s/^d//io && do {$opt_d = 1; redo;};
    s/^m//io && do {$opt_m = 1; redo;};
    s/^n//io && do {$opt_n = 1; redo;};
    print STDERR $usage;
    exit;
}

if ($ARGV[0] eq '') {
    while (<STDIN>) {
        &main_loop_2;
    }
    &main_loop_3;
    exit;
}

&main_loop_1;

##end of main

sub
main_loop_1
{
    foreach $archive (@ARGV) {
        if (open(ARCH, "$archive")) {
            if ($opt == 1) { #list
                print STDERR ">>> file list of [$archive] <<<\n";
            }
            else {
                print STDERR ">>> extract from [$archive] <<<\n";
            }
        }
        else {
            next;
        }
        while (<ARCH>) {
            &main_loop_2;
        }
        close(ARCH);
        undef $dname;
    }
    &main_loop_3;
}

sub
main_loop_2
{
    #BEGIN TAG
    if (/$begin/io) {
        $open_flg = 1;
        $fname = $';
        $fname =~ s/\n//;
        $fname =~ s/\\/\//g;
        &chk_tags;
        next if ($fname =~ />+STD/o);
        next if ($opt == 1); #list
        &open_files;
        next;
    }

    #END TAG
    if (/$end/io) {
        undef ($noesc_flg, $open_flg);
        next if ($fname =~ />+STD/o);
        $ver = $';
        $ver =~ s/\n//;
        print STDERR "$ver\n";
        $ver = '';
        next if ($opt == 1); #list
        close(FILE);
        next;
    }

    #out of TAGs
    unless ($open_flg) {
        $noesc_flg = 1 if (/$noesc/io);
        if (/$dir/io) {
            $dname = $';
            $dname =~ s/\n//;
            $dname =~ s/\\/\//g;
            $dname =~ s/[^\/]$/\//g;
        }
        next;
    }

    #inside TAGs
    s/^= =/=/ unless ($opt_n || $noesc_flg);
    if ($fname =~ />+STD/o) {
        print STDERR;
        next;
    }
    next if ($opt == 1); #list
    if ($enc) {
        binmode FILE;
        print FILE unpack(u, $_);
    }
    else {
        print FILE;
    }
}

sub
main_loop_3
{
    &merge if (($opt != 1) && %entry); #list
    if ($opt_r && @fnames) {
        @ARGV = @fnames;
        undef   @fnames;
        &main_loop_1;
    }
}

sub
chk_tags
{
    $split = 0;
    undef $enc;
    return if ($fname =~ />+STD/o);
    $fname =~ /([^>]+)>*(UU[^>]*)?>*(\d*)/io;
    return unless ($1);
    $fname = $1;
    $enc   = $2;
    $split = int($3);
    print STDERR "File: $fname";
    print STDERR ", uuencode file" if ($enc);
    print STDERR " (part $split)"  if ($split > 0);
    &chk_mail;
    &chk_dir;
    &split_file if ($split > 0);
    push(@fnames, $fname) if ($opt_r);
}

sub
chk_mail
{
    if ($opt_m && !($fname =~ /\D/)) {
        $fname = int($fname);
        print STDERR ", rename to: $fname";
    }
}

sub
chk_dir
{
    if ($opt_d && $dname) {
        $fname = $dname.$fname;
        print STDERR ", rename to: $fname";
    }
}

sub
split_file
{
    $entry_num = 10 unless (%entry);
    $entry{$fname} = $entry_num++ unless ($entry{$fname});
    $count{$fname}++;
    $tmpfile = "_$entry{$fname}_$split.$$";
    die ", tmp already exists, stop!\n" if (!$opt && (-e $tmpfile));
}

sub
open_files
{
    if (-e $fname) {
        if ($opt == 2) { #force
            print STDERR ", already exists, overwrite";
        }
        elsif ($opt == 3) { #append
            print STDERR ", already exists, append";
        }
        else {
            print STDERR ", already exists, skip";
            return;
        }
    }
    if ($count{$fname} > 0) {
        unless (open(FILE, ">$tmpfile")) {
            print STDERR ", $!, skip";
            return;
        }
    }
    else {
        &make_dir($fname);
        if ($opt == 3) { #append
            unless (open(FILE, ">>$fname")) {
                print STDERR ", $!, skip";
                return;
            }
        }
        else {
            unless (open(FILE, ">$fname")) {
                print STDERR ", $!, skip";
                return;
            }
        }
    }
}

sub
merge
{
    foreach $fname (keys(%entry)) {
        next if ((!$opt || ($opt == 1)) && (-e $fname)); #list
        unlink("$fname") unless ($opt == 3); #append
        &make_dir($fname);
        foreach $i (1 .. $count{$fname}) {
            $tmpfile = "_$entry{$fname}_$i.$$";
            if (open(TMP, "$tmpfile") && open(FILE, ">>$fname")) {
                if (-B "$tmpfile") {
                    binmode FILE;
                    binmode TMP;
                }
                print FILE while (<TMP>);
                close(FILE);
                close(TMP);
                unlink("$tmpfile");
            }
        }
    }
}

sub
make_dir {
    local($path) = @_;
    for (;;) {
        $pos = rindex($path, '/');
        last if ($pos < 0);
        substr($path, $pos) = '';
        unshift(@dir, $path);
    }
    foreach $i (@dir) {
        mkdir("$i", 0755);
    }
}
=====END
=====BEGIN: rat2mbox
#!/usr/local/bin/perl
#
# rat2mbox --- RAT-file to MailBOX v1.00
# Copyright 1995  Akihiko Kuroe <a_kuroe@kuroe.aoba.yokohama.jp>
#

$begin = '^=+BEGIN:\s*';
$end   = '^=+END';

while (<>) {
    #BEGIN TAG
    if (/$begin/io) {
        $_ =~ /([^>]+)(>>(\w+))?(>>(\d+))?/o;
        $split  = $5;
        $header = 1;
        $output = 1;
        next;
    }

    #END TAG
    if (/$end/io) {
        print "$unixfrom\n" if ($split < 2);
        print @body;
        print "\n" if ($split < 2);
        undef ($unixfrom, @body, $output);
        next;
    }

    #out of TAGs
    next unless $output;

    #inside TAGs
    s/^= =/=/;
    push(@body, $_);
    next unless $header;

    if (/^$/) {
        $from = &address($from);
        $date = &jstdate($date);
        $unixfrom = "From $from $date";
        undef ($from, $date, $header);
    }
    elsif (/^\s+/o) {
        $from .= $' if ($field eq 'from');
        $date .= $' if ($field eq 'date');
    }
    elsif (/^From: */io) {
        $from  = $';
        $field = 'from';
    }
    elsif (/^Date: */io) {
        $date  = $';
        $field = 'date';
    }
    else {
        undef $field;
    }
}

sub
address
{
    local($addr) = @_;
    $addr =~ s/\n//;
    $addr =~ s/^\s+//;
    if ($addr =~ /<(.*)>/o) {
        $addr = $1;
    }
    elsif ($addr =~ /(.*)\(.*\)(.*)/o) {
        $addr = $1.$2;
    }
    $addr;
}

sub
jstdate
{
    local($date) = @_;
    $date =~ s/\n//;
    if ($date =~ /(\S*), (\d*) (\S*) (19)?(\d*) (\d*):(\d*):(\d*) (\S*)/) {
        $date = "$1 $3 $2 $6:$7:$8 $9 19$5";
        $date =~ s/\+(0)?900/JST/;
    }
    $date;
}
=====END
--
/** Office: <a_kuroe@gaken.dnp.co.jp> **********/
/*  Univ:   <a_kuroe@hoffman.cc.sophia.ac.jp>  */
/*  Home:   <a_kuroe@kuroe.aoba.yokohama.jp>   */
/****************[Akihiko Kuroe]****************/
