home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume18 / gnugrep1.3.pch / cvt1.2to1.3
Text File  |  1989-03-12  |  47KB  |  1,565 lines

  1. diff -rcN grep-1.2/Makefile grep-1.3/Makefile
  2. *** grep-1.2/Makefile    Thu Oct 13 22:11:28 1988
  3. --- grep-1.3/Makefile    Tue Feb 28 23:37:13 1989
  4. ***************
  5. *** 5,27 ****
  6.   # Add -DUSG for System V.
  7.   CFLAGS = -O
  8.   
  9.   # You may add getopt.o if your C library lacks getopt(); note that
  10.   # 4.3BSD getopt() is said to be somewhat broken.
  11.   # Add alloca.o if your machine does not support alloca().
  12. ! OBJS = grep.o dfa.o regex.o
  13.   
  14.   all: regress
  15.   
  16. ! regress: grep
  17.       cd tests; sh regress.sh
  18.   
  19. ! grep: $(OBJS)
  20. !     $(CC) $(CFLAGS) -o grep $(OBJS)
  21. !     rm -f egrep
  22. !     ln grep egrep
  23.   
  24.   clean:
  25. !     rm -f grep egrep *.o core tests/core tests/tmp.script
  26.   
  27. ! dfa.o grep.o: dfa.h
  28. ! grep.o regex.o: regex.h
  29. --- 5,40 ----
  30.   # Add -DUSG for System V.
  31.   CFLAGS = -O
  32.   
  33. + #
  34.   # You may add getopt.o if your C library lacks getopt(); note that
  35.   # 4.3BSD getopt() is said to be somewhat broken.
  36. + #
  37.   # Add alloca.o if your machine does not support alloca().
  38. ! #
  39. ! OBJS = dfa.o regex.o
  40. ! GOBJ = grep.o
  41. ! EOBJ = egrep.o
  42.   
  43. + # Space provided for machine dependent libraries.
  44. + LIBS =
  45.   all: regress
  46.   
  47. ! regress: egrep grep
  48.       cd tests; sh regress.sh
  49.   
  50. ! egrep: $(OBJS) $(EOBJ)
  51. !     $(CC) $(CFLAGS) -o egrep $(OBJS) $(EOBJ) $(LIBS)
  52. ! egrep.o: grep.c
  53. !     $(CC) $(CFLAGS) -DEGREP -c grep.c
  54. !     mv grep.o egrep.o
  55. ! grep: $(OBJS) $(GOBJ)
  56. !     $(CC) $(CFLAGS) -o grep $(OBJS) $(GOBJ) $(LIBS)
  57.   
  58.   clean:
  59. !     rm -f grep egrep *.o core tests/core tests/tmp.script tests/khadafy.out
  60.   
  61. ! dfa.o egrep.o grep.o: dfa.h
  62. ! egrep.o grep.o regex.o: regex.h
  63. diff -rcN grep-1.2/README grep-1.3/README
  64. *** grep-1.2/README    Tue Dec 13 11:04:21 1988
  65. --- grep-1.3/README    Wed Mar  1 21:43:59 1989
  66. ***************
  67. *** 1,4 ****
  68. ! This README documents GNU e?grep version 1.2.
  69.   
  70.   Changes needed to the makefile under various perversions of Unix are
  71.   described therein.
  72. --- 1,4 ----
  73. ! This README documents GNU e?grep version 1.3.
  74.   
  75.   Changes needed to the makefile under various perversions of Unix are
  76.   described therein.
  77. diff -rcN grep-1.2/README.sunos4 grep-1.3/README.sunos4
  78. *** grep-1.2/README.sunos4    Wed Dec 31 18:00:00 1969
  79. --- grep-1.3/README.sunos4    Tue Feb 28 22:35:10 1989
  80. ***************
  81. *** 0 ****
  82. --- 1,96 ----
  83. + Date:    Fri, 24 Feb 89 15:36:40 -0600
  84. + To:      mike@wheaties.ai.mit.edu
  85. + From:    Dave Cohrs <dave@cs.wisc.edu>
  86. + Subject: bug + fix in gnu grep 1.2 (from prep.ai.mit.edu)
  87. + I tried installing the GNU grep 1.2 on a Sun4 running 4.0.1 and
  88. + "Spencer test #36" failed.  After some experimenting, I found and
  89. + fixed the bug.  Well, actually, the bug in the the C compiler, but
  90. + I managed a workaround.
  91. + Description:
  92. + The Sun4 4.0.1 C compiler with -O doesn't generate the correct for
  93. + statements of the form
  94. +     if("string")
  95. +         x;
  96. +     else
  97. +         y;
  98. + To be exact, "y;" gets executed, while "x;" should.  This causes the
  99. + #define FETCH() to fail for test #36.
  100. + Fix:
  101. + In an #ifdef sparc in dfa.c, I made two versions of FETCH, FETCH0() and
  102. + the regular FETCH().  The former takes only one argument, the latter
  103. + expects its 2nd argument to contain a non-nil string.  This removes
  104. + the need to test the constant strings, and the compiler bug isn't
  105. + exercised.  I then changed the one instance of FETCH() with a nil
  106. + second argument to be FETCH0() instead.
  107. + dave cohrs
  108. + ===================================================================
  109. + RCS file: RCS/dfa.c,v
  110. + retrieving revision 1.1
  111. + diff -c -r1.1 dfa.c
  112. + *** /tmp/,RCSt1a05930    Fri Feb 24 15:32:33 1989
  113. + --- dfa.c    Fri Feb 24 15:23:34 1989
  114. + ***************
  115. + *** 285,293 ****
  116. + --- 285,315 ----
  117. +                      is turned off). */
  118. +   
  119. +   /* Note that characters become unsigned here. */
  120. + + #ifdef sparc
  121. + + /*
  122. + +  * Sun4 4.0.1 C compiler can't compare constant strings correctly.
  123. + +  * e.g. if("test") { x; } else { y; }
  124. + +  * the compiler will not generate code to execute { x; }, but
  125. + +  * executes { y; } instead.
  126. + +  */
  127. + + #define FETCH0(c)                 \
  128. + +   {                         \
  129. + +     if (! lexleft)                 \
  130. + +       return _END;                 \
  131. + +     (c) = (unsigned char) *lexptr++;  \
  132. + +     --lexleft;                     \
  133. + +   }
  134. +   #define FETCH(c, eoferr)             \
  135. +     {                         \
  136. +       if (! lexleft)                 \
  137. + +       regerror(eoferr);            \
  138. + +     (c) = (unsigned char) *lexptr++;  \
  139. + +     --lexleft;                     \
  140. + +   }
  141. + + #else
  142. + + #define FETCH(c, eoferr)             \
  143. + +   {                         \
  144. + +     if (! lexleft)                 \
  145. +         if (eoferr)                 \
  146. +       regerror(eoferr);            \
  147. +         else                     \
  148. + ***************
  149. + *** 295,300 ****
  150. + --- 317,323 ----
  151. +       (c) = (unsigned char) *lexptr++;  \
  152. +       --lexleft;                     \
  153. +     }
  154. + + #endif sparc
  155. +   
  156. +   static _token
  157. +   lex()
  158. + ***************
  159. + *** 303,309 ****
  160. + --- 326,336 ----
  161. +     int invert;
  162. +     _charset cset;
  163. +   
  164. + + #ifdef sparc
  165. + +   FETCH0(c);
  166. + + #else
  167. +     FETCH(c, (char *) 0);
  168. + + #endif sparc
  169. +     switch (c)
  170. +       {
  171. +       case '^':
  172. diff -rcN grep-1.2/dfa.c grep-1.3/dfa.c
  173. *** grep-1.2/dfa.c    Thu Oct 13 22:11:29 1988
  174. --- grep-1.3/dfa.c    Tue Feb 28 18:46:35 1989
  175. ***************
  176. *** 105,110 ****
  177. --- 105,112 ----
  178.   You are forbidden to forbid anyone else to use, share and improve
  179.   what you give them.   Help stamp out software-hoarding!  */
  180.   
  181. + #include <stdio.h>
  182. + #include <assert.h>
  183.   #include <ctype.h>
  184.   #include "dfa.h"
  185.   
  186. ***************
  187. *** 135,140 ****
  188. --- 137,143 ----
  189.   {
  190.     ptr_t r = malloc(n);
  191.   
  192. +   assert(n != 0);
  193.     if (r)
  194.       return r;
  195.     else
  196. ***************
  197. *** 148,153 ****
  198. --- 151,157 ----
  199.   {
  200.     ptr_t r = realloc(p, n);
  201.   
  202. +   assert(n != 0);
  203.     if (r)
  204.       return r;
  205.     else
  206. ***************
  207. *** 1122,1128 ****
  208.         {
  209.       copy(&r->follows[i], &merged);
  210.       epsclosure(&merged, r);
  211. !     REALLOC(r->follows[i].elems, _position, merged.nelem);
  212.       copy(&merged, &r->follows[i]);
  213.         }
  214.   
  215. --- 1126,1133 ----
  216.         {
  217.       copy(&r->follows[i], &merged);
  218.       epsclosure(&merged, r);
  219. !     if (r->follows[i].nelem < merged.nelem)
  220. !       REALLOC(r->follows[i].elems, _position, merged.nelem);
  221.       copy(&merged, &r->follows[i]);
  222.         }
  223.   
  224. ***************
  225. *** 1719,1742 ****
  226.   Having found the postfix representation of the regular expression,
  227.   try to find a long sequence of characters that must appear in any line
  228.   containing the r.e.
  229. ! Finding a "longest" sequence is beyond the scope of this bagatelle;
  230. ! we take the easy way out and hope for the best.
  231.   
  232. ! We do a bottom-up calculation of several (possibly zero-length) sequences
  233. ! of characters that must appear in matches of r.e.'s represented by trees
  234. ! rooted at the nodes of the postfix representation:
  235.       sequences that must appear at the left of the match ("left")
  236.       sequences that must appear at the right of the match ("right")
  237. !     sequences that must appear somewhere in the match ("in")
  238.       sequences that must constitute the match ("is")
  239. ! When we get to the root of the tree, we use its calculated "in" sequence
  240. ! as our answer.  The sequence we find is returned in r->must (where "r" is
  241. ! the single argument passed to "regmust"); the length of the sequence is
  242. ! returned in r->mustn.
  243.   
  244.   The sequences calculated for the various types of node (in pseudo ANSI c)
  245.   are shown below.  "p" is the operand of unary operators (and the left-hand
  246. ! operand of binary operators); "q" is the right-hand operand of binary operators.
  247.   "ZERO" means "a zero-length sequence" below.
  248.   
  249.   Type    left        right        is        in
  250. --- 1724,1749 ----
  251.   Having found the postfix representation of the regular expression,
  252.   try to find a long sequence of characters that must appear in any line
  253.   containing the r.e.
  254. ! Finding a "longest" sequence is beyond the scope here;
  255. ! we take an easy way out and hope for the best.
  256. ! (Take "(ab|a)b"--please.)
  257.   
  258. ! We do a bottom-up calculation of sequences of characters that must appear
  259. ! in matches of r.e.'s represented by trees rooted at the nodes of the postfix
  260. ! representation:
  261.       sequences that must appear at the left of the match ("left")
  262.       sequences that must appear at the right of the match ("right")
  263. !     lists of sequences that must appear somewhere in the match ("in")
  264.       sequences that must constitute the match ("is")
  265. ! When we get to the root of the tree, we use one of the longest of its
  266. ! calculated "in" sequences as our answer.  The sequence we find is returned in
  267. ! r->must (where "r" is the single argument passed to "regmust");
  268. ! the length of the sequence is returned in r->mustn.
  269.   
  270.   The sequences calculated for the various types of node (in pseudo ANSI c)
  271.   are shown below.  "p" is the operand of unary operators (and the left-hand
  272. ! operand of binary operators); "q" is the right-hand operand of binary operators
  273. ! .
  274.   "ZERO" means "a zero-length sequence" below.
  275.   
  276.   Type    left        right        is        in
  277. ***************
  278. *** 1749,1865 ****
  279.   
  280.   QMARK    ZERO        ZERO        ZERO        ZERO
  281.   
  282. ! PLUS    p->left        p->right    ZERO        ZERO
  283.   
  284. ! CAT    (p->is==ZERO)?    (q->is==ZERO)?    (p->is!=ZERO &&    longest of
  285. !     p->left :    q->right :    q->is!=ZERO) ?    p->in, q->in, or
  286.       p->is##q->left    p->right##q->is    p->is##q->is :    p->right##q->left
  287.                       ZERO
  288.   
  289. ! OR    longest common    longest common    (do p->is and    (do p->in and
  290. !     leading        trailing    q->is have same    q->in have same
  291. !     (sub)sequence    (sub)sequence    length and    length and
  292. !     of p->left    of p->right    content) ?    content) ?
  293. !     and q->left    and q->right    p->is : NULL    p->in : NULL
  294.   
  295.   If there's anything else we recognize in the tree, all four sequences get set
  296.   to zero-length sequences.  If there's something we don't recognize in the tree,
  297.   we just return a zero-length sequence.
  298.   
  299. ! After the above calculations are performed, three additional steps are taken:
  300.   
  301. ! 1.    If there's a non-zero-length "is" sequence, it replaces the
  302. !     "left", "right", and "in" sequences.
  303. ! 2.    If the "left" sequence is longer than the "in" sequence, it replaces
  304. !     the "in" sequence.
  305. ! 3.    If the "right" sequence is longer than the "in" sequence, it replaces
  306. !     the "in" sequence.
  307. ! Possibilities:
  308. ! 1.    Find the longest common (sub)sequence of p->in and q->in when doing
  309. !     an OR node's "in" sequence?  Possibly effective, as in
  310. !         egrep 'pepsi|epsilon'
  311. !     but is it cheap and easy enough?
  312. ! 2.    In replacing "in" sequences with "left" and "right" sequences, how
  313. !     should ties be broken?
  314. ! 3.    Switch to allocated memory, rather than relying on a defined MUST_MAX?
  315.   */
  316.   
  317. ! #define TRUE    1
  318. ! #define FALSE    0
  319.   
  320. ! typedef struct {
  321. !     int    n;
  322. !     char    p[MUST_MAX];
  323. ! } counted;
  324.   
  325. ! #define initcounted(cp)    ((cp)->n = 0)
  326. ! static void
  327. ! cntcpy(top, fromp)
  328. ! counted *    top;
  329. ! counted *    fromp;
  330. ! {
  331. !     register char *    fp;
  332. !     register char *    tp;
  333. !     register int    n;
  334. !     fp = fromp->p;
  335. !     tp = top->p;
  336. !     n = fromp->n;
  337. !     top->n = n;
  338. !     while (n-- > 0)
  339. !         *tp++ = *fp++;
  340. ! }
  341. ! static void
  342. ! cntcat(top, fromp)
  343. ! counted *    top;
  344. ! counted *    fromp;
  345. ! {
  346. !     register char *    fp;
  347. !     register char *    tp;
  348. !     register int    n;
  349. !     fp = fromp->p;
  350. !     tp = top->p + top->n;
  351. !     n = fromp->n;
  352. !     top->n += n;
  353. !     while (n-- > 0)
  354. !         *tp++ = *fp++;
  355. ! }
  356. ! static int
  357. ! cntsame(acp, bcp)
  358. ! counted *    acp;
  359. ! counted *    bcp;
  360.   {
  361.       register int    i;
  362.   
  363. !     if (acp->n != bcp->n)
  364. !         return FALSE;
  365. !     for (i = 0; i < acp->n; ++i)
  366. !         if (acp->p[i] != bcp->p[i])
  367. !             return FALSE;
  368. !     return TRUE;
  369.   }
  370.   
  371.   
  372.   typedef struct {
  373. !     counted    left;
  374. !     counted    right;
  375. !     counted    in;
  376. !     counted    is;
  377.   } must;
  378.   
  379.   static void
  380. ! initmust(mp)
  381. ! must *    mp;
  382.   {
  383. !     initcounted(&mp->left);
  384. !     initcounted(&mp->right);
  385. !     initcounted(&mp->in);
  386. !     initcounted(&mp->is);
  387.   }
  388.   
  389.   static void
  390. --- 1756,2022 ----
  391.   
  392.   QMARK    ZERO        ZERO        ZERO        ZERO
  393.   
  394. ! PLUS    p->left        p->right    ZERO        p->in
  395.   
  396. ! CAT    (p->is==ZERO)?    (q->is==ZERO)?    (p->is!=ZERO &&    p->in plus
  397. !     p->left :    q->right :    q->is!=ZERO) ?    q->in plus
  398.       p->is##q->left    p->right##q->is    p->is##q->is :    p->right##q->left
  399.                       ZERO
  400.   
  401. ! OR    longest common    longest common    (do p->is and    substrings common to
  402. !     leading        trailing    q->is have same    p->in and q->in
  403. !     (sub)sequence    (sub)sequence    length and    
  404. !     of p->left    of p->right    content) ?    
  405. !     and q->left    and q->right    p->is : NULL    
  406.   
  407.   If there's anything else we recognize in the tree, all four sequences get set
  408.   to zero-length sequences.  If there's something we don't recognize in the tree,
  409.   we just return a zero-length sequence.
  410.   
  411. ! Break ties in favor of infrequent letters (choosing 'zzz' in preference to
  412. ! 'aaa')?
  413.   
  414. ! And. . .is it here or someplace that we might ponder "optimizations" such as
  415. !     egrep 'psi|epsilon'    ->    egrep 'psi'
  416. !     egrep 'pepsi|epsilon'    ->    egrep 'epsi'
  417. !                     (Yes, we now find "epsi" as a "string
  418. !                     that must occur", but we might also
  419. !                     simplify the *entire* r.e. being sought
  420. ! )
  421. !     grep '[c]'        ->    grep 'c'
  422. !     grep '(ab|a)b'        ->    grep 'ab'
  423. !     grep 'ab*'        ->    grep 'a'
  424. !     grep 'a*b'        ->    grep 'b'
  425. ! There are several issues:
  426. !     Is optimization easy (enough)?
  427. !     Does optimization actually accomplish anything,
  428. !     or is the automaton you get from "psi|epsilon" (for example)
  429. !     the same as the one you get from "psi" (for example)?
  430. !     Are optimizable r.e.'s likely to be used in real-life situations
  431. !     (something like 'ab*' is probably unlikely; something like is
  432. !     'psi|epsilon' is likelier)?
  433.   */
  434.   
  435. ! static char *
  436. ! icatalloc(old, new)
  437. ! char *    old;
  438. ! char *    new;
  439. ! {
  440. !     register char *    result;
  441. !     register int    oldsize, newsize;
  442. !     newsize = (new == NULL) ? 0 : strlen(new);
  443. !     if (old == NULL)
  444. !         oldsize = 0;
  445. !     else if (newsize == 0)
  446. !         return old;
  447. !     else    oldsize = strlen(old);
  448. !     if (old == NULL)
  449. !         result = (char *) malloc(newsize + 1);
  450. !     else    result = (char *) realloc((void *) old, oldsize + newsize + 1);
  451. !     if (result != NULL && new != NULL)
  452. !         (void) strcpy(result + oldsize, new);
  453. !     return result;
  454. ! }
  455. ! static char *
  456. ! icpyalloc(string)
  457. ! const char *    string;
  458. ! {
  459. !     return icatalloc((char *) NULL, string);
  460. ! }
  461. ! static char *
  462. ! istrstr(lookin, lookfor)
  463. ! char *        lookin;
  464. ! register char *    lookfor;
  465. ! {
  466. !     register char *    cp;
  467. !     register int    len;
  468.   
  469. !     len = strlen(lookfor);
  470. !     for (cp = lookin; *cp != '\0'; ++cp)
  471. !         if (strncmp(cp, lookfor, len) == 0)
  472. !             return cp;
  473. !     return NULL;
  474. ! }
  475. ! static void
  476. ! ifree(cp)
  477. ! char *    cp;
  478. ! {
  479. !     if (cp != NULL)
  480. !         free(cp);
  481. ! }
  482. ! static void
  483. ! freelist(cpp)
  484. ! register char **    cpp;
  485. ! {
  486. !     register int    i;
  487. !     if (cpp == NULL)
  488. !         return;
  489. !     for (i = 0; cpp[i] != NULL; ++i) {
  490. !         free(cpp[i]);
  491. !         cpp[i] = NULL;
  492. !     }
  493. ! }
  494. ! static char **
  495. ! enlist(cpp, new, len)
  496. ! register char **    cpp;
  497. ! register char *        new;
  498. ! {
  499. !     register int    i, j;
  500. !     if (cpp == NULL)
  501. !         return NULL;
  502. !     if ((new = icpyalloc(new)) == NULL) {
  503. !         freelist(cpp);
  504. !         return NULL;
  505. !     }
  506. !     new[len] = '\0';
  507. !     /*
  508. !     ** Is there already something in the list that's new (or longer)?
  509. !     */
  510. !     for (i = 0; cpp[i] != NULL; ++i)
  511. !         if (istrstr(cpp[i], new) != NULL) {
  512. !             free(new);
  513. !             return cpp;
  514. !         }
  515. !     /*
  516. !     ** Eliminate any obsoleted strings.
  517. !     */
  518. !     j = 0;
  519. !     while (cpp[j] != NULL)
  520. !         if (istrstr(new, cpp[j]) == NULL)
  521. !             ++j;
  522. !         else {
  523. !             free(cpp[j]);
  524. !             if (--i == j)
  525. !                 break;
  526. !             cpp[j] = cpp[i];
  527. !         }
  528. !     /*
  529. !     ** Add the new string.
  530. !     */
  531. !     cpp = (char **) realloc((char *) cpp, (i + 2) * sizeof *cpp);
  532. !     if (cpp == NULL)
  533. !         return NULL;
  534. !     cpp[i] = new;
  535. !     cpp[i + 1] = NULL;
  536. !     return cpp;
  537. ! }
  538. ! /*
  539. ! ** Given pointers to two strings,
  540. ! ** return a pointer to an allocated list of their distinct common substrings.
  541. ! ** Return NULL if something seems wild.
  542. ! */
  543.   
  544. ! static char **
  545. ! comsubs(left, right)
  546. ! char *    left;
  547. ! char *    right;
  548. ! {
  549. !     register char **    cpp;
  550. !     register char *        lcp;
  551. !     register char *        rcp;
  552. !     register int        i, len;
  553. !     if (left == NULL || right == NULL)
  554. !         return NULL;
  555. !     cpp = (char **) malloc(sizeof *cpp);
  556. !     if (cpp == NULL)
  557. !         return NULL;
  558. !     cpp[0] = NULL;
  559. !     for (lcp = left; *lcp != '\0'; ++lcp) {
  560. !         len = 0;
  561. !         rcp = strchr(right, *lcp);
  562. !         while (rcp != NULL) {
  563. !             for (i = 1; lcp[i] != '\0' && lcp[i] == rcp[i]; ++i)
  564. !                 ;
  565. !             if (i > len)
  566. !                 len = i;
  567. !             rcp = strchr(rcp + 1, *lcp);
  568. !         }
  569. !         if (len == 0)
  570. !             continue;
  571. !         if ((cpp = enlist(cpp, lcp, len)) == NULL)
  572. !             break;
  573. !     }
  574. !     return cpp;
  575. ! }
  576. ! static char **
  577. ! addlists(old, new)
  578. ! char **    old;
  579. ! char **    new;
  580.   {
  581.       register int    i;
  582.   
  583. !     if (old == NULL || new == NULL)
  584. !         return NULL;
  585. !     for (i = 0; new[i] != NULL; ++i) {
  586. !         old = enlist(old, new[i], strlen(new[i]));
  587. !         if (old == NULL)
  588. !             break;
  589. !     }
  590. !     return old;
  591.   }
  592.   
  593. + /*
  594. + ** Given two lists of substrings,
  595. + ** return a new list giving substrings common to both.
  596. + */
  597. + static char **
  598. + inboth(left, right)
  599. + char **    left;
  600. + char **    right;
  601. + {
  602. +     register char **    both;
  603. +     register char **    temp;
  604. +     register int        lnum, rnum;
  605. +     if (left == NULL || right == NULL)
  606. +         return NULL;
  607. +     both = (char **) malloc(sizeof *both);
  608. +     if (both == NULL)
  609. +         return NULL;
  610. +     both[0] = NULL;
  611. +     for (lnum = 0; left[lnum] != NULL; ++lnum) {
  612. +         for (rnum = 0; right[rnum] != NULL; ++rnum) {
  613. +             temp = comsubs(left[lnum], right[rnum]);
  614. +             if (temp == NULL) {
  615. +                 freelist(both);
  616. +                 return NULL;
  617. +             }
  618. +             both = addlists(both, temp);
  619. +             freelist(temp);
  620. +             if (both == NULL)
  621. +                 return NULL;
  622. +         }
  623. +     }
  624. +     return both;
  625. + }
  626.   
  627.   typedef struct {
  628. !     char **    in;
  629. !     char *    left;
  630. !     char *    right;
  631. !     char *    is;
  632.   } must;
  633.   
  634.   static void
  635. ! resetmust(mp)
  636. ! register must *    mp;
  637.   {
  638. !     mp->left[0] = mp->right[0] = mp->is[0] = '\0';
  639. !     freelist(mp->in);
  640.   }
  641.   
  642.   static void
  643. ***************
  644. *** 1866,1884 ****
  645.   regmust(r)
  646.   register struct regexp *    r;
  647.   {
  648. !     must            musts[MUST_MAX];
  649.       register must *        mp;
  650. !     counted            result;
  651.       register int        ri;
  652.       register int        i;
  653.       register _token        t;
  654.   
  655.       reg->mustn = 0;
  656.       reg->must[0] = '\0';
  657. !     if (reg->tindex > MUST_MAX)
  658.           return;
  659.       mp = musts;
  660. !     initcounted(&result);
  661.       for (ri = 0; ri < reg->tindex; ++ri) {
  662.           switch (t = reg->tokens[ri]) {
  663.           case _ALLBEGLINE:
  664. --- 2023,2056 ----
  665.   regmust(r)
  666.   register struct regexp *    r;
  667.   {
  668. !     register must *        musts;
  669.       register must *        mp;
  670. !     register char *        result;
  671.       register int        ri;
  672.       register int        i;
  673.       register _token        t;
  674. +     static must        must0;
  675.   
  676.       reg->mustn = 0;
  677.       reg->must[0] = '\0';
  678. !     musts = (must *) malloc((reg->tindex + 1) * sizeof *musts);
  679. !     if (musts == NULL)
  680.           return;
  681.       mp = musts;
  682. !     for (i = 0; i <= reg->tindex; ++i)
  683. !         mp[i] = must0;
  684. !     for (i = 0; i <= reg->tindex; ++i) {
  685. !         mp[i].in = (char **) malloc(sizeof *mp[i].in);
  686. !         mp[i].left = malloc(2);
  687. !         mp[i].right = malloc(2);
  688. !         mp[i].is = malloc(2);
  689. !         if (mp[i].in == NULL || mp[i].left == NULL ||
  690. !             mp[i].right == NULL || mp[i].is == NULL)
  691. !                 goto done;
  692. !         mp[i].left[0] = mp[i].right[0] = mp[i].is[0] = '\0';
  693. !         mp[i].in[0] = NULL;
  694. !     }
  695. !     result = "";
  696.       for (ri = 0; ri < reg->tindex; ++ri) {
  697.           switch (t = reg->tokens[ri]) {
  698.           case _ALLBEGLINE:
  699. ***************
  700. *** 1894,1900 ****
  701.           case _LIMWORD:
  702.           case _NOTLIMWORD:
  703.           case _BACKREF:
  704. !             initmust(mp);
  705.               break;
  706.           case _STAR:
  707.           case _QMARK:
  708. --- 2066,2072 ----
  709.           case _LIMWORD:
  710.           case _NOTLIMWORD:
  711.           case _BACKREF:
  712. !             resetmust(mp);
  713.               break;
  714.           case _STAR:
  715.           case _QMARK:
  716. ***************
  717. *** 1901,1945 ****
  718.               if (mp <= musts)
  719.                   goto done;    /* "cannot happen" */
  720.               --mp;
  721. !             initmust(mp);
  722.               break;
  723.           case _OR:
  724.               if (mp < &musts[2])
  725.                   goto done;    /* "cannot happen" */
  726.               {
  727. !                 register must *    lmp;
  728. !                 register must *    rmp;
  729. !                 register int    j, n;
  730.   
  731.                   rmp = --mp;
  732.                   lmp = --mp;
  733.                   /* Guaranteed to be.  Unlikely, but. . . */
  734. !                 if (!cntsame(&lmp->is, &rmp->is))
  735. !                     initcounted(&lmp->is);
  736.                   /* Left side--easy */
  737. !                 n = lmp->left.n;
  738. !                 if (n > rmp->left.n)
  739. !                     n = rmp->left.n;
  740. !                 for (i = 0; i < n; ++i)
  741. !                     if (lmp->left.p[i] != rmp->left.p[i])
  742. !                         break;
  743. !                 lmp->left.n = i;
  744.                   /* Right side */
  745. !                 n = lmp->right.n;
  746. !                 if (n > rmp->right.n)
  747. !                     n = rmp->right.n;
  748.                   for (i = 0; i < n; ++i)
  749. !                     if (lmp->right.p[lmp->right.n-i-1] !=
  750. !                         rmp->right.p[rmp->right.n-i-1])
  751.                           break;
  752.                   for (j = 0; j < i; ++j)
  753. !                     lmp->right.p[j] =
  754. !                         lmp->right.p[(lmp->right.n -
  755. !                             i) + j];
  756. !                 lmp->right.n = i;
  757. !                 /* Includes.  Unlikely, but. . . */
  758. !                 if (!cntsame(&lmp->in, &rmp->in))
  759. !                     initcounted(&lmp->in);
  760.               }
  761.               break;
  762.           case _PLUS:
  763. --- 2073,2120 ----
  764.               if (mp <= musts)
  765.                   goto done;    /* "cannot happen" */
  766.               --mp;
  767. !             resetmust(mp);
  768.               break;
  769.           case _OR:
  770.               if (mp < &musts[2])
  771.                   goto done;    /* "cannot happen" */
  772.               {
  773. !                 register char **    new;
  774. !                 register must *        lmp;
  775. !                 register must *        rmp;
  776. !                 register int        j, ln, rn, n;
  777.   
  778.                   rmp = --mp;
  779.                   lmp = --mp;
  780.                   /* Guaranteed to be.  Unlikely, but. . . */
  781. !                 if (strcmp(lmp->is, rmp->is) != 0)
  782. !                     lmp->is[0] = '\0';
  783.                   /* Left side--easy */
  784. !                 i = 0;
  785. !                 while (lmp->left[i] != '\0' &&
  786. !                     lmp->left[i] == rmp->left[i])
  787. !                         ++i;
  788. !                 lmp->left[i] = '\0';
  789.                   /* Right side */
  790. !                 ln = strlen(lmp->right);
  791. !                 rn = strlen(rmp->right);
  792. !                 n = ln;
  793. !                 if (n > rn)
  794. !                     n = rn;
  795.                   for (i = 0; i < n; ++i)
  796. !                     if (lmp->right[ln - i - 1] !=
  797. !                         rmp->right[rn - i - 1])
  798.                           break;
  799.                   for (j = 0; j < i; ++j)
  800. !                     lmp->right[j] =
  801. !                         lmp->right[(ln - i) + j];
  802. !                 lmp->right[j] = '\0';
  803. !                 new = inboth(lmp->in, rmp->in);
  804. !                 if (new == NULL)
  805. !                     goto done;
  806. !                 freelist(lmp->in);
  807. !                 free((char *) lmp->in);
  808. !                 lmp->in = new;
  809.               }
  810.               break;
  811.           case _PLUS:
  812. ***************
  813. *** 1946,2001 ****
  814.               if (mp <= musts)
  815.                   goto done;    /* "cannot happen" */
  816.               --mp;
  817. !             initcounted(&mp->is);
  818.               break;
  819.           case _END:
  820.               if (mp != &musts[1])
  821.                   goto done;    /* "cannot happen" */
  822. !             result = musts[0].in;
  823.               goto done;
  824.           case _CAT:
  825.               if (mp < &musts[2])
  826.                   goto done;    /* "cannot happen" */
  827.               {
  828. !                 must *    lmp;
  829. !                 must *    rmp;
  830. !                 must    new;
  831. !                 must *    nmp;
  832. !                 int    a, b, c;
  833.   
  834.                   rmp = --mp;
  835.                   lmp = --mp;
  836. !                 nmp = &new;
  837. !                 initmust(nmp);
  838.                   /* Left-hand */
  839. !                 cntcat(&nmp->left, &lmp->left);
  840. !                 if (lmp->is.n != 0)
  841. !                     cntcat(&nmp->left, &rmp->left);
  842.                   /* Right-hand */
  843. !                 if (rmp->is.n != 0)
  844. !                     cntcat(&nmp->right, &lmp->right);
  845. !                 cntcat(&nmp->right, &rmp->right);
  846.                   /* Guaranteed to be */
  847. !                 if (lmp->is.n != 0 && rmp->is.n != 0) {
  848. !                     cntcat(&nmp->is, &lmp->is);
  849. !                     cntcat(&nmp->is, &rmp->is);
  850.                   }
  851. -                 /* Interior */
  852. -                 a = lmp->in.n;
  853. -                 b = rmp->in.n;
  854. -                 c = lmp->right.n + rmp->left.n;
  855. -                 if (a == 0 && b == 0 && c == 0) {
  856. -                     /* nothing */
  857. -                     ;
  858. -                 } else if (c > a && c > b) {
  859. -                     cntcat(&nmp->in, &lmp->right);
  860. -                     cntcat(&nmp->in, &rmp->left);
  861. -                 } else if (a > b) {
  862. -                     cntcat(&nmp->in, &lmp->in);
  863. -                 } else {
  864. -                     cntcat(&nmp->in, &rmp->in);
  865. -                 }
  866. -                 *mp = new;
  867.               }
  868.               break;
  869.           default:
  870. --- 2121,2187 ----
  871.               if (mp <= musts)
  872.                   goto done;    /* "cannot happen" */
  873.               --mp;
  874. !             mp->is[0] = '\0';
  875.               break;
  876.           case _END:
  877.               if (mp != &musts[1])
  878.                   goto done;    /* "cannot happen" */
  879. !             for (i = 0; musts[0].in[i] != NULL; ++i)
  880. !                 if (strlen(musts[0].in[i]) > strlen(result))
  881. !                     result = musts[0].in[i];
  882.               goto done;
  883.           case _CAT:
  884.               if (mp < &musts[2])
  885.                   goto done;    /* "cannot happen" */
  886.               {
  887. !                 register must *    lmp;
  888. !                 register must *    rmp;
  889.   
  890.                   rmp = --mp;
  891.                   lmp = --mp;
  892. !                 /*
  893. !                 ** In.  Everything in left, plus everything in
  894. !                 ** right, plus catenation of
  895. !                 ** left's right and right's left.
  896. !                 */
  897. !                 lmp->in = addlists(lmp->in, rmp->in);
  898. !                 if (lmp->in == NULL)
  899. !                     goto done;
  900. !                 if (lmp->right[0] != '\0' &&
  901. !                     rmp->left[0] != '\0') {
  902. !                         register char *    tp;
  903. !                         tp = icpyalloc(lmp->right);
  904. !                         if (tp == NULL)
  905. !                             goto done;
  906. !                         tp = icatalloc(tp, rmp->left);
  907. !                         if (tp == NULL)
  908. !                             goto done;
  909. !                         lmp->in = enlist(lmp->in, tp,
  910. !                             strlen(tp));
  911. !                         free(tp);
  912. !                         if (lmp->in == NULL)
  913. !                             goto done;
  914. !                 }
  915.                   /* Left-hand */
  916. !                 if (lmp->is[0] != '\0') {
  917. !                     lmp->left = icatalloc(lmp->left,
  918. !                         rmp->left);
  919. !                     if (lmp->left == NULL)
  920. !                         goto done;
  921. !                 }
  922.                   /* Right-hand */
  923. !                 if (rmp->is[0] == '\0')
  924. !                     lmp->right[0] = '\0';
  925. !                 lmp->right = icatalloc(lmp->right, rmp->right);
  926. !                 if (lmp->right == NULL)
  927. !                     goto done;
  928.                   /* Guaranteed to be */
  929. !                 if (lmp->is[0] != '\0' && rmp->is[0] != '\0') {
  930. !                     lmp->is = icatalloc(lmp->is, rmp->is);
  931. !                     if (lmp->is == NULL)
  932. !                         goto done;
  933.                   }
  934.               }
  935.               break;
  936.           default:
  937. ***************
  938. *** 2002,2036 ****
  939.               if (t < _END) {
  940.                   /* "cannot happen" */
  941.                   goto done;
  942.               } else if (t >= _SET) {
  943.                   /* easy enough */
  944. !                 initmust(mp);
  945.               } else {
  946.                   /* plain character */
  947. !                 mp->left.p[0] = mp->right.p[0] =
  948. !                     mp->in.p[0] = mp->is.p[0] = t;
  949. !                 mp->left.n = mp->right.n =
  950. !                     mp->in.n = mp->is.n = 1;
  951. !                 break;
  952.               }
  953.               break;
  954.           }
  955. -         /*
  956. -         ** "Additional steps"
  957. -         */
  958. -         if (mp->is.n > 0) {
  959. -             cntcpy(&mp->left, &mp->is);
  960. -             cntcpy(&mp->right, &mp->is);
  961. -             cntcpy(&mp->in, &mp->is);
  962. -         }
  963. -         if (mp->left.n > mp->in.n)
  964. -             cntcpy(&mp->in, &mp->left);
  965. -         if (mp->right.n > mp->in.n)
  966. -             cntcpy(&mp->in, &mp->right);
  967.           ++mp;
  968.       }
  969.   done:
  970. !     reg->mustn = result.n;
  971. !     for (i = 0; i < result.n; ++i)
  972. !         reg->must[i] = result.p[i];
  973.   }
  974. --- 2188,2223 ----
  975.               if (t < _END) {
  976.                   /* "cannot happen" */
  977.                   goto done;
  978. +             } else if (t == '\0') {
  979. +                 /* not on *my* shift */
  980. +                 goto done;
  981.               } else if (t >= _SET) {
  982.                   /* easy enough */
  983. !                 resetmust(mp);
  984.               } else {
  985.                   /* plain character */
  986. !                 resetmust(mp);
  987. !                 mp->is[0] = mp->left[0] = mp->right[0] = t;
  988. !                 mp->is[1] = mp->left[1] = mp->right[1] = '\0';
  989. !                 mp->in = enlist(mp->in, mp->is, 1);
  990. !                 if (mp->in == NULL)
  991. !                     goto done;
  992.               }
  993.               break;
  994.           }
  995.           ++mp;
  996.       }
  997.   done:
  998. !     (void) strncpy(reg->must, result, MUST_MAX - 1);
  999. !     reg->must[MUST_MAX - 1] = '\0';
  1000. !     reg->mustn = strlen(reg->must);
  1001. !     mp = musts;
  1002. !     for (i = 0; i <= reg->tindex; ++i) {
  1003. !         freelist(mp[i].in);
  1004. !         ifree((char *) mp[i].in);
  1005. !         ifree(mp[i].left);
  1006. !         ifree(mp[i].right);
  1007. !         ifree(mp[i].is);
  1008. !     }
  1009. !     free((char *) mp);
  1010.   }
  1011. diff -rcN grep-1.2/dfa.h grep-1.3/dfa.h
  1012. *** grep-1.2/dfa.h    Thu Oct 13 22:11:29 1988
  1013. --- grep-1.3/dfa.h    Tue Feb 28 21:53:15 1989
  1014. ***************
  1015. *** 103,108 ****
  1016. --- 103,117 ----
  1017.   You are forbidden to forbid anyone else to use, share and improve
  1018.   what you give them.   Help stamp out software-hoarding!  */
  1019.   
  1020. + #ifdef USG
  1021. + #include <string.h>
  1022. + extern char *index();
  1023. + #else
  1024. + #include <strings.h>
  1025. + extern char *strchr(), *strrchr(), *memcpy();
  1026. + #endif
  1027.   #ifdef __STDC__
  1028.   
  1029.   /* Missing include files for GNU C. */
  1030. ***************
  1031. *** 113,124 ****
  1032.   extern void *realloc(void *, size_t);
  1033.   extern void free(void *);
  1034.   
  1035. - #ifndef USG
  1036. - extern char *strchr(), *strrchr(), *memcpy();
  1037. - #else
  1038. - extern char *index();
  1039. - #endif
  1040.   extern char *bcopy(), *bzero();
  1041.   
  1042.   #ifdef SOMEDAY
  1043. --- 122,127 ----
  1044. ***************
  1045. *** 136,147 ****
  1046.   extern char *calloc(), *malloc(), *realloc();
  1047.   extern void free();
  1048.   
  1049. - #ifndef USG
  1050. - extern char *strchr(), *strrchr(), *memcpy();
  1051. - #else
  1052. - extern char *index();
  1053. - #endif
  1054.   extern char *bcopy(), *bzero();
  1055.   
  1056.   #define ISALNUM(c) (isascii(c) && isalnum(c))
  1057. --- 139,144 ----
  1058. ***************
  1059. *** 380,387 ****
  1060.      a constraint. */
  1061.   typedef struct
  1062.   {
  1063. !   unsigned index:24,        /* Index into the parse array. */
  1064. !        constraint:8;    /* Constraint for matching this position. */
  1065.   } _position;
  1066.   
  1067.   /* Sets of positions are stored as arrays. */
  1068. --- 377,384 ----
  1069.      a constraint. */
  1070.   typedef struct
  1071.   {
  1072. !   unsigned index;        /* Index into the parse array. */
  1073. !   unsigned constraint;        /* Constraint for matching this position. */
  1074.   } _position;
  1075.   
  1076.   /* Sets of positions are stored as arrays. */
  1077. ***************
  1078. *** 398,407 ****
  1079.   {
  1080.     int hash;            /* Hash of the positions of this state. */
  1081.     _position_set elems;        /* Positions this state could match. */
  1082. !   unsigned newline:1,        /* True if previous state matched newline. */
  1083. !        letter:1,        /* True if previous state matched a letter. */
  1084. !        backref:1,        /* True if this state matches a \<digit>. */
  1085. !        constraint:8;    /* Constraint for this state to accept. */
  1086.     int first_end;        /* Token value of the first _END in elems. */
  1087.   } _dfa_state;
  1088.   
  1089. --- 395,404 ----
  1090.   {
  1091.     int hash;            /* Hash of the positions of this state. */
  1092.     _position_set elems;        /* Positions this state could match. */
  1093. !   char newline;            /* True if previous state matched newline. */
  1094. !   char letter;            /* True if previous state matched a letter. */
  1095. !   char backref;            /* True if this state matches a \<digit>. */
  1096. !   unsigned char constraint;    /* Constraint for this state to accept. */
  1097.     int first_end;        /* Token value of the first _END in elems. */
  1098.   } _dfa_state;
  1099.   
  1100. diff -rcN grep-1.2/getopt.c grep-1.3/getopt.c
  1101. *** grep-1.2/getopt.c    Sun Dec 11 10:37:36 1988
  1102. --- grep-1.3/getopt.c    Tue Feb 28 17:44:55 1989
  1103. ***************
  1104. *** 406,412 ****
  1105.           if (opterr != 0)
  1106.             fprintf (stderr, "%s: no argument for `-%c' option\n",
  1107.                  argv[0], c);
  1108. !         optarg = 0;
  1109.             }
  1110.           else
  1111.             /* We already incremented `optind' once;
  1112. --- 406,412 ----
  1113.           if (opterr != 0)
  1114.             fprintf (stderr, "%s: no argument for `-%c' option\n",
  1115.                  argv[0], c);
  1116. !         c = '?';
  1117.             }
  1118.           else
  1119.             /* We already incremented `optind' once;
  1120. diff -rcN grep-1.2/grep.c grep-1.3/grep.c
  1121. *** grep-1.2/grep.c    Tue Dec 13 10:54:54 1988
  1122. --- grep-1.3/grep.c    Tue Feb 28 23:05:53 1989
  1123. ***************
  1124. *** 368,376 ****
  1125.         /* If a potential backreference is indicated, try it out with
  1126.            a backtracking matcher to make sure the line is a match. */
  1127.         if (try_backref && re_search(®ex, matching_line,
  1128. !                        next_line - matching_line,
  1129.                          0,
  1130. !                        next_line - matching_line,
  1131.                          NULL) < 0)
  1132.           {
  1133.             resume = next_line;
  1134. --- 368,376 ----
  1135.         /* If a potential backreference is indicated, try it out with
  1136.            a backtracking matcher to make sure the line is a match. */
  1137.         if (try_backref && re_search(®ex, matching_line,
  1138. !                        next_line - matching_line - 1,
  1139.                          0,
  1140. !                        next_line - matching_line - 1,
  1141.                          NULL) < 0)
  1142.           {
  1143.             resume = next_line;
  1144. ***************
  1145. *** 542,548 ****
  1146.     exit(ERROR);
  1147.   }
  1148.   
  1149. ! static char version[] = "GNU e?grep, version 1.2";
  1150.   
  1151.   main(argc, argv)
  1152.        int argc;
  1153. --- 542,548 ----
  1154.     exit(ERROR);
  1155.   }
  1156.   
  1157. ! static char version[] = "GNU e?grep, version 1.3";
  1158.   
  1159.   main(argc, argv)
  1160.        int argc;
  1161. ***************
  1162. *** 679,695 ****
  1163.       break;
  1164.         }
  1165.   
  1166. !   /* Set the syntax depending on arg 0 and whether to ignore case. */
  1167. !   if (*prog == 'e')
  1168. !     {
  1169. !       regsyntax(RE_SYNTAX_EGREP, ignore_case);
  1170. !       re_set_syntax(RE_SYNTAX_EGREP);
  1171. !     }
  1172. !   else
  1173. !     {
  1174. !       regsyntax(RE_SYNTAX_GREP, ignore_case);
  1175. !       re_set_syntax(RE_SYNTAX_GREP);
  1176. !     }
  1177.   
  1178.     /* Compile the regexp according to all the options. */
  1179.     if (regexp_file)
  1180. --- 679,692 ----
  1181.       break;
  1182.         }
  1183.   
  1184. !   /* Set the syntax depending on whether we are EGREP or not. */
  1185. ! #ifdef EGREP
  1186. !   regsyntax(RE_SYNTAX_EGREP, ignore_case);
  1187. !   re_set_syntax(RE_SYNTAX_EGREP);
  1188. ! #else
  1189. !   regsyntax(RE_SYNTAX_GREP, ignore_case);
  1190. !   re_set_syntax(RE_SYNTAX_GREP);
  1191. ! #endif
  1192.   
  1193.     /* Compile the regexp according to all the options. */
  1194.     if (regexp_file)
  1195. ***************
  1196. *** 712,717 ****
  1197. --- 709,715 ----
  1198.         if (i == len)
  1199.           the_regexp = realloc(the_regexp, len *= 2);
  1200.       }
  1201. +       fclose(fp);
  1202.         /* Nuke the concluding newline so we won't match the empty string. */
  1203.         if (i > 0 && the_regexp[i - 1] == '\n')
  1204.       --i;
  1205. diff -rcN grep-1.2/grep.man grep-1.3/grep.man
  1206. *** grep-1.2/grep.man    Tue Dec 13 11:46:46 1988
  1207. --- grep-1.3/grep.man    Tue Feb 28 21:42:46 1989
  1208. ***************
  1209. *** 6,21 ****
  1210.   .B grep
  1211.   [
  1212.   .B \-CVbchilnsvwx
  1213. ! ]
  1214. ! [
  1215. ! .B \-\c
  1216. ! .I num
  1217. ! ]
  1218. ! [
  1219.   .B \-AB
  1220.   .I num
  1221. ! ]
  1222. ! [ [
  1223.   .B \-e
  1224.   ]
  1225.   .I expr
  1226. --- 6,17 ----
  1227.   .B grep
  1228.   [
  1229.   .B \-CVbchilnsvwx
  1230. ! ] [
  1231. ! .BI \- num
  1232. ! ] [
  1233.   .B \-AB
  1234.   .I num
  1235. ! ] [ [
  1236.   .B \-e
  1237.   ]
  1238.   .I expr
  1239. ***************
  1240. *** 254,260 ****
  1241.   the aforementioned BMG search for a large class of regexps.
  1242.   .PP
  1243.   Richard Stallman wrote the backtracking regexp matcher that is
  1244. ! used for \\fIdigit\fP backreferences, as well as the getopt that
  1245.   is provided for 4.2BSD sites.  The backtracking matcher was
  1246.   originally written for GNU Emacs.
  1247.   .PP
  1248. --- 250,256 ----
  1249.   the aforementioned BMG search for a large class of regexps.
  1250.   .PP
  1251.   Richard Stallman wrote the backtracking regexp matcher that is
  1252. ! used for \\\fIdigit\fP backreferences, as well as the getopt that
  1253.   is provided for 4.2BSD sites.  The backtracking matcher was
  1254.   originally written for GNU Emacs.
  1255.   .PP
  1256. diff -rcN grep-1.2/regex.c grep-1.3/regex.c
  1257. *** grep-1.2/regex.c    Sun Oct 16 14:55:19 1988
  1258. --- grep-1.3/regex.c    Tue Feb 28 17:44:59 1989
  1259. ***************
  1260. *** 1,106 ****
  1261. ! /* Extended regular expression matching and search.
  1262. !    Copyright (C) 1985 Free Software Foundation, Inc.
  1263.   
  1264. !                NO WARRANTY
  1265.   
  1266. -   BECAUSE THIS PROGRAM IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY
  1267. - NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW.  EXCEPT
  1268. - WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
  1269. - RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE THIS PROGRAM "AS IS"
  1270. - WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
  1271. - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1272. - FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY
  1273. - AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
  1274. - DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
  1275. - CORRECTION.
  1276.   
  1277. !  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M.
  1278. ! STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY
  1279. ! WHO MAY MODIFY AND REDISTRIBUTE THIS PROGRAM AS PERMITTED BELOW, BE
  1280. ! LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR
  1281. ! OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
  1282. ! USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
  1283. ! DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR
  1284. ! A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) THIS
  1285. ! PROGRAM, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
  1286. ! DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
  1287. !         GENERAL PUBLIC LICENSE TO COPY
  1288. !   1. You may copy and distribute verbatim copies of this source file
  1289. ! as you receive it, in any medium, provided that you conspicuously and
  1290. ! appropriately publish on each copy a valid copyright notice "Copyright
  1291. ! (C) 1985 Free Software Foundation, Inc."; and include following the
  1292. ! copyright notice a verbatim copy of the above disclaimer of warranty
  1293. ! and of this License.  You may charge a distribution fee for the
  1294. ! physical act of transferring a copy.
  1295. !   2. You may modify your copy or copies of this source file or
  1296. ! any portion of it, and copy and distribute such modifications under
  1297. ! the terms of Paragraph 1 above, provided that you also do the following:
  1298. !     a) cause the modified files to carry prominent notices stating
  1299. !     that you changed the files and the date of any change; and
  1300. !     b) cause the whole of any work that you distribute or publish,
  1301. !     that in whole or in part contains or is a derivative of this
  1302. !     program or any part thereof, to be licensed at no charge to all
  1303. !     third parties on terms identical to those contained in this
  1304. !     License Agreement (except that you may choose to grant more extensive
  1305. !     warranty protection to some or all third parties, at your option).
  1306. !     c) You may charge a distribution fee for the physical act of
  1307. !     transferring a copy, and you may at your option offer warranty
  1308. !     protection in exchange for a fee.
  1309. ! Mere aggregation of another unrelated program with this program (or its
  1310. ! derivative) on a volume of a storage or distribution medium does not bring
  1311. ! the other program under the scope of these terms.
  1312. !   3. You may copy and distribute this program (or a portion or derivative
  1313. ! of it, under Paragraph 2) in object code or executable form under the terms
  1314. ! of Paragraphs 1 and 2 above provided that you also do one of the following:
  1315. !     a) accompany it with the complete corresponding machine-readable
  1316. !     source code, which must be distributed under the terms of
  1317. !     Paragraphs 1 and 2 above; or,
  1318. !     b) accompany it with a written offer, valid for at least three
  1319. !     years, to give any third party free (except for a nominal
  1320. !     shipping charge) a complete machine-readable copy of the
  1321. !     corresponding source code, to be distributed under the terms of
  1322. !     Paragraphs 1 and 2 above; or,
  1323. !     c) accompany it with the information you received as to where the
  1324. !     corresponding source code may be obtained.  (This alternative is
  1325. !     allowed only for noncommercial distribution and only if you
  1326. !     received the program in object code or executable form alone.)
  1327. ! For an executable file, complete source code means all the source code for
  1328. ! all modules it contains; but, as a special exception, it need not include
  1329. ! source code for modules which are standard libraries that accompany the
  1330. ! operating system on which the executable file runs.
  1331. !   4. You may not copy, sublicense, distribute or transfer this program
  1332. ! except as expressly provided under this License Agreement.  Any attempt
  1333. ! otherwise to copy, sublicense, distribute or transfer this program is void and
  1334. ! your rights to use the program under this License agreement shall be
  1335. ! automatically terminated.  However, parties who have received computer
  1336. ! software programs from you with this License Agreement will not have
  1337. ! their licenses terminated so long as such parties remain in full compliance.
  1338. !   5. If you wish to incorporate parts of this program into other free
  1339. ! programs whose distribution conditions are different, write to the Free
  1340. ! Software Foundation at 675 Mass Ave, Cambridge, MA 02139.  We have not yet
  1341. ! worked out a simple rule that can be stated here, but we will often permit
  1342. ! this.  We will be guided by the two goals of preserving the free status of
  1343. ! all derivatives of our free software and of promoting the sharing and reuse of
  1344. ! software.
  1345. ! In other words, you are welcome to use, share and improve this program.
  1346. ! You are forbidden to forbid anyone else to use, share and improve
  1347. ! what you give them.   Help stamp out software-hoarding!  */
  1348.   
  1349.   
  1350.   /* To test, compile with -Dtest.
  1351. --- 1,24 ----
  1352. ! /* Extended regular expression matching and search library.
  1353. !    Copyright (C) 1985, 1989 Free Software Foundation, Inc.
  1354.   
  1355. !    This program is free software; you can redistribute it and/or modify
  1356. !    it under the terms of the GNU General Public License as published by
  1357. !    the Free Software Foundation; either version 1, or (at your option)
  1358. !    any later version.
  1359. !    This program is distributed in the hope that it will be useful,
  1360. !    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1361. !    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1362. !    GNU General Public License for more details.
  1363. !    You should have received a copy of the GNU General Public License
  1364. !    along with this program; if not, write to the Free Software
  1365. !    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1366.   
  1367.   
  1368. !    In other words, you are welcome to use, share and improve this program.
  1369. !    You are forbidden to forbid anyone else to use, share and improve
  1370. !    what you give them.   Help stamp out software-hoarding!  */
  1371.   
  1372.   
  1373.   /* To test, compile with -Dtest.
  1374. diff -rcN grep-1.2/regex.h grep-1.3/regex.h
  1375. *** grep-1.2/regex.h    Sat Aug 13 13:15:10 1988
  1376. --- grep-1.3/regex.h    Tue Feb 28 17:44:59 1989
  1377. ***************
  1378. *** 1,106 ****
  1379.   /* Definitions for data structures callers pass the regex library.
  1380. !    Copyright (C) 1985 Free Software Foundation, Inc.
  1381.   
  1382. !                NO WARRANTY
  1383.   
  1384. -   BECAUSE THIS PROGRAM IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY
  1385. - NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW.  EXCEPT
  1386. - WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
  1387. - RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE THIS PROGRAM "AS IS"
  1388. - WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
  1389. - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1390. - FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY
  1391. - AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
  1392. - DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
  1393. - CORRECTION.
  1394.   
  1395. !  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M.
  1396. ! STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY
  1397. ! WHO MAY MODIFY AND REDISTRIBUTE THIS PROGRAM AS PERMITTED BELOW, BE
  1398. ! LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR
  1399. ! OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
  1400. ! USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
  1401. ! DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR
  1402. ! A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) THIS
  1403. ! PROGRAM, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
  1404. ! DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
  1405. !         GENERAL PUBLIC LICENSE TO COPY
  1406. !   1. You may copy and distribute verbatim copies of this source file
  1407. ! as you receive it, in any medium, provided that you conspicuously and
  1408. ! appropriately publish on each copy a valid copyright notice "Copyright
  1409. ! (C) 1985 Free Software Foundation, Inc."; and include following the
  1410. ! copyright notice a verbatim copy of the above disclaimer of warranty
  1411. ! and of this License.  You may charge a distribution fee for the
  1412. ! physical act of transferring a copy.
  1413. !   2. You may modify your copy or copies of this source file or
  1414. ! any portion of it, and copy and distribute such modifications under
  1415. ! the terms of Paragraph 1 above, provided that you also do the following:
  1416. !     a) cause the modified files to carry prominent notices stating
  1417. !     that you changed the files and the date of any change; and
  1418. !     b) cause the whole of any work that you distribute or publish,
  1419. !     that in whole or in part contains or is a derivative of this
  1420. !     program or any part thereof, to be licensed at no charge to all
  1421. !     third parties on terms identical to those contained in this
  1422. !     License Agreement (except that you may choose to grant more extensive
  1423. !     warranty protection to some or all third parties, at your option).
  1424. !     c) You may charge a distribution fee for the physical act of
  1425. !     transferring a copy, and you may at your option offer warranty
  1426. !     protection in exchange for a fee.
  1427. ! Mere aggregation of another unrelated program with this program (or its
  1428. ! derivative) on a volume of a storage or distribution medium does not bring
  1429. ! the other program under the scope of these terms.
  1430. !   3. You may copy and distribute this program (or a portion or derivative
  1431. ! of it, under Paragraph 2) in object code or executable form under the terms
  1432. ! of Paragraphs 1 and 2 above provided that you also do one of the following:
  1433. !     a) accompany it with the complete corresponding machine-readable
  1434. !     source code, which must be distributed under the terms of
  1435. !     Paragraphs 1 and 2 above; or,
  1436. !     b) accompany it with a written offer, valid for at least three
  1437. !     years, to give any third party free (except for a nominal
  1438. !     shipping charge) a complete machine-readable copy of the
  1439. !     corresponding source code, to be distributed under the terms of
  1440. !     Paragraphs 1 and 2 above; or,
  1441. !     c) accompany it with the information you received as to where the
  1442. !     corresponding source code may be obtained.  (This alternative is
  1443. !     allowed only for noncommercial distribution and only if you
  1444. !     received the program in object code or executable form alone.)
  1445. ! For an executable file, complete source code means all the source code for
  1446. ! all modules it contains; but, as a special exception, it need not include
  1447. ! source code for modules which are standard libraries that accompany the
  1448. ! operating system on which the executable file runs.
  1449. !   4. You may not copy, sublicense, distribute or transfer this program
  1450. ! except as expressly provided under this License Agreement.  Any attempt
  1451. ! otherwise to copy, sublicense, distribute or transfer this program is void and
  1452. ! your rights to use the program under this License agreement shall be
  1453. ! automatically terminated.  However, parties who have received computer
  1454. ! software programs from you with this License Agreement will not have
  1455. ! their licenses terminated so long as such parties remain in full compliance.
  1456. !   5. If you wish to incorporate parts of this program into other free
  1457. ! programs whose distribution conditions are different, write to the Free
  1458. ! Software Foundation at 675 Mass Ave, Cambridge, MA 02139.  We have not yet
  1459. ! worked out a simple rule that can be stated here, but we will often permit
  1460. ! this.  We will be guided by the two goals of preserving the free status of
  1461. ! all derivatives of our free software and of promoting the sharing and reuse of
  1462. ! software.
  1463. ! In other words, you are welcome to use, share and improve this program.
  1464. ! You are forbidden to forbid anyone else to use, share and improve
  1465. ! what you give them.   Help stamp out software-hoarding!  */
  1466.   
  1467.   
  1468.   /* Define number of parens for which we record the beginnings and ends.
  1469. --- 1,24 ----
  1470.   /* Definitions for data structures callers pass the regex library.
  1471. !    Copyright (C) 1985, 1989 Free Software Foundation, Inc.
  1472.   
  1473. !    This program is free software; you can redistribute it and/or modify
  1474. !    it under the terms of the GNU General Public License as published by
  1475. !    the Free Software Foundation; either version 1, or (at your option)
  1476. !    any later version.
  1477. !    This program is distributed in the hope that it will be useful,
  1478. !    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1479. !    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1480. !    GNU General Public License for more details.
  1481. !    You should have received a copy of the GNU General Public License
  1482. !    along with this program; if not, write to the Free Software
  1483. !    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1484.   
  1485.   
  1486. !    In other words, you are welcome to use, share and improve this program.
  1487. !    You are forbidden to forbid anyone else to use, share and improve
  1488. !    what you give them.   Help stamp out software-hoarding!  */
  1489.   
  1490.   
  1491.   /* Define number of parens for which we record the beginnings and ends.
  1492.  
  1493.