Newsgroups: fj.unix
Path: galaxy.trc.rwcp.or.jp!news.trc!nf2.iij.ad.jp!nr0.iij.ad.jp!news.iij.ad.jp!rim.or.jp!Q.T.Honey!hu-eos-news!wsclark!lynx!hns!chiba-ns!odins-suita!news.cs.ritsumei.ac.jp!newshub.bkc.ritsumei.ac.jp!cancer.nca5.ad.jp!nfeed.gw.nagoya-u.ac.jp!vega2!arisawa
From: arisawa@vega2.aichi-u.ac.jp (Kenji Arisawa)
Subject: Re: [Q] usgae "tr" or "sed"
Sender: news@vega2.aichi-u.ac.jp (News Master)
Message-ID: <En3344.Bst@vega2.aichi-u.ac.jp>
Date: Tue, 20 Jan 1998 13:07:16 GMT
References: <saitoh.98Jan202031@ecipt01.ex.ecip.osaka-u.ac.jp>
Nntp-Posting-Host: vega2
Organization: Aichi University Computer Center, Aichi University, Aichi, Japan.
X-Newsreader: mnews [version 1.18PL3+] 1994-08/01(Mon)
Lines: 98
Xref: galaxy.trc.rwcp.or.jp fj.unix:4257
X-originally-archived-at: http://galaxy.rwcp.or.jp/text/cgi-bin/newsarticle2?ng=fj.unix&nb=4257&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.

$BM-_7(B@$B0&CNBg3X$G$9(B

$B:dK\$5$s(B:
>$B$I$N$h$&$J%"%k%4%j%:%`$G$bNI$1$l$P4JC1$G$9!#<!$N(B C $B%W%m%0%i%`$O!"(B
>    a.out alice bob <input >output
>$B$G!"(Balice $B$H(B bob $B$r8r49$7$^$9!#(B
$B%W%m%0%i%`$r:n$k?M$,$$$F4r$7$$$G$9$M!#(B
$BKM$O$b$&Fq$7$$%W%m%0%i%`$r:,5$6/$/9M$($i$l$kDx<c$/$O$J$$(B...

$BJ8;zNsC5:w$NLdBj$H8@$&$N$O%"%k%4%j%:%`$N(B1$B$D$NJ,Ln$r7A@.$9$kDx?<$_$N$"$k(B
$BLdBj$G!"%;%8%t%#%/$NK\$K>\$7$/2r@b$5$l$F$$$^$9!#(B
$BJ#?t8D$NJ8;zNs$NC5:wLdBj$O4JC1$K?($l$F$"$k$@$1$G!"$3$NK\$@$1$+$i$O(B
$B%W%m%0%i%`$N;Q$,$O$C$-$j$7$^$;$s!#(B

15$BG/DxA0!"KM$,(Bemacs$B$NBe$o$j$K$J$k(BOS9$BMQ$N%9%/%j!<%s%(%G%#%?$r=q$$$F$$$?;~!"(B
$BJ8;zNsC5:w$NLdBj$rB@ED=c$5$s(B($B$3$N(Bfj.unix$B$NBg8f=j$i$7$$(B)$B$H%A%i%C$HOCBj$K(B
$B$7$?$3$H$,$"$j$^$7$?!#$=$N;~B@ED$5$s$,(B Knuth-Morris-Pratt method $B$N(B
$B%3!<%G%#%s%0$r;}$C$FMh$FKM$K$/$l$^$7$?!#$3$l$r$5$7$"$2$^$9!#(B($BB@ED$5$s(B
$B$$$$$G$9$h$M(B)

$B$3$NJ}K!$G$O(Bgetchar()$B$@$1$GC5:w$,2DG=$G(B($BB($A(Bungetc()$B$r;H$o$J$$$G(B)
$B$=$N9M$(J}$O0J2<$NDL$j$G$9!#(B
$B%Q%?!<%s(B alice $B$r%F%-%9%H$+$i(B getchar() $B$7!"(Balice $B$H$NHf3S$r$7$F9T$-$^$9!#(B
ali $B$^$G$,0lCW$7(B c $B$G0lCW$7$J$$;~$K(B($BNc$($P(B
text: .....alia....
$B$N$h$&$K!"$=$N;~$KFI$_<h$C$?J8;z$r(B a $B$H$7$^$9(B) $B<!$NHf3S3+;OE@$r(B
text: .....alia....
            ^
$B$N0LCV$K;}$C$F9T$/I,MW$O$J$/(B($B$@$C$F$3$3$+$i(Bgetchar() $B$9$l$P(B lia $B$HB3$/(B
$B;v$,J,$+$C$F$$$k$N$@$b$s(B) li $B$r%U%i%C%7%e$7$F(B a $B$+$i?7$?$JHf3S$r3+;O$9$l$P(B
$B$h$$$N$@!#$=$7$F$b$&(B a $B$OFI$_<h$i$l$F$$$k!#(B
$B$=$3$G(B text $B$rFI$_<h$kA0$K!"(B alice $B$N$I$3$GIT0lCW$,@8$8$?;~$K2?$r$9$Y$-$+$r(B
$B>pJs$H$7$F;}$A$^$7$g$&$H8@$&$N$,(B Knuth-Morris-Pratt method $B$G$9!#(B

$BF1MM$J5DO@$OJ#?t8D$NJ8;zNsC5:w$NLdBj$K$bE,MQ$G$-$k$O$:$G$9!#(B
$B$,$s$P$C$F$_$F2<$5$$!#(B

$B0J2<$N%3!<%G%#%s%0$G(B
fwch() $B$O(B getchar()
dpsh() ddwn() dpop() $B$O<N$F$F9=$o$J$$(B

/*
 * Knuth-Morris-Pratt method string search algorithm
 *
 * In)      pattern: points string searched for
 *      len: length of interest portion of the string
 *
 * Returns) 1 if found, or 0 if not found
 *
 * Side effect) At return, dot points just after first string;
 *      or EOF if not found
 *
 *  Implemented by Junn Ohta/SCI    11/19/1983
 */
search(pattern, len)
char    *pattern;
int len;
{
    register int i, c;
    register int *next;
    register char *pat;
    char     ch,*calloc();

    if(!len)
    {   warning(nullstr);
        return(0);
    }
    pat  = pattern;
    next = (int *)calloc(len, sizeof(int));
    if(!next)
    {   warning(memerr);
        return(0);
    }

    next[0] = c = -1;
    for (i=1; i < len; i++)
    {   while (c >= 0 && pat[i-1] != pat[c]) c = next[c];
        c++;
        if (pat[i] == pat[c]) next[i] = next[c];
        else next[i] = c;
    }

    dpsh();
    i = 0;
    while ((c=fwch()) != EOF)
    {   ch = c;
        while (i >= 0 && ch != pat[i]) i = next[i];
        if (++i >= len)
        {   free(next);
            ddwn();
            return(1);
        }
    }
    dpop();
    warning(unfound);
    free(next);
    return(0);
}
