home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / cook-1.4 / part03 < prev    next >
Text File  |  1993-05-03  |  100KB  |  4,174 lines

  1. Newsgroups: comp.sources.unix
  2. From: pmiller@bmr.gov.au (Peter Miller)
  3. Subject: v26i211: cook-1.4 - a file construction tool (like "make"), Part03/11
  4. Sender: unix-sources-moderator@efficacy.home.vix.com
  5. Approved: WhoAmI@efficacy.home.vix.com
  6.  
  7. Submitted-By: pmiller@bmr.gov.au (Peter Miller)
  8. Posting-Number: Volume 26, Issue 211
  9. Archive-Name: cook-1.4/part03
  10.  
  11. #! /bin/sh
  12. # This is a shell archive.  Remove anything before this line, then unpack
  13. # it by saving it into a file and typing "sh file".  To overwrite existing
  14. # files, type "sh file -c".  You can also feed this as standard input via
  15. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  16. # will see the following message at the end:
  17. #        "End of archive 3 (of 11)."
  18. # Contents:  aux/patches.sh c_incl/lang_c.c c_incl/lang_roff.c
  19. #   common/help.c common/mem.c common/trace.h conf/dcosx cook/cook.h
  20. #   cook/env.c cook/listing.c cook/option.h cook/stmt.h doc/glossary
  21. #   doc/intro.aa doc/match doc/option lib/c lib/library lib/program
  22. #   lib/yacc lib/yacc_many man1/c_incl.1 man1/cooktime.1 man1/roffpp.1
  23. #   test/00/t0038a.sh test/00/t0041a.sh
  24. # Wrapped by vixie@efficacy.home.vix.com on Tue May  4 01:36:37 1993
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. if test -f 'aux/patches.sh' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'aux/patches.sh'\"
  28. else
  29. echo shar: Extracting \"'aux/patches.sh'\" \(2787 characters\)
  30. sed "s/^X//" >'aux/patches.sh' <<'END_OF_FILE'
  31. X#! /bin/sh
  32. X#
  33. X#    cook - file construction tool
  34. X#    Copyright (C) 1993 Peter Miller.
  35. X#    All rights reserved.
  36. X#
  37. X#    This program is free software; you can redistribute it and/or modify
  38. X#    it under the terms of the GNU General Public License as published by
  39. X#    the Free Software Foundation; either version 2 of the License, or
  40. X#    (at your option) any later version.
  41. X#
  42. X#    This program is distributed in the hope that it will be useful,
  43. X#    but WITHOUT ANY WARRANTY; without even the implied warranty of
  44. X#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  45. X#    GNU General Public License for more details.
  46. X#
  47. X#    You should have received a copy of the GNU General Public License
  48. X#    along with this program; if not, write to the Free Software
  49. X#    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  50. X#
  51. X# MANIFEST: shell script to generate the patch file
  52. X#
  53. Xcase $# in
  54. X2)
  55. X    project=$1
  56. X    change=$2
  57. X    ;;
  58. X*)
  59. X    echo "usage: $0 <project> <change>" 1>&2
  60. X    exit 1
  61. X    ;;
  62. Xesac
  63. X
  64. Xset -e
  65. Xtmp=/tmp/$$
  66. Xtmp2=/tmp/$$.2
  67. X
  68. X#
  69. X# These files are generated
  70. X# so we don't have an older version in history
  71. X#
  72. Xweird="README BUILDING CHANGES MANIFEST Makefile"
  73. Xecho "#! /bin/sh"
  74. Xecho "#"
  75. Xecho "# This is a self-applying patch in a shell script."
  76. Xecho "# It has this form because some of the files are generated,"
  77. Xecho "# and thus no history is available for them;"
  78. Xecho "# they need to be deleted before the patch is applied."
  79. Xecho "#"
  80. Xecho "# Change directory to the appropriate place"
  81. Xecho "# before applying running this shell script."
  82. Xecho "#"
  83. Xecho "# Don't forget the -p0 option if you apply this patch manually."
  84. Xecho "#"
  85. Xecho "# ------------------------------------------------------------"
  86. Xecho
  87. Xecho "#"
  88. Xecho "# Before you apply this patch,"
  89. Xecho "# please delete the following files:"
  90. Xecho "#"
  91. Xecho "rm -f $weird"
  92. Xecho
  93. Xecho "#"
  94. Xecho "# Now patch the files..."
  95. Xecho "#    (Don't forget the -p0 option.)"
  96. Xecho "#"
  97. Xecho "patch -p0 << 'fubar'"
  98. X
  99. X#
  100. X# the patchlevel patch can be generated accurately
  101. X#
  102. Xecho "Index: common/patchlevel.h"
  103. Xprev=`aegis -list version -p $project -c $change | awk -F'"' '/previous/{print $2}'`
  104. Xecho "Prereq: \"$prev\""
  105. Xecho "#define PATCHLEVEL \"$prev\"" > $tmp
  106. Xset +e
  107. Xdiff -c $tmp common/patchlevel.h | sed '1,2d'
  108. Xset -e
  109. X
  110. X#
  111. X# fake patches for the generated files
  112. X#
  113. Xfor f in $weird
  114. Xdo
  115. X    echo "Index: $f"
  116. X    set +e
  117. X    diff -c /dev/null $f | sed '1,2d'
  118. X    set -e
  119. Xdone
  120. X
  121. X#
  122. X# get a list of files from aegis
  123. X#
  124. Xfiles=`(aegis -l pf -p $project -c $change -ter; aegis -l cf -p $project -c $change -ter) | sort`
  125. X
  126. X#
  127. X# get the diff listing for each file
  128. X#
  129. Xfor f in $files
  130. Xdo
  131. X    aegis -cp $f -delta 1 -output $tmp -p $project -c $change
  132. X    set +e
  133. X    if diff -c $tmp $f > $tmp2 2> /dev/null
  134. X    then
  135. X        set -e
  136. X    else
  137. X        set -e
  138. X        echo "Index: $f"
  139. X        sed '1,2d' < $tmp2
  140. X    fi
  141. Xdone
  142. Xecho "fubar"
  143. X
  144. X#
  145. X# clean up and go home
  146. X#
  147. Xrm -f $tmp $tmp2
  148. Xexit 0
  149. END_OF_FILE
  150. if test 2787 -ne `wc -c <'aux/patches.sh'`; then
  151.     echo shar: \"'aux/patches.sh'\" unpacked with wrong size!
  152. fi
  153. # end of 'aux/patches.sh'
  154. fi
  155. if test -f 'c_incl/lang_c.c' -a "${1}" != "-c" ; then 
  156.   echo shar: Will not clobber existing file \"'c_incl/lang_c.c'\"
  157. else
  158. echo shar: Extracting \"'c_incl/lang_c.c'\" \(4272 characters\)
  159. sed "s/^X//" >'c_incl/lang_c.c' <<'END_OF_FILE'
  160. X/*
  161. X *    cook - file construction tool
  162. X *    Copyright (C) 1992, 1993 Peter Miller.
  163. X *    All rights reserved.
  164. X *
  165. X *    This program is free software; you can redistribute it and/or modify
  166. X *    it under the terms of the GNU General Public License as published by
  167. X *    the Free Software Foundation; either version 2 of the License, or
  168. X *    (at your option) any later version.
  169. X *
  170. X *    This program is distributed in the hope that it will be useful,
  171. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  172. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  173. X *    GNU General Public License for more details.
  174. X *
  175. X *    You should have received a copy of the GNU General Public License
  176. X *    along with this program; if not, write to the Free Software
  177. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  178. X *
  179. X * MANIFEST: functions to scan C language files
  180. X */
  181. X
  182. X#include <ctype.h>
  183. X#include <string.h>
  184. X
  185. X#include <error.h>
  186. X#include <mem.h>
  187. X#include <sniff.h>
  188. X#include <trace.h>
  189. X#include <word.h>
  190. X
  191. X
  192. X/*
  193. X * NAME
  194. X *    directive
  195. X *
  196. X * SYNOPSIS
  197. X *    void directive(char *line, wlist *type1, wlist *type2);
  198. X *
  199. X * DESCRIPTION
  200. X *    The directive function is used to scan a # control line for an
  201. X *    include directive.  If one is found, the filename
  202. X *    is resolved, and the path appended to the appropriate list.
  203. X *
  204. X * ARGUMENTS
  205. X *    line    - the line of text from the program
  206. X *    type1    - list of <filenames>
  207. X *    type2    - list of "filenames"
  208. X *
  209. X * CAVEATS
  210. X *    Just ignore anything we don't understand.
  211. X */
  212. X
  213. Xstatic void directive _((char *s, wlist *type1, wlist *type2));
  214. X
  215. Xstatic void
  216. Xdirective(s, type1, type2)
  217. X    char        *s;
  218. X    wlist        *type1;
  219. X    wlist        *type2;
  220. X{
  221. X    int        right;
  222. X    char        *filename;
  223. X    string_ty    *path;
  224. X
  225. X    /*
  226. X     * see if it is a #include directive
  227. X     */
  228. X    trace(("directive(s = \"%s\", type1 = %08lX, type2 = %08lX)\n{\n"/*}*/,
  229. X        s, type1, type2));
  230. X    assert(*s == '#');
  231. X    s++;
  232. X    while (isspace(*s))
  233. X        ++s;
  234. X    if (memcmp(s, "include", 7))
  235. X        goto done;
  236. X    s += 7;
  237. X    while (isspace(*s))
  238. X        ++s;
  239. X
  240. X    /*
  241. X     * figure which type
  242. X     */
  243. X    switch (*s++)
  244. X    {
  245. X    default:
  246. X        goto done;
  247. X
  248. X    case '"':
  249. X        right = '"';
  250. X        break;
  251. X
  252. X    case '<':
  253. X        right = '>';
  254. X        break;
  255. X    }
  256. X
  257. X    /*
  258. X     * find the end of the filename
  259. X     *    (ignore anything on the end of the line)
  260. X     */
  261. X    filename = s;
  262. X    while (*s != right)
  263. X    {
  264. X        if (!*s)
  265. X            goto done;
  266. X        ++s;
  267. X    }
  268. X
  269. X    /*
  270. X     * extract the path
  271. X     */
  272. X    if (s == filename)
  273. X        goto done;
  274. X    path = str_n_from_c(filename, s - filename);
  275. X
  276. X    /*
  277. X     * dispatch the path to the appropriate list
  278. X     */
  279. X    if (right != '"')
  280. X        wl_append_unique(type1, path);
  281. X    else
  282. X        wl_append_unique(type2, path);
  283. X    str_free(path);
  284. X
  285. X    /*
  286. X     * here for all exits
  287. X     */
  288. X    done:
  289. X    trace((/*{*/"}\n"));
  290. X}
  291. X
  292. X
  293. X/*
  294. X * NAME
  295. X *    lang_c_scan
  296. X *
  297. X * SYNOPSIS
  298. X *    int lang_c_scan(FILE *fp, wlist *type1, wlist *type2);
  299. X *
  300. X * DESCRIPTION
  301. X *    The lang_c_scan function is used to scan a file looking
  302. X *    for nclude files.  It does not walk the children.
  303. X *    The names of any include files encountered are appended
  304. X *    to the appropriate list.
  305. X *
  306. X * ARGUMENTS
  307. X *    fp    - file stream to scan
  308. X *    type1    - list of <filenames>
  309. X *    type2    - list of "filenames"
  310. X *    
  311. X * RETURNS
  312. X *    int;    0 on success
  313. X *        -1 on file errors
  314. X */
  315. X
  316. Xstatic int lang_c_scan _((FILE *, wlist *, wlist *));
  317. X
  318. Xstatic int
  319. Xlang_c_scan(fp, type1, type2)
  320. X    FILE        *fp;
  321. X    wlist        *type1;
  322. X    wlist        *type2;
  323. X{
  324. X    size_t        pos;
  325. X    size_t        max;
  326. X    char        *line;
  327. X    int        result;
  328. X    int        c;
  329. X    char        *cp;
  330. X
  331. X    trace(("lang_c_scan(fp = %08lX, type1 = %08lX, \
  332. Xtype2 = %08lX)\n{\n"/*}*/, fp, type1, type2));
  333. X    pos = 0;
  334. X    max = 100;
  335. X    line = mem_alloc(max);
  336. X    result = 0;
  337. X    for (;;)
  338. X    {
  339. X        if (pos >= max)
  340. X        {
  341. X            max += 80;
  342. X            mem_change_size(&line, max);
  343. X        }
  344. X        c = getc(fp);
  345. X        switch (c)
  346. X        {
  347. X        case EOF:
  348. X            if (ferror(fp))
  349. X            {
  350. X                result = -1;
  351. X                break;
  352. X            }
  353. X            if (!pos)
  354. X                break;
  355. X            /* fall through... */
  356. X
  357. X        case '\n':
  358. X            line[pos] = 0;
  359. X            pos = 0;
  360. X
  361. X            /*
  362. X             * see if it is a hash line
  363. X             */
  364. X            for (cp = line; isspace(*cp); ++cp)
  365. X                ;
  366. X            if (*cp == '#')
  367. X                directive(cp, type1, type2);
  368. X            continue;
  369. X
  370. X        default:
  371. X            line[pos++] = c;
  372. X            continue;
  373. X        }
  374. X        break;
  375. X    }
  376. X    mem_free(line);
  377. X    trace(("return %d;\n", result));
  378. X    trace((/*{*/"}\n"));
  379. X    return result;
  380. X}
  381. X
  382. X
  383. Xstatic void lang_c_prepare _((void));
  384. X
  385. Xstatic void
  386. Xlang_c_prepare()
  387. X{
  388. X    trace(("lang_c_prepare()\n{\n"/*}*/));
  389. X    sniff_include("/usr/include");
  390. X    trace((/*{*/"}\n"));
  391. X}
  392. X
  393. X
  394. Xsniff_ty lang_c =
  395. X{
  396. X    lang_c_scan,
  397. X    lang_c_prepare,
  398. X};
  399. END_OF_FILE
  400. if test 4272 -ne `wc -c <'c_incl/lang_c.c'`; then
  401.     echo shar: \"'c_incl/lang_c.c'\" unpacked with wrong size!
  402. fi
  403. # end of 'c_incl/lang_c.c'
  404. fi
  405. if test -f 'c_incl/lang_roff.c' -a "${1}" != "-c" ; then 
  406.   echo shar: Will not clobber existing file \"'c_incl/lang_roff.c'\"
  407. else
  408. echo shar: Extracting \"'c_incl/lang_roff.c'\" \(4013 characters\)
  409. sed "s/^X//" >'c_incl/lang_roff.c' <<'END_OF_FILE'
  410. X/*
  411. X *    cook - file construction tool
  412. X *    Copyright (C) 1992, 1993 Peter Miller.
  413. X *    All rights reserved.
  414. X *
  415. X *    This program is free software; you can redistribute it and/or modify
  416. X *    it under the terms of the GNU General Public License as published by
  417. X *    the Free Software Foundation; either version 2 of the License, or
  418. X *    (at your option) any later version.
  419. X *
  420. X *    This program is distributed in the hope that it will be useful,
  421. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  422. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  423. X *    GNU General Public License for more details.
  424. X *
  425. X *    You should have received a copy of the GNU General Public License
  426. X *    along with this program; if not, write to the Free Software
  427. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  428. X *
  429. X * MANIFEST: functions to scan *roff source files
  430. X */
  431. X
  432. X#include <ctype.h>
  433. X#include <string.h>
  434. X
  435. X#include <error.h>
  436. X#include <mem.h>
  437. X#include <sniff.h>
  438. X#include <trace.h>
  439. X#include <word.h>
  440. X
  441. X
  442. X/*
  443. X * NAME
  444. X *    directive
  445. X *
  446. X * SYNOPSIS
  447. X *    void directive(char *line, wlist *type1, wlist *type2);
  448. X *
  449. X * DESCRIPTION
  450. X *    The directive function is used to scan a . line for an
  451. X *    include directive.  If one is found, the filename
  452. X *    is resolved, and the path appended to the appropriate list.
  453. X *
  454. X * ARGUMENTS
  455. X *    line    - the line of text from the program
  456. X *    type1    - list of <filenames>
  457. X *    type2    - list of "filenames"
  458. X *
  459. X * CAVEATS
  460. X *    Just ignore anything we don't understand.
  461. X */
  462. X
  463. Xstatic void directive _((char *s, wlist *type1, wlist *type2));
  464. X
  465. Xstatic void
  466. Xdirective(s, type1, type2)
  467. X    char        *s;
  468. X    wlist        *type1;
  469. X    wlist        *type2;
  470. X{
  471. X    char        *filename;
  472. X    string_ty    *path;
  473. X
  474. X    /*
  475. X     * see if it is a .so directive
  476. X     */
  477. X    trace(("directive(s = \"%s\", type1 = %08lX, type2 = %08lX)\n{\n"/*}*/,
  478. X        s, type1, type2));
  479. X    assert(*s == '.');
  480. X    s++;
  481. X    while (isspace(*s))
  482. X        ++s;
  483. X    if (memcmp(s, "so", 2))
  484. X        goto done;
  485. X    s += 2;
  486. X    while (isspace(*s))
  487. X        ++s;
  488. X    if (!*s)
  489. X        goto done;
  490. X
  491. X    /*
  492. X     * find the end of the filename
  493. X     *    (ignore anything on the end of the line)
  494. X     */
  495. X    filename = s;
  496. X    while (*s && !isspace(*s))
  497. X        ++s;
  498. X
  499. X    /*
  500. X     * extract the path
  501. X     */
  502. X    path = str_n_from_c(filename, s - filename);
  503. X
  504. X    /*
  505. X     * dispatch the path to the appropriate list
  506. X     */
  507. X    wl_append_unique(type1, path);
  508. X    str_free(path);
  509. X
  510. X    /*
  511. X     * here for all exits
  512. X     */
  513. X    done:
  514. X    trace((/*{*/"}\n"));
  515. X}
  516. X
  517. X
  518. X/*
  519. X * NAME
  520. X *    lang_roff_scan
  521. X *
  522. X * SYNOPSIS
  523. X *    int lang_roff_scan(FILE *fp, wlist *type1, wlist *type2);
  524. X *
  525. X * DESCRIPTION
  526. X *    The lang_roff_scan function is used to scan a file looking
  527. X *    for nclude files.  It does not walk the children.
  528. X *    The names of any include files encountered are appended
  529. X *    to the appropriate list.
  530. X *
  531. X * ARGUMENTS
  532. X *    fp    - file stream to scan
  533. X *    type1    - list of <filenames>
  534. X *    type2    - list of "filenames"
  535. X *    
  536. X * RETURNS
  537. X *    int;    0 on success
  538. X *        -1 on file errors
  539. X */
  540. X
  541. Xstatic int lang_roff_scan _((FILE *, wlist *, wlist *));
  542. X
  543. Xstatic int
  544. Xlang_roff_scan(fp, type1, type2)
  545. X    FILE        *fp;
  546. X    wlist        *type1;
  547. X    wlist        *type2;
  548. X{
  549. X    size_t        pos;
  550. X    size_t        max;
  551. X    char        *line;
  552. X    int        result;
  553. X    int        c;
  554. X
  555. X    trace(("lang_roff_scan(fp = %08lX, type1 = %08lX, \
  556. Xtype2 = %08lX)\n{\n"/*}*/, fp, type1, type2));
  557. X    pos = 0;
  558. X    max = 100;
  559. X    line = mem_alloc(max);
  560. X    result = 0;
  561. X    for (;;)
  562. X    {
  563. X        if (pos >= max)
  564. X        {
  565. X            max += 80;
  566. X            mem_change_size(&line, max);
  567. X        }
  568. X        c = getc(fp);
  569. X        switch (c)
  570. X        {
  571. X        case EOF:
  572. X            if (ferror(fp))
  573. X            {
  574. X                result = -1;
  575. X                break;
  576. X            }
  577. X            if (!pos)
  578. X                break;
  579. X            /* fall through... */
  580. X
  581. X        case '\n':
  582. X            line[pos] = 0;
  583. X            pos = 0;
  584. X
  585. X            /*
  586. X             * see if it is a control line
  587. X             */
  588. X            if (line[0] == '.')
  589. X                directive(line, type1, type2);
  590. X            continue;
  591. X
  592. X        default:
  593. X            line[pos++] = c;
  594. X            continue;
  595. X        }
  596. X        break;
  597. X    }
  598. X    mem_free(line);
  599. X    trace(("return %d;\n", result));
  600. X    trace((/*{*/"}\n"));
  601. X    return result;
  602. X}
  603. X
  604. X
  605. Xstatic void lang_roff_prepare _((void));
  606. X
  607. Xstatic void
  608. Xlang_roff_prepare()
  609. X{
  610. X    trace(("lang_roff_prepare()\n{\n"/*}*/));
  611. X    if (sniff_include_count() == 0)
  612. X        sniff_include(".");
  613. X    trace((/*{*/"}\n"));
  614. X}
  615. X
  616. X
  617. Xsniff_ty lang_roff =
  618. X{
  619. X    lang_roff_scan,
  620. X    lang_roff_prepare,
  621. X};
  622. END_OF_FILE
  623. if test 4013 -ne `wc -c <'c_incl/lang_roff.c'`; then
  624.     echo shar: \"'c_incl/lang_roff.c'\" unpacked with wrong size!
  625. fi
  626. # end of 'c_incl/lang_roff.c'
  627. fi
  628. if test -f 'common/help.c' -a "${1}" != "-c" ; then 
  629.   echo shar: Will not clobber existing file \"'common/help.c'\"
  630. else
  631. echo shar: Extracting \"'common/help.c'\" \(3552 characters\)
  632. sed "s/^X//" >'common/help.c' <<'END_OF_FILE'
  633. X/*
  634. X *    cook - a program construction tool
  635. X *    Copyright (C) 1991, 1992, 1993 Peter Miller.
  636. X *    All rights reserved.
  637. X *
  638. X *    This program is free software; you can redistribute it and/or modify
  639. X *    it under the terms of the GNU General Public License as published by
  640. X *    the Free Software Foundation; either version 2 of the License, or
  641. X *    (at your option) any later version.
  642. X *
  643. X *    This program is distributed in the hope that it will be useful,
  644. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  645. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  646. X *    GNU General Public License for more details.
  647. X *
  648. X *    You should have received a copy of the GNU General Public License
  649. X *    along with this program; if not, write to the Free Software
  650. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  651. X *
  652. X * MANIFEST: functions to provide consistent -Help behaviour
  653. X */
  654. X
  655. X#include <ctype.h>
  656. X#include <stdio.h>
  657. X#include <string.h>
  658. X#include <stdlib.h>
  659. X
  660. X#include <arglex.h>
  661. X#include <error.h>
  662. X#include <help.h>
  663. X#include <patchlevel.h>
  664. X
  665. X
  666. Xint isatty _((int));
  667. X
  668. X
  669. Xstatic char *cr[] =
  670. X{
  671. X    "%s version %v",
  672. X    "Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993 Peter Miller.",
  673. X    "All rights reserved.",
  674. X    "",
  675. X    "The %s program comes with ABSOLUTELY NO WARRANTY;",
  676. X    "for details use the '%s -VERSion Warranty' command.",
  677. X    "The %s program is free software, and you are welcome to",
  678. X    "redistribute it under certain conditions;",
  679. X    "for details use the '%s -VERSion Redistribution' command.",
  680. X};
  681. X
  682. Xstatic char *au[] =
  683. X{
  684. X    "Peter Miller   UUCP     uunet!munnari!bmr.gov.au!pmiller",
  685. X    "/\\/\\*          Internet pmiller@bmr.gov.au",
  686. X};
  687. X
  688. X
  689. Xstatic void interpret _((FILE *, char **, int, char *));
  690. X
  691. Xstatic void
  692. Xinterpret(fp, text, text_len, prefix)
  693. X    FILE    *fp;
  694. X    char    **text;
  695. X    int    text_len;
  696. X    char    *prefix;
  697. X{
  698. X    int    j;
  699. X
  700. X    for (j = 0; j < text_len; ++j)
  701. X    {
  702. X        char    indent[10];
  703. X        char    *ip1;
  704. X        char    *ip2;
  705. X        char    *s;
  706. X
  707. X        s = text[j];
  708. X        strcpy(indent, prefix);
  709. X        ip2 = indent + strlen(indent);
  710. X        ip1 = s;
  711. X        while (isspace(*ip1))
  712. X            *ip2++ = *ip1++;
  713. X        *ip2 = 0;
  714. X        if (ip1[0] == '%' && isupper(ip1[1]) && !ip1[2])
  715. X        {
  716. X            switch (ip1[1])
  717. X            {
  718. X            default:
  719. X                assert(0);
  720. X                break;
  721. X
  722. X            case 'C':
  723. X                interpret(fp, cr, SIZEOF(cr), indent);
  724. X                break;
  725. X
  726. X            case 'A':
  727. X                interpret(fp, au, SIZEOF(au), indent);
  728. X                break;
  729. X            }
  730. X            continue;
  731. X        }
  732. X        if (*prefix)
  733. X            fputs(prefix, fp);
  734. X        while (*s)
  735. X        {
  736. X            if (*s != '%')
  737. X                putc(*s, fp);
  738. X            else
  739. X            {
  740. X                switch (*++s)
  741. X                {
  742. X                default:
  743. X                    assert(0);
  744. X                    break;
  745. X
  746. X                case '%':
  747. X                    putc(*s, fp);
  748. X                    break;
  749. X
  750. X                case 's':
  751. X                    fputs(progname, fp);
  752. X                    break;
  753. X
  754. X                case 'v':
  755. X                    fputs(version_stamp(), fp);
  756. X                    break;
  757. X                }
  758. X            }
  759. X            ++s;
  760. X        }
  761. X        fputc('\n', fp);
  762. X    }
  763. X}
  764. X
  765. X
  766. Xvoid
  767. Xhelp(text, text_len, usage)
  768. X    char    **text;
  769. X    int    text_len;
  770. X    void    (*usage)_((void));
  771. X{
  772. X    FILE    *fp;
  773. X    char    *pager;
  774. X
  775. X    /*
  776. X     * collect the rest of thge command line,
  777. X     * if necessary
  778. X     */
  779. X    if (usage && arglex() != arglex_token_eoln)
  780. X    {
  781. X        error
  782. X        (
  783. X            "misplaced \"%s\" command line argument",
  784. X            arglex_value.alv_string
  785. X        );
  786. X        usage();
  787. X    }
  788. X
  789. X    /*
  790. X     * if output is to the terminal,
  791. X     * send the output through a paginator
  792. X     */
  793. X    if (isatty(0))
  794. X    {
  795. X        pager = getenv("PAGER");
  796. X        if (!pager)
  797. X            pager = "more";
  798. X    }
  799. X    else
  800. X        pager = 0;
  801. X
  802. X    /*
  803. X     * open the paginator
  804. X     */
  805. X    if (pager)
  806. X    {
  807. X        fp = popen(pager, "w");
  808. X        if (!fp)
  809. X        {
  810. X            nerror("%s", pager);
  811. X            pager = 0;
  812. X            fp = stdout;
  813. X        }
  814. X    }
  815. X    else
  816. X        fp = stdout;
  817. X
  818. X    /*
  819. X     * do what they asked
  820. X     */
  821. X    interpret(fp, text, text_len, "");
  822. X
  823. X    /*
  824. X     * close the paginator
  825. X     */
  826. X    if (pager)
  827. X        pclose(fp);
  828. X}
  829. X
  830. X
  831. Xchar *
  832. Xversion_stamp()
  833. X{
  834. X    return PATCHLEVEL;
  835. X}
  836. END_OF_FILE
  837. if test 3552 -ne `wc -c <'common/help.c'`; then
  838.     echo shar: \"'common/help.c'\" unpacked with wrong size!
  839. fi
  840. # end of 'common/help.c'
  841. fi
  842. if test -f 'common/mem.c' -a "${1}" != "-c" ; then 
  843.   echo shar: Will not clobber existing file \"'common/mem.c'\"
  844. else
  845. echo shar: Extracting \"'common/mem.c'\" \(3870 characters\)
  846. sed "s/^X//" >'common/mem.c' <<'END_OF_FILE'
  847. X/*
  848. X *    cook - file construction tool
  849. X *    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  850. X *    All rights reserved.
  851. X *
  852. X *    This program is free software; you can redistribute it and/or modify
  853. X *    it under the terms of the GNU General Public License as published by
  854. X *    the Free Software Foundation; either version 2 of the License, or
  855. X *    (at your option) any later version.
  856. X *
  857. X *    This program is distributed in the hope that it will be useful,
  858. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  859. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  860. X *    GNU General Public License for more details.
  861. X *
  862. X *    You should have received a copy of the GNU General Public License
  863. X *    along with this program; if not, write to the Free Software
  864. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  865. X *
  866. X * MANIFEST: functions to manipulate dynamic memory
  867. X */
  868. X
  869. X#include <stddef.h>
  870. X#include <string.h>
  871. X#include <stdlib.h>
  872. X#include <errno.h>
  873. X
  874. X#include <mem.h>
  875. X#include <error.h>
  876. X
  877. X
  878. X/*
  879. X * NAME
  880. X *    memory_error - diagnostic
  881. X *
  882. X * SYNOPSIS
  883. X *    void memory_error(void);
  884. X *
  885. X * DESCRIPTION
  886. X *    The memory_error function is used to report fatal problems with the
  887. X *    memory allocator.
  888. X *
  889. X * RETURNS
  890. X *    The memory_error function does not return.
  891. X */
  892. X
  893. Xstatic void memory_error _((void));
  894. X
  895. Xstatic void
  896. Xmemory_error()
  897. X{
  898. X#ifdef DEBUG
  899. X    nerror("memory allocator");
  900. X    abort();
  901. X#else
  902. X    nfatal("memory allocator");
  903. X#endif
  904. X}
  905. X
  906. X
  907. X/*
  908. X * NAME
  909. X *    mem_alloc - allocate and clear memory
  910. X *
  911. X * SYNOPSIS
  912. X *    char *mem_alloc(size_t n);
  913. X *
  914. X * DESCRIPTION
  915. X *    Mem_alloc uses malloc to allocate the required sized chunk of memory.
  916. X *    If any error is returned from malloc() an fatal diagnostic is issued.
  917. X *    The memory is zeroed befor it is returned.
  918. X *
  919. X * CAVEAT
  920. X *    It is the responsibility of the caller to ensure that the space is
  921. X *    freed when finished with, by a call to free().
  922. X */
  923. X
  924. Xchar *
  925. Xmem_alloc(n)
  926. X    size_t        n;
  927. X{
  928. X    char        *cp;
  929. X
  930. X    if (n < 1)
  931. X        n = 1;
  932. X    errno = 0;
  933. X    cp = (char *)malloc(n);
  934. X    if (!cp)
  935. X    {
  936. X        if (!errno)
  937. X            errno = ENOMEM;
  938. X        memory_error();
  939. X    }
  940. X    return cp;
  941. X}
  942. X
  943. X
  944. X/*
  945. X * NAME
  946. X *    mem_alloc_clear - allocate and clear memory
  947. X *
  948. X * SYNOPSIS
  949. X *    char *mem_alloc_clear(size_t n);
  950. X *
  951. X * DESCRIPTION
  952. X *    Mem_alloc_clear uses malloc to allocate the required sized chunk of memory.
  953. X *    If any error is returned from malloc() an fatal diagnostic is issued.
  954. X *    The memory is zeroed befor it is returned.
  955. X *
  956. X * CAVEAT
  957. X *    It is the responsibility of the caller to ensure that the space is
  958. X *    freed when finished with, by a call to free().
  959. X */
  960. X
  961. Xchar *
  962. Xmem_alloc_clear(n)
  963. X    size_t        n;
  964. X{
  965. X    char        *cp;
  966. X
  967. X    cp = mem_alloc(n);
  968. X    memset(cp, 0, n);
  969. X    return cp;
  970. X}
  971. X
  972. X
  973. Xvoid
  974. Xmem_change_size(cpp, n)
  975. X    char        **cpp;
  976. X    size_t        n;
  977. X{
  978. X    char        *cp;
  979. X
  980. X    cp = *cpp;
  981. X    if (n < 1)
  982. X        n = 1;
  983. X    errno = 0;
  984. X    cp = realloc(cp, n);
  985. X    if (!cp)
  986. X    {
  987. X        if (!errno)
  988. X            errno = ENOMEM;
  989. X        memory_error();
  990. X    }
  991. X    *cpp = cp;
  992. X}
  993. X
  994. X
  995. X/*
  996. X * NAME
  997. X *    enlarge - enlarges dynamic arrays
  998. X *
  999. X * SYNOPSIS
  1000. X *    char *enlarge(size_t *length, char **base, size_t size);
  1001. X *
  1002. X * DESCRIPTION
  1003. X *    Enlarge is used to append more space onto the end of dynamically
  1004. X *    allocated arrays.
  1005. X *    If any error is returned from the memory allocator,
  1006. X *    a fatal diagnostic is issued.
  1007. X *
  1008. X * RETURNS
  1009. X *    A pointer to the element added.
  1010. X *
  1011. X * CAVEAT
  1012. X *    Because it uses realloc, pointers into the array may be invalid after
  1013. X *    a call to enlarge(); only use indexing.
  1014. X *
  1015. X *    The new space is not zeroed.
  1016. X *
  1017. X *    It is the responsibility of the caller to ensure that the array is
  1018. X *    freed when finished with, by a call to free().
  1019. X */
  1020. X
  1021. Xchar *
  1022. Xenlarge(length, base, size)
  1023. X    size_t        *length;
  1024. X    char        **base;
  1025. X    size_t        size;
  1026. X{
  1027. X    char        *result;
  1028. X
  1029. X    assert(!*length == !*base);
  1030. X    if (*length)
  1031. X        *base = (char*)realloc(*base, (*length + 1) * size);
  1032. X    else
  1033. X        *base = (char*)malloc(size);
  1034. X    if (!*base)
  1035. X        memory_error();
  1036. X    result = (*base + (*length)++ * size);
  1037. X    return result;
  1038. X}
  1039. X
  1040. X
  1041. Xvoid
  1042. Xmem_free(cp)
  1043. X    char        *cp;
  1044. X{
  1045. X    free(cp);
  1046. X}
  1047. END_OF_FILE
  1048. if test 3870 -ne `wc -c <'common/mem.c'`; then
  1049.     echo shar: \"'common/mem.c'\" unpacked with wrong size!
  1050. fi
  1051. # end of 'common/mem.c'
  1052. fi
  1053. if test -f 'common/trace.h' -a "${1}" != "-c" ; then 
  1054.   echo shar: Will not clobber existing file \"'common/trace.h'\"
  1055. else
  1056. echo shar: Extracting \"'common/trace.h'\" \(4845 characters\)
  1057. sed "s/^X//" >'common/trace.h' <<'END_OF_FILE'
  1058. X/*
  1059. X *    cook - file construction tool
  1060. X *    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  1061. X *    All rights reserved.
  1062. X *
  1063. X *    This program is free software; you can redistribute it and/or modify
  1064. X *    it under the terms of the GNU General Public License as published by
  1065. X *    the Free Software Foundation; either version 2 of the License, or
  1066. X *    (at your option) any later version.
  1067. X *
  1068. X *    This program is distributed in the hope that it will be useful,
  1069. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1070. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1071. X *    GNU General Public License for more details.
  1072. X *
  1073. X *    You should have received a copy of the GNU General Public License
  1074. X *    along with this program; if not, write to the Free Software
  1075. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1076. X *
  1077. X * MANIFEST: interface definition for common/trace.c
  1078. X */
  1079. X
  1080. X#ifndef TRACE_H
  1081. X#define TRACE_H
  1082. X
  1083. X#include <stddef.h>
  1084. X
  1085. X#include <main.h>
  1086. X
  1087. X#ifdef DEBUG
  1088. X#define trace_pretest_ \
  1089. X    (                            \
  1090. X        (                        \
  1091. X            trace_pretest_result            \
  1092. X        ?                        \
  1093. X            trace_pretest_result            \
  1094. X        :                        \
  1095. X            trace_pretest(__FILE__, &trace_pretest_result) \
  1096. X        )                        \
  1097. X    &                            \
  1098. X        1                        \
  1099. X    )
  1100. X#define trace_where_ trace_where(__FILE__, __LINE__)
  1101. X#define trace(x) (void)(trace_pretest_ && (trace_where_, trace_printf x, 0))
  1102. X#define trace_if() (trace_pretest_ && (trace_where_, 1))
  1103. X#else
  1104. X#define trace(x)
  1105. X#define trace_if() 0
  1106. X#endif
  1107. X
  1108. X/*
  1109. X * This variable is static to each file which
  1110. X * includes the "trace.h" file.
  1111. X * Tracing is file-by-file, but need only test this once.
  1112. X * Files will fail to trace if a trace call is executed in them
  1113. X * prior to a call to trace_enable turning it on.
  1114. X */
  1115. X#ifdef DEBUG
  1116. Xstatic int trace_pretest_result;
  1117. X#endif
  1118. X
  1119. Xint trace_pretest _((char *file, int *result));
  1120. Xvoid trace_where _((char *file, int line));
  1121. Xvoid trace_printf _((char *, ...));
  1122. Xvoid trace_enable _((char *));
  1123. X
  1124. X
  1125. X#if defined(__STDC__) || defined(__stdc__)
  1126. X#define trace_stringize(x) #x
  1127. X#else
  1128. X#define trace_stringize(x) "x"
  1129. X#endif
  1130. X
  1131. Xvoid trace_string_real _((char *, char *));
  1132. Xvoid trace_short_unsigned_real _((char *, unsigned short *));
  1133. Xvoid trace_short_real _((char *, short *));
  1134. Xvoid trace_pointer_real _((char *, void *));
  1135. Xvoid trace_long_unsigned_real _((char *, unsigned long *));
  1136. Xvoid trace_long_real _((char *, long *));
  1137. Xvoid trace_int_unsigned_real _((char *, unsigned *));
  1138. Xvoid trace_int_real _((char *, int *));
  1139. Xvoid trace_char_unsigned_real _((char *, unsigned char *));
  1140. Xvoid trace_char_real _((char *, char *));
  1141. X
  1142. X#ifdef DEBUG
  1143. X
  1144. X#define trace_char(x)                        \
  1145. X    (void)                            \
  1146. X    (                            \
  1147. X        trace_pretest_                    \
  1148. X    &&                            \
  1149. X        (                        \
  1150. X            trace_where_,                \
  1151. X            trace_char_real(trace_stringize(x), &x), \
  1152. X            0                    \
  1153. X        )                        \
  1154. X    )
  1155. X
  1156. X#define trace_char_unsigned(x)                    \
  1157. X    (void)                            \
  1158. X    (                            \
  1159. X        trace_pretest_                    \
  1160. X    &&                            \
  1161. X        (                        \
  1162. X            trace_where_,                \
  1163. X            trace_char_unsigned_real(trace_stringize(x), &x), \
  1164. X            0                    \
  1165. X        )                        \
  1166. X    )
  1167. X
  1168. X#define trace_int(x)                        \
  1169. X    (void)                            \
  1170. X    (                            \
  1171. X        trace_pretest_                    \
  1172. X    &&                            \
  1173. X        (                        \
  1174. X            trace_where_,                \
  1175. X            trace_int_real(trace_stringize(x), &x),    \
  1176. X            0                    \
  1177. X        )                        \
  1178. X    )
  1179. X
  1180. X#define trace_int_unsigned(x)                    \
  1181. X    (void)                            \
  1182. X    (                            \
  1183. X        trace_pretest_                    \
  1184. X    &&                            \
  1185. X        (                        \
  1186. X            trace_where_,                \
  1187. X            trace_int_unsigned_real(trace_stringize(x), &x), \
  1188. X            0                    \
  1189. X        )                        \
  1190. X    )
  1191. X
  1192. X#define trace_long(x)                        \
  1193. X    (void)                            \
  1194. X    (                            \
  1195. X        trace_pretest_                    \
  1196. X    &&                            \
  1197. X        (                        \
  1198. X            trace_where_,                \
  1199. X            trace_long_real(trace_stringize(x), &x), \
  1200. X            0                    \
  1201. X        )                        \
  1202. X    )
  1203. X
  1204. X#define trace_long_unsigned(x)                    \
  1205. X    (void)                            \
  1206. X    (                            \
  1207. X        trace_pretest_                    \
  1208. X    &&                            \
  1209. X        (                        \
  1210. X            trace_where_,                \
  1211. X            trace_long_unsigned_real(trace_stringize(x), &x), \
  1212. X            0                    \
  1213. X        )                        \
  1214. X    )
  1215. X
  1216. X#define trace_pointer(x)                    \
  1217. X    (void)                            \
  1218. X    (                            \
  1219. X        trace_pretest_                    \
  1220. X    &&                            \
  1221. X        (                        \
  1222. X            trace_where_,                \
  1223. X            trace_pointer_real(trace_stringize(x), &x), \
  1224. X            0                    \
  1225. X        )                        \
  1226. X    )
  1227. X
  1228. X#define trace_short(x)                        \
  1229. X    (void)                            \
  1230. X    (                            \
  1231. X        trace_pretest_                    \
  1232. X    &&                            \
  1233. X        (                        \
  1234. X            trace_where_,                \
  1235. X            trace_short_real(trace_stringize(x), &x), \
  1236. X            0                    \
  1237. X        )                        \
  1238. X    )
  1239. X
  1240. X#define trace_short_unsigned(x)                    \
  1241. X    (void)                            \
  1242. X    (                            \
  1243. X        trace_pretest_                    \
  1244. X    &&                            \
  1245. X        (                        \
  1246. X            trace_where_,                \
  1247. X            trace_short_unsigned_real(trace_stringize(x), &x), \
  1248. X            0                    \
  1249. X        )                        \
  1250. X    )
  1251. X
  1252. X#define trace_string(x)                        \
  1253. X    (void)                            \
  1254. X    (                            \
  1255. X        trace_pretest_                    \
  1256. X    &&                            \
  1257. X        (                        \
  1258. X            trace_where_,                \
  1259. X            trace_string_real(trace_stringize(x), x), \
  1260. X            0                    \
  1261. X        )                        \
  1262. X    )
  1263. X
  1264. X#else
  1265. X
  1266. X#define trace_char(x)
  1267. X#define trace_char_unsigned(x)
  1268. X#define trace_int(x)
  1269. X#define trace_int_unsigned(x)
  1270. X#define trace_long(x)
  1271. X#define trace_long_unsigned(x)
  1272. X#define trace_pointer(x)
  1273. X#define trace_short(x)
  1274. X#define trace_short_unsigned(x)
  1275. X#define trace_string(x)
  1276. X
  1277. X#endif
  1278. X
  1279. X#endif /* TRACE_H */
  1280. END_OF_FILE
  1281. if test 4845 -ne `wc -c <'common/trace.h'`; then
  1282.     echo shar: \"'common/trace.h'\" unpacked with wrong size!
  1283. fi
  1284. # end of 'common/trace.h'
  1285. fi
  1286. if test -f 'conf/dcosx' -a "${1}" != "-c" ; then 
  1287.   echo shar: Will not clobber existing file \"'conf/dcosx'\"
  1288. else
  1289. echo shar: Extracting \"'conf/dcosx'\" \(2503 characters\)
  1290. sed "s/^X//" >'conf/dcosx' <<'END_OF_FILE'
  1291. X/*
  1292. X *    cook - file construction tool
  1293. X *    Copyright (C) 1992, 1993 Peter Miller.
  1294. X *    All rights reserved.
  1295. X *
  1296. X *    This program is free software; you can redistribute it and/or modify
  1297. X *    it under the terms of the GNU General Public License as published by
  1298. X *    the Free Software Foundation; either version 2 of the License, or
  1299. X *    (at your option) any later version.
  1300. X *
  1301. X *    This program is distributed in the hope that it will be useful,
  1302. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1303. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1304. X *    GNU General Public License for more details.
  1305. X *
  1306. X *    You should have received a copy of the GNU General Public License
  1307. X *    along with this program; if not, write to the Free Software
  1308. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1309. X *
  1310. X * MANIFEST: configuration for Pyramid SMP DC/OSx 1.0-92b023
  1311. X */
  1312. X
  1313. X#ifndef CONF_H
  1314. X#define CONF_H
  1315. X
  1316. X/*
  1317. X * Define this symbol if your system does NOT
  1318. X * have the ANSI C strerror system call, and
  1319. X * does not define strerror in <string.h>.
  1320. X *
  1321. X#define CONF_NO_strerror
  1322. X */
  1323. X
  1324. X/*
  1325. X * Define this symbol if your system does NOT
  1326. X * have the POSIX tcgetpgrp system call.
  1327. X *
  1328. X#define CONF_NO_tcgetpgrp
  1329. X */
  1330. X
  1331. X/*
  1332. X * Define this symbol if your system does NOT
  1333. X * have the stdarg.h include file mandated by ANSI C.
  1334. X */
  1335. X#define CONF_NO_stdarg
  1336. X
  1337. X/*
  1338. X * Define one of these symbols to indicate which
  1339. X * universe your UNIX is derived from.
  1340. X * If you have a choice, define both.
  1341. X */
  1342. X/* #define BSD */
  1343. X#define SYSV
  1344. X
  1345. X/*
  1346. X * Define this symbol as an appropriate arguemnt to
  1347. X * the getpgrp system call for your system.
  1348. X * Ignore if your system does not have a getpgrp system call.
  1349. X */
  1350. X/* #define CONF_getpgrp_arg 0 */
  1351. X#define CONF_getpgrp_arg
  1352. X
  1353. X/*
  1354. X * On the pyramid the author used to test cook,
  1355. X * the readdir function returned a structure that
  1356. X * had the name starting in the wrong place.
  1357. X * Maybe a version later than 1.0-92b023 has fixed it.
  1358. X */
  1359. X#define CONF_pyramid_broken_readdir
  1360. X
  1361. X/*
  1362. X * On the pyramid the author used to test cook,
  1363. X * the ftime function returned a timezone that
  1364. X * had the seconds included, making it 60 times too large.
  1365. X * Maybe a version later than 1.0-92b023 has fixed it.
  1366. X */
  1367. X#define CONF_pyramid_broken_ftime
  1368. X/*
  1369. X * Define this symbol to be the pathname of your shell.
  1370. X * Leave it as a Bourne shell whenever possible.
  1371. X * Some systems have different versions of the Bourne shell,
  1372. X * with and without functions; choose the one *with* functions if so.
  1373. X */
  1374. X#define CONF_SHELL "/bin/sh"
  1375. X
  1376. X#endif /* CONF_H */
  1377. END_OF_FILE
  1378. if test 2503 -ne `wc -c <'conf/dcosx'`; then
  1379.     echo shar: \"'conf/dcosx'\" unpacked with wrong size!
  1380. fi
  1381. # end of 'conf/dcosx'
  1382. fi
  1383. if test -f 'cook/cook.h' -a "${1}" != "-c" ; then 
  1384.   echo shar: Will not clobber existing file \"'cook/cook.h'\"
  1385. else
  1386. echo shar: Extracting \"'cook/cook.h'\" \(2226 characters\)
  1387. sed "s/^X//" >'cook/cook.h' <<'END_OF_FILE'
  1388. X/*
  1389. X *    cook - file construction tool
  1390. X *    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  1391. X *    All rights reserved.
  1392. X *
  1393. X *    This program is free software; you can redistribute it and/or modify
  1394. X *    it under the terms of the GNU General Public License as published by
  1395. X *    the Free Software Foundation; either version 2 of the License, or
  1396. X *    (at your option) any later version.
  1397. X *
  1398. X *    This program is distributed in the hope that it will be useful,
  1399. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1400. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1401. X *    GNU General Public License for more details.
  1402. X *
  1403. X *    You should have received a copy of the GNU General Public License
  1404. X *    along with this program; if not, write to the Free Software
  1405. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1406. X *
  1407. X * MANIFEST: interface definition for cook/cook.c
  1408. X */
  1409. X
  1410. X#ifndef COOK_H
  1411. X#define COOK_H
  1412. X
  1413. X#include <main.h>
  1414. X#include <expr.h>
  1415. X#include <stmt.h>
  1416. X
  1417. Xextern int desist;
  1418. X
  1419. X
  1420. Xtypedef struct recipe recipe;
  1421. Xstruct    recipe
  1422. X{
  1423. X    wlist        r_target;
  1424. X    elist        r_need;
  1425. X    elist        r_need2;
  1426. X    int        r_flags;
  1427. X    stmt        *r_action;
  1428. X    stmt        *r_use_action;
  1429. X    int        r_tag;        /* for tracing and debugging */
  1430. X    expr        *r_precondition;
  1431. X    int        r_multiple;
  1432. X};
  1433. X
  1434. Xtypedef struct rlist rlist;
  1435. Xstruct    rlist
  1436. X{
  1437. X    size_t        rl_nrecipes;
  1438. X    recipe        *rl_recipe;
  1439. X};
  1440. X
  1441. Xextern    rlist    explicit;
  1442. Xextern    rlist    implicit;
  1443. X
  1444. X/*
  1445. X *  Cook results.
  1446. X *  The better the result, the higher then number.
  1447. X */
  1448. X
  1449. X#define COOK_BACKTRACK  4
  1450. X#define COOK_UPTODATE    3
  1451. X#define COOK_DONE    2
  1452. X#define COOK_ERROR    1
  1453. X#define COOK_DONTKNOW    0
  1454. X#define COOK_FAIL_DK    -1
  1455. X
  1456. X/*
  1457. X *  r_flags values
  1458. X */
  1459. X#define RF_ERROK        (1<<0)
  1460. X#define RF_ERROK_OFF    (1<<1)
  1461. X#define RF_FORCE        (1<<2)
  1462. X#define RF_FORCE_OFF    (1<<3)
  1463. X#define RF_METER        (1<<4)
  1464. X#define RF_METER_OFF    (1<<5)
  1465. X#define RF_PRECIOUS     (1<<6)
  1466. X#define RF_PRECIOUS_OFF (1<<7)
  1467. X#define RF_SILENT       (1<<8)
  1468. X#define RF_SILENT_OFF   (1<<9)
  1469. X#define RF_CLEARSTAT    (1<<10)
  1470. X#define RF_CLEARSTAT_OFF (1<<11)
  1471. X
  1472. Xint cook _((wlist *));
  1473. Xvoid rl_append _((rlist *, recipe *));
  1474. Xvoid cook_flags _((int, int));
  1475. Xint recipe_tag _((void));
  1476. Xint isit_uptodate _((string_ty *));
  1477. Xint cando _((string_ty *));
  1478. Xint cook_mtime_resolve _((wlist *, wlist *));
  1479. X
  1480. X#endif /* COOK_H */
  1481. END_OF_FILE
  1482. if test 2226 -ne `wc -c <'cook/cook.h'`; then
  1483.     echo shar: \"'cook/cook.h'\" unpacked with wrong size!
  1484. fi
  1485. # end of 'cook/cook.h'
  1486. fi
  1487. if test -f 'cook/env.c' -a "${1}" != "-c" ; then 
  1488.   echo shar: Will not clobber existing file \"'cook/env.c'\"
  1489. else
  1490. echo shar: Extracting \"'cook/env.c'\" \(3449 characters\)
  1491. sed "s/^X//" >'cook/env.c' <<'END_OF_FILE'
  1492. X/*
  1493. X *    cook - file construction tool
  1494. X *    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  1495. X *    All rights reserved.
  1496. X *
  1497. X *    This program is free software; you can redistribute it and/or modify
  1498. X *    it under the terms of the GNU General Public License as published by
  1499. X *    the Free Software Foundation; either version 2 of the License, or
  1500. X *    (at your option) any later version.
  1501. X *
  1502. X *    This program is distributed in the hope that it will be useful,
  1503. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1504. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1505. X *    GNU General Public License for more details.
  1506. X *
  1507. X *    You should have received a copy of the GNU General Public License
  1508. X *    along with this program; if not, write to the Free Software
  1509. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1510. X *
  1511. X * MANIFEST: functions to manipulate environment variables
  1512. X */
  1513. X
  1514. X#include <stddef.h>
  1515. X#include <stdlib.h>
  1516. X#include <string.h>
  1517. X
  1518. X#include <main.h>
  1519. X#include <env.h>
  1520. X#include <mem.h>
  1521. X#include <error.h>
  1522. X
  1523. X
  1524. Xextern    char    **environ;
  1525. Xstatic    size_t    nenvirons;
  1526. X
  1527. X
  1528. X/*
  1529. X * NAME
  1530. X *    env_initialize - start up environment
  1531. X *
  1532. X * SYNOPSIS
  1533. X *    void env_initialize(void);
  1534. X *
  1535. X * DESCRIPTION
  1536. X *    The env_initialize function is used to copy all of the environment
  1537. X *    variables into dynamic memory, so that they may be altered by the
  1538. X *    setenv and unsetenv commands.
  1539. X */
  1540. X
  1541. Xvoid
  1542. Xenv_initialize()
  1543. X{
  1544. X    int        j;
  1545. X    char    **old;
  1546. X
  1547. X    nenvirons = 0;
  1548. X    for (j = 0; environ[j]; ++j)
  1549. X        ++nenvirons;
  1550. X    old = environ;
  1551. X    environ = (char **)mem_alloc((nenvirons + 1) * sizeof(char *));
  1552. X    for (j = 0; j < nenvirons; ++j)
  1553. X    {
  1554. X        char    *cp;
  1555. X        char    *was;
  1556. X
  1557. X        was = old[j];
  1558. X        cp = mem_alloc(strlen(was) + 1);
  1559. X        strcpy(cp, was);
  1560. X        environ[j] = cp;
  1561. X    }
  1562. X    environ[nenvirons] = 0;
  1563. X    env_set("SHELL", "/bin/sh");
  1564. X}
  1565. X
  1566. X
  1567. X/*
  1568. X * NAME
  1569. X *    setenv - set environment variable
  1570. X *
  1571. X * SYNOPSIS
  1572. X *    void setenv(char *name, char *value);
  1573. X *
  1574. X * DESCRIPTION
  1575. X *    The setenv function is used to set the given environment variable to
  1576. X *    the given value.
  1577. X *
  1578. X * CAVEAT
  1579. X *    Assumes that the env_initialize function has already been called.
  1580. X */
  1581. X
  1582. Xvoid
  1583. Xenv_set(name, value)
  1584. X    char        *name;
  1585. X    char        *value;
  1586. X{
  1587. X    size_t        name_len;
  1588. X    int        j;
  1589. X    char        *cp;
  1590. X
  1591. X    cp = 0;
  1592. X    name_len = strlen(name);
  1593. X    for (j = 0; j < nenvirons; ++j)
  1594. X    {
  1595. X        cp = environ[j];
  1596. X        assert(cp);
  1597. X        if
  1598. X        (
  1599. X            (cp[name_len] == '=' || !cp[name_len])
  1600. X        &&
  1601. X            !strncmp(cp, name, name_len)
  1602. X        )
  1603. X            break;
  1604. X    }
  1605. X    if (environ[j])
  1606. X    {
  1607. X        environ[j] = 0;
  1608. X        if (cp)
  1609. X            free(cp);
  1610. X    }
  1611. X    else
  1612. X    {
  1613. X        mem_change_size
  1614. X        (
  1615. X            (char **)&environ,
  1616. X            (nenvirons + 2) * sizeof(char *)
  1617. X        );
  1618. X        environ[++nenvirons] = 0;
  1619. X    }
  1620. X    cp = (char *)mem_alloc(name_len + strlen(value) + 2);
  1621. X    strcpy(cp, name);
  1622. X    cp[name_len] = '=';
  1623. X    strcpy(cp + name_len + 1, value);
  1624. X    environ[j] = cp;
  1625. X}
  1626. X
  1627. X
  1628. X/*
  1629. X * NAME
  1630. X *    unsetenv - remove environment variable
  1631. X *
  1632. X * SYNOPSIS
  1633. X *    void unsetenv(char *name);
  1634. X *
  1635. X * DESCRIPTION
  1636. X *    The unsetenv function is used to remove the named variable from the
  1637. X *    environment.
  1638. X *
  1639. X * RETURNS
  1640. X *    void
  1641. X *
  1642. X * CAVEAT
  1643. X *    Assumes that the env_initialize function has been called already.
  1644. X */
  1645. X
  1646. Xvoid
  1647. Xenv_unset(name)
  1648. X    char        *name;
  1649. X{
  1650. X    size_t        name_len;
  1651. X    int        j;
  1652. X    char        *cp;
  1653. X
  1654. X    name_len = strlen(name);
  1655. X    cp = 0;
  1656. X    for (j = 0; j < nenvirons; ++j)
  1657. X    {
  1658. X        cp = environ[j];
  1659. X        assert(cp);
  1660. X        if
  1661. X        (
  1662. X            (cp[name_len] == '=' || !cp[name_len])
  1663. X        &&
  1664. X            !strncmp(cp, name, name_len)
  1665. X        )
  1666. X            break;
  1667. X    }
  1668. X    if (!environ[j])
  1669. X        return;
  1670. X    environ[j] = 0;
  1671. X    if (cp)
  1672. X        free(cp);
  1673. X    --nenvirons;
  1674. X    for ( ; j < nenvirons; ++j)
  1675. X        environ[j] = environ[j + 1];
  1676. X}
  1677. END_OF_FILE
  1678. if test 3449 -ne `wc -c <'cook/env.c'`; then
  1679.     echo shar: \"'cook/env.c'\" unpacked with wrong size!
  1680. fi
  1681. # end of 'cook/env.c'
  1682. fi
  1683. if test -f 'cook/listing.c' -a "${1}" != "-c" ; then 
  1684.   echo shar: Will not clobber existing file \"'cook/listing.c'\"
  1685. else
  1686. echo shar: Extracting \"'cook/listing.c'\" \(5821 characters\)
  1687. sed "s/^X//" >'cook/listing.c' <<'END_OF_FILE'
  1688. X/*
  1689. X *    cook - file construction tool
  1690. X *    Copyright (C) 1991, 1992, 1993 Peter Miller.
  1691. X *    All rights reserved.
  1692. X *
  1693. X *    This program is free software; you can redistribute it and/or modify
  1694. X *    it under the terms of the GNU General Public License as published by
  1695. X *    the Free Software Foundation; either version 2 of the License, or
  1696. X *    (at your option) any later version.
  1697. X *
  1698. X *    This program is distributed in the hope that it will be useful,
  1699. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1700. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1701. X *    GNU General Public License for more details.
  1702. X *
  1703. X *    You should have received a copy of the GNU General Public License
  1704. X *    along with this program; if not, write to the Free Software
  1705. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1706. X *
  1707. X * MANIFEST: functions to open and close the listing file
  1708. X */
  1709. X
  1710. X#include <stddef.h>
  1711. X#include <stdio.h>
  1712. X#include <string.h>
  1713. X#include <time.h>
  1714. X#include <signal.h>
  1715. X#include <unistd.h>
  1716. X
  1717. X#include <conf.h>
  1718. X#include <error.h>
  1719. X#include <listing.h>
  1720. X#include <os.h>
  1721. X#include <option.h>
  1722. X#include <trace.h>
  1723. X
  1724. X
  1725. Xstatic int pid;
  1726. X
  1727. X
  1728. X#ifdef SIGSTOP
  1729. X#ifdef CONF_NO_tcgetpgrp
  1730. X
  1731. X#include <sys/termio.h>
  1732. X
  1733. Xint
  1734. Xtcgetpgrp(fd)
  1735. X    int        fd;
  1736. X{
  1737. X    int        result;
  1738. X
  1739. X    if (ioctl(fd, TIOCGETPGRP, &result))
  1740. X        return -1;
  1741. X    return result;
  1742. X}
  1743. X
  1744. X#endif
  1745. X#endif
  1746. X
  1747. X
  1748. X/*
  1749. X * NAME
  1750. X *    background - test for backgroundness
  1751. X *
  1752. X * SYNOPSIS
  1753. X *    int background(void);
  1754. X *
  1755. X * DESCRIPTION
  1756. X *    The background function is used to determin e if the curent process is
  1757. X *    in the background.
  1758. X *
  1759. X * RETURNS
  1760. X *    int: zero if process is not in the background, nonzero if the process
  1761. X *    is in the background.
  1762. X *
  1763. X * CAVEAT
  1764. X *    This function has a huge chance of being wrong for your system.
  1765. X *    If you need to modify this function, please let the author know.
  1766. X */
  1767. X
  1768. Xstatic int background _((void));
  1769. X
  1770. Xstatic int
  1771. Xbackground()
  1772. X{
  1773. X    void    (*x)_((int));
  1774. X
  1775. X    /*
  1776. X     * csh changes the progess group of jobs.
  1777. X     * you are a background job if the terminal is not
  1778. X     * in your process group.
  1779. X     */
  1780. X#ifdef SIGSTOP
  1781. X    if (getpgrp(CONF_getpgrp_arg) != tcgetpgrp(0))
  1782. X        return 1;
  1783. X#endif
  1784. X
  1785. X    /*
  1786. X     * bourne shell tells you to ignore interrupts
  1787. X     */
  1788. X    x = signal(SIGINT, SIG_IGN);
  1789. X    if (x == SIG_IGN)
  1790. X        return 1;
  1791. X    signal(SIGINT, x);
  1792. X
  1793. X    /*
  1794. X     * must be forground
  1795. X     */
  1796. X    return 0;
  1797. X}
  1798. X
  1799. X
  1800. X/*
  1801. X * NAME
  1802. X *    log_close - terminate logging
  1803. X *
  1804. X * SYNOPSIS
  1805. X *    void log_close(void);
  1806. X *
  1807. X * DESCRIPTION
  1808. X *    Log_close is used to terminate logging this session,
  1809. X *    and to close any como or comi files opened.
  1810. X *
  1811. X * CAVEAT
  1812. X *    Do not call any of the fatal error functions
  1813. X *    from this function.
  1814. X */
  1815. X
  1816. Xstatic void log_close _((void));
  1817. X
  1818. Xstatic void
  1819. Xlog_close()
  1820. X{
  1821. X    if (pid)
  1822. X    {
  1823. X        fclose(stdout);
  1824. X        fclose(stderr);
  1825. X        for (;;)
  1826. X        {
  1827. X            int who;
  1828. X            int status;
  1829. X
  1830. X            who = wait(&status);
  1831. X            if (who < 0 || who == pid)
  1832. X                break;
  1833. X        }
  1834. X        pid = 0;
  1835. X    }
  1836. X}
  1837. X
  1838. X
  1839. X/*
  1840. X * NAME
  1841. X *    log_open - start logging this session
  1842. X *
  1843. X * SYNOPSIS
  1844. X *    void log_open(void);
  1845. X *
  1846. X * DESCRIPTION
  1847. X *    Log_open is used to commence logging a cook session.
  1848. X */
  1849. X
  1850. Xvoid
  1851. Xlog_open()
  1852. X{
  1853. X    string_ty    *entryname;
  1854. X    string_ty    *dirname;
  1855. X    string_ty    *fullpath;
  1856. X    time_t        clock;
  1857. X    struct tm    *tm;
  1858. X
  1859. X    trace(("log_open()\n{\n"/*}*/));
  1860. X
  1861. X    /*
  1862. X     * If we are logging the output to a file
  1863. X     * and we are in the background,
  1864. X     * don't send the output to the terminal.
  1865. X     */
  1866. X    if (option_test(OPTION_LOGGING) && background())
  1867. X        option_set(OPTION_TERMINAL, OPTION_LEVEL_COMMAND_LINE, 0);
  1868. X
  1869. X    /*
  1870. X     * redirect the output depending on the flags
  1871. X     */
  1872. X    if (option_test(OPTION_LOGGING))
  1873. X    {
  1874. X        if (!option.o_logfile)
  1875. X            fatal("no list file specified");
  1876. X        if (option_test(OPTION_TERMINAL))
  1877. X        {
  1878. X            int    fd[2];
  1879. X            char    *cmd[3];
  1880. X
  1881. X            /*
  1882. X             * list both to a file and to the terminal
  1883. X             */
  1884. X            if (pipe(fd))
  1885. X                nfatal("pipe()");
  1886. X            switch (pid = fork())
  1887. X            {
  1888. X            case 0:
  1889. X                    cmd[0] = "tee";
  1890. X                    cmd[1] = option.o_logfile->str_text;
  1891. X                    cmd[2] = 0;
  1892. X                close(fd[1]);
  1893. X                close(0);
  1894. X                if (dup(fd[0]) != 0)
  1895. X                    fatal("dup was wrong");
  1896. X                close(fd[0]);
  1897. X                signal(SIGINT, SIG_IGN);
  1898. X                signal(SIGHUP, SIG_IGN);
  1899. X                signal(SIGTERM, SIG_IGN);
  1900. X                execvp(cmd[0], cmd);
  1901. X                fatal("%s not found", cmd[0]);
  1902. X
  1903. X            case -1:
  1904. X                nfatal("fork()");
  1905. X
  1906. X            default:
  1907. X                close(fd[0]);
  1908. X                close(1);
  1909. X                if (dup(fd[1]) != 1)
  1910. X                    fatal("dup was wrong");
  1911. X                close(fd[1]);
  1912. X                break;
  1913. X            }
  1914. X        }
  1915. X        else
  1916. X        {
  1917. X            /* 
  1918. X             * list only to a file
  1919. X             */
  1920. X            if (!freopen(option.o_logfile->str_text, "w", stdout))
  1921. X                nfatal("%s", option.o_logfile->str_text);
  1922. X        }
  1923. X        /*
  1924. X         * make sterr go to the same place as stdout
  1925. X         *    [will this work if stdout is already closed?]
  1926. X         */
  1927. X        close(2);
  1928. X        switch (dup(1))
  1929. X        {
  1930. X        case 0:
  1931. X            /* oops, stdin is was closed */
  1932. X            if (dup(1) != 2)
  1933. X                nfatal("dup");
  1934. X            close(0);
  1935. X            break;
  1936. X    
  1937. X        case 2:
  1938. X            break;
  1939. X    
  1940. X        default:
  1941. X            nfatal("dup");
  1942. X        }
  1943. X        time(&clock);
  1944. X        tm = localtime(&clock);
  1945. X        fullpath = 0;
  1946. X        entryname = 0;
  1947. X        dirname = 0;
  1948. X        fullpath = os_pathname(option.o_logfile);
  1949. X        if (!fullpath)
  1950. X            goto bomb;
  1951. X        entryname = os_entryname(fullpath);
  1952. X        if (!entryname)
  1953. X            goto bomb;
  1954. X        dirname = os_dirname(fullpath);
  1955. X        if (!dirname)
  1956. X            goto bomb;
  1957. X        fprintf
  1958. X        (
  1959. X            stderr,
  1960. X            "/* %s, %s, %3.3s %3.3s%3d %02d:%02d%5d */\n",
  1961. X            entryname->str_text,
  1962. X            dirname->str_text,
  1963. X            &("SunMonTueWedThuFriSat"[tm->tm_wday*3]),
  1964. X            &("JanFebMarAprMayJunJulAugSepOctNovDec"[tm->tm_mon*3]),
  1965. X            tm->tm_mday,
  1966. X            tm->tm_hour,
  1967. X            tm->tm_min,
  1968. X            1900+tm->tm_year
  1969. X        );
  1970. X    bomb:
  1971. X        if (fullpath)
  1972. X            str_free(fullpath);
  1973. X        if (entryname)
  1974. X            str_free(entryname);
  1975. X        if (dirname)
  1976. X            str_free(dirname);
  1977. X    }
  1978. X    else
  1979. X    {
  1980. X        if (option_test(OPTION_TERMINAL))
  1981. X        {
  1982. X            /*
  1983. X             * list only to the terminal
  1984. X             */
  1985. X        }
  1986. X        else
  1987. X        {
  1988. X            static char dev_null[] = "/dev/null";
  1989. X
  1990. X            /*
  1991. X             * list neither to a file nor to the terminal
  1992. X             */
  1993. X            if
  1994. X            (
  1995. X                !freopen(dev_null, "w", stdout)
  1996. X            ||
  1997. X                !freopen(dev_null, "w", stderr)
  1998. X            )
  1999. X                nfatal("%s", dev_null);
  2000. X        }
  2001. X    }
  2002. X
  2003. X    quit_handler(log_close);
  2004. X    trace((/*{*/"}\n"));
  2005. X}
  2006. END_OF_FILE
  2007. if test 5821 -ne `wc -c <'cook/listing.c'`; then
  2008.     echo shar: \"'cook/listing.c'\" unpacked with wrong size!
  2009. fi
  2010. # end of 'cook/listing.c'
  2011. fi
  2012. if test -f 'cook/option.h' -a "${1}" != "-c" ; then 
  2013.   echo shar: Will not clobber existing file \"'cook/option.h'\"
  2014. else
  2015. echo shar: Extracting \"'cook/option.h'\" \(2577 characters\)
  2016. sed "s/^X//" >'cook/option.h' <<'END_OF_FILE'
  2017. X/*
  2018. X *    cook - file construction tool
  2019. X *    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2020. X *    All rights reserved.
  2021. X *
  2022. X *    This program is free software; you can redistribute it and/or modify
  2023. X *    it under the terms of the GNU General Public License as published by
  2024. X *    the Free Software Foundation; either version 2 of the License, or
  2025. X *    (at your option) any later version.
  2026. X *
  2027. X *    This program is distributed in the hope that it will be useful,
  2028. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2029. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2030. X *    GNU General Public License for more details.
  2031. X *
  2032. X *    You should have received a copy of the GNU General Public License
  2033. X *    along with this program; if not, write to the Free Software
  2034. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2035. X *
  2036. X * MANIFEST: interface definition for cook/option.c
  2037. X */
  2038. X
  2039. X#ifndef OPTION_H
  2040. X#define OPTION_H
  2041. X
  2042. X#include <main.h>
  2043. X
  2044. X#include <str.h>
  2045. X#include <word.h>
  2046. X
  2047. X/*
  2048. X * option levels, highest to lowest
  2049. X * (room for 16 levels in a 32 bit unsigned)
  2050. X */
  2051. Xenum option_level_ty
  2052. X{
  2053. X    OPTION_LEVEL_ERROR,
  2054. X    OPTION_LEVEL_COMMAND_LINE,
  2055. X    OPTION_LEVEL_EXECUTE,
  2056. X    OPTION_LEVEL_RECIPE,
  2057. X    OPTION_LEVEL_COOKBOOK,
  2058. X    OPTION_LEVEL_ENVIRONMENT,
  2059. X    OPTION_LEVEL_DEFAULT
  2060. X};
  2061. Xtypedef enum option_level_ty option_level_ty;
  2062. X
  2063. Xenum option_number_ty
  2064. X{
  2065. X    OPTION_PERSEVERE,    /* keep trying if have errors */
  2066. X    OPTION_SILENT,        /* do not echo any command */
  2067. X    OPTION_ERROK,        /* ignore error returns from commands */
  2068. X    OPTION_ACTION,        /* do not execute the command */
  2069. X    OPTION_TOUCH,        /* do not execute the command, just touch */
  2070. X    OPTION_FORCE,        /* always execute the commands */
  2071. X    OPTION_PRECIOUS,    /* do not delete failed targets */
  2072. X    OPTION_TERMINAL,    /* enable tty output when logging */
  2073. X    OPTION_TRACE,        /* emit tracing information */
  2074. X    OPTION_CMDFILE,        /* generate a command file */
  2075. X    OPTION_METER,        /* meter each command */
  2076. X    OPTION_LOGGING,
  2077. X    OPTION_BOOK,
  2078. X    OPTION_INVALIDATE_STAT_CACHE,
  2079. X    OPTION_max
  2080. X};
  2081. Xtypedef enum option_number_ty option_number_ty;
  2082. X
  2083. Xtypedef struct option_ty option_ty;
  2084. Xstruct option_ty
  2085. X{
  2086. X    unsigned    o_flag[OPTION_max];
  2087. X    wlist         o_target;
  2088. X    string_ty    *o_book;
  2089. X    string_ty    *o_logfile;
  2090. X    wlist         o_search_path;
  2091. X};
  2092. X
  2093. Xextern    option_ty    option;
  2094. Xextern    char        *progname;
  2095. X
  2096. Xint option_already _((option_number_ty, option_level_ty));
  2097. Xint option_test _((option_number_ty));
  2098. Xvoid option_set _((option_number_ty, option_level_ty, int));
  2099. Xvoid option_undo _((option_number_ty, option_level_ty));
  2100. Xvoid option_undo_level _((option_level_ty));
  2101. Xvoid option_set_errors _((void));
  2102. Xvoid option_tidy_up _((void));
  2103. X
  2104. X#endif /* OPTION_H */
  2105. END_OF_FILE
  2106. if test 2577 -ne `wc -c <'cook/option.h'`; then
  2107.     echo shar: \"'cook/option.h'\" unpacked with wrong size!
  2108. fi
  2109. # end of 'cook/option.h'
  2110. fi
  2111. if test -f 'cook/stmt.h' -a "${1}" != "-c" ; then 
  2112.   echo shar: Will not clobber existing file \"'cook/stmt.h'\"
  2113. else
  2114. echo shar: Extracting \"'cook/stmt.h'\" \(2635 characters\)
  2115. sed "s/^X//" >'cook/stmt.h' <<'END_OF_FILE'
  2116. X/*
  2117. X *    cook - file construction tool
  2118. X *    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2119. X *    All rights reserved.
  2120. X *
  2121. X *    This program is free software; you can redistribute it and/or modify
  2122. X *    it under the terms of the GNU General Public License as published by
  2123. X *    the Free Software Foundation; either version 2 of the License, or
  2124. X *    (at your option) any later version.
  2125. X *
  2126. X *    This program is distributed in the hope that it will be useful,
  2127. X *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2128. X *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2129. X *    GNU General Public License for more details.
  2130. X *
  2131. X *    You should have received a copy of the GNU General Public License
  2132. X *    along with this program; if not, write to the Free Software
  2133. X *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2134. X *
  2135. X * MANIFEST: interface definition for cook/stmt.c
  2136. X */
  2137. X
  2138. X#ifndef STMT_H
  2139. X#define STMT_H
  2140. X
  2141. X#include <main.h>
  2142. X#include <str.h>
  2143. X#include <expr.h>
  2144. X
  2145. X/*
  2146. X * s_op values
  2147. X */
  2148. Xenum stmt_op_ty
  2149. X{
  2150. X    OP_ASSIGN = 1,
  2151. X    OP_COMMAND,
  2152. X    OP_COMPOUND,
  2153. X    OP_FAIL,
  2154. X    OP_FAIL_DK,
  2155. X    OP_IF,
  2156. X    OP_LOOP,
  2157. X    OP_LOOPSTOP,
  2158. X    OP_NOP,
  2159. X    OP_RECIPE,
  2160. X    OP_SET,
  2161. X    OP_TOUCH,
  2162. X    OP_UNSETENV
  2163. X};
  2164. Xtypedef enum stmt_op_ty stmt_op_ty;
  2165. X
  2166. Xtypedef struct assign assign;
  2167. Xstruct assign
  2168. X{
  2169. X    elist        a_name;
  2170. X    elist        a_value;
  2171. X};
  2172. X
  2173. Xtypedef struct slist slist;
  2174. Xstruct slist
  2175. X{
  2176. X    size_t        sl_nstmts;
  2177. X    struct stmt    **sl_stmt;
  2178. X};
  2179. X
  2180. Xtypedef struct srecipe srecipe;
  2181. Xstruct srecipe
  2182. X{
  2183. X    elist        sr_target;
  2184. X    elist        sr_need;
  2185. X    elist        sr_need2;
  2186. X    int        sr_flags;
  2187. X    struct stmt    *sr_action;
  2188. X    struct stmt    *sr_use_action;
  2189. X    position    sr_position;
  2190. X    expr        *sr_precondition;
  2191. X    int        sr_multiple;
  2192. X};
  2193. X
  2194. Xtypedef struct command command;
  2195. Xstruct command
  2196. X{
  2197. X    elist        c_args;
  2198. X    int        c_flags;
  2199. X    expr        *c_input;
  2200. X};
  2201. X
  2202. Xtypedef struct sif sif;
  2203. Xstruct sif
  2204. X{
  2205. X    expr        *sif_cond;
  2206. X    struct stmt    *sif_true;
  2207. X    struct stmt    *sif_false;
  2208. X};
  2209. X
  2210. Xtypedef struct stmt stmt;
  2211. Xstruct stmt
  2212. X{
  2213. X    stmt_op_ty    s_op;
  2214. X    long        s_references;
  2215. X    union
  2216. X    {
  2217. X        assign        s__assign;
  2218. X        command        s__cmd;
  2219. X        slist        s__list;
  2220. X        sif        s__if;
  2221. X        stmt        *s__loop;
  2222. X        srecipe        s__recipe;
  2223. X        expr        *s__include;
  2224. X    }
  2225. X        s__u;
  2226. X};
  2227. X#define s_assign    s__u.s__assign
  2228. X#define s_cmd        s__u.s__cmd
  2229. X#define s_if        s__u.s__if
  2230. X#define s_list        s__u.s__list
  2231. X#define s_loop        s__u.s__loop
  2232. X#define s_recipe    s__u.s__recipe
  2233. X#define s_include    s__u.s__include
  2234. X
  2235. X/*
  2236. X * return values for stmt_eval()
  2237. X */
  2238. X#define STMT_OK        0
  2239. X#define STMT_LSTOP    -1
  2240. X#define STMT_RET    -2
  2241. X#define STMT_ERROR    -3
  2242. X#define STMT_BACKTRACK -4
  2243. X
  2244. Xstmt *stmt_alloc _((void));
  2245. Xstmt *stmt_copy _((stmt *));
  2246. Xvoid stmt_free _((stmt *));
  2247. Xint stmt_eval _((stmt *));
  2248. Xvoid sl_append _((slist *, stmt *));
  2249. Xvoid sl_free _((slist *));
  2250. Xvoid sl_zero _((slist *));
  2251. X
  2252. X#endif /* STMT_H */
  2253. END_OF_FILE
  2254. if test 2635 -ne `wc -c <'cook/stmt.h'`; then
  2255.     echo shar: \"'cook/stmt.h'\" unpacked with wrong size!
  2256. fi
  2257. # end of 'cook/stmt.h'
  2258. fi
  2259. if test -f 'doc/glossary' -a "${1}" != "-c" ; then 
  2260.   echo shar: Will not clobber existing file \"'doc/glossary'\"
  2261. else
  2262. echo shar: Extracting \"'doc/glossary'\" \(4615 characters\)
  2263. sed "s/^X//" >'doc/glossary' <<'END_OF_FILE'
  2264. X.\"
  2265. X.\"    cook - file construction tool
  2266. X.\"    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2267. X.\"    All rights reserved.
  2268. X.\"
  2269. X.\"    This program is free software; you can redistribute it and/or modify
  2270. X.\"    it under the terms of the GNU General Public License as published by
  2271. X.\"    the Free Software Foundation; either version 2 of the License, or
  2272. X.\"    (at your option) any later version.
  2273. X.\"
  2274. X.\"    This program is distributed in the hope that it will be useful,
  2275. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2276. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2277. X.\"    GNU General Public License for more details.
  2278. X.\"
  2279. X.\"    You should have received a copy of the GNU General Public License
  2280. X.\"    along with this program; if not, write to the Free Software
  2281. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2282. X.\"
  2283. X.\" MANIFEST: Reference Manual, Glosary
  2284. X.\"    
  2285. X.H 1 "Glossary"
  2286. XThis document employs a number of terms specific to
  2287. X.BR cook .
  2288. X.VL 1i
  2289. X.\"===============================================================
  2290. X.LI \fIbody\fR
  2291. XA set of statements, usually commands, to be performed
  2292. Xto
  2293. X.I cook
  2294. Xthe
  2295. X.IR target s
  2296. Xof a 
  2297. X.I recipe
  2298. Xafter the
  2299. X.IR ingredient s
  2300. Xexist.
  2301. X.\"===============================================================
  2302. X.LI \fIcommand\fR
  2303. XA command is a list of words to be passed to the
  2304. X.I "operating system"
  2305. Xto be executed.
  2306. X.\"===============================================================
  2307. X.LI \fIcook\fR
  2308. XWhen used as a verb,
  2309. Xrefers to the actions
  2310. X.B cook
  2311. Xwould
  2312. Xperform to create a
  2313. X.IR target ,
  2314. Xaccording to some
  2315. X.IR recipe .
  2316. X.\"===============================================================
  2317. X.LI \fIcookbook\fR
  2318. XA file containing input for
  2319. X.BR cook ,
  2320. Xusually 
  2321. X.IR recipe s.
  2322. X.\"===============================================================
  2323. X.LI "\fIexplicit recipe\fR"
  2324. XAn explicit recipe is one where the
  2325. X.IR target s
  2326. Xcontain no patterns.
  2327. XThat is, there are no percent ('\fB%\fP') characters in any of the
  2328. X.IR target s.
  2329. X.\"===============================================================
  2330. X.LI \fIflag\fR
  2331. XA flag modifies the behaviour of a cook session,
  2332. X.I recipe
  2333. Xor command.
  2334. X.\"===============================================================
  2335. X.LI "\fIforced ingredient\fR"
  2336. XA files which must exist before a
  2337. X.I target
  2338. Xfile 
  2339. Xof an 
  2340. X.I "implicit recipe"
  2341. Xmay be cooked.
  2342. XThe inability to construct a forced ingredient
  2343. Xis an error.
  2344. X.\"===============================================================
  2345. X.LI \fIfunction\fP
  2346. XA function is an action applied to a word list.
  2347. X.\"===============================================================
  2348. X.LI \fIgate\fR
  2349. XA gate is a condition which allows the conditional application of
  2350. Xa
  2351. X.IR recipe .
  2352. X.\"===============================================================
  2353. X.LI "\fIimplicit recipe\fR"
  2354. XAn implicit recipe is a recipe with patterns in the
  2355. X.IR target s.
  2356. XThat is, there is a percent ('\fB%\fP') character in at least one of the
  2357. X.IR target s.
  2358. X.\"===============================================================
  2359. X.LI \fIingredient\fR
  2360. XA files which must exist before a
  2361. X.I target
  2362. Xfile may be cooked.
  2363. XIn an 
  2364. X.I "implicit recipe"
  2365. Xthe inability to construct of an ingredient
  2366. Xmeans that the
  2367. X.I recipe
  2368. Xwill not be applied.
  2369. XIn an explicit recipe
  2370. Xthe inability to construct an ingredient is an error.
  2371. X.\"===============================================================
  2372. X.LI "\fIlast-modified time\fR"
  2373. X.br
  2374. X\s-4UNIX\s0 imbues files with several attributes.
  2375. XOne of these is a time-stamp of when the file was last modified.
  2376. XUsually this is when the file was last written to.
  2377. X.\"===============================================================
  2378. X.LI \fIrecipe\fR
  2379. XA
  2380. X.I recipe
  2381. Xconsists of several parts.
  2382. X.AL
  2383. X.LI
  2384. XA set of
  2385. X.IR target s
  2386. Xto be cooked,
  2387. X.LI
  2388. XA set of ingredients of those
  2389. X.IR target s,
  2390. Xand
  2391. X.LI
  2392. XAn optional set of forced ingredients.
  2393. X.LI
  2394. XAn optional set of flags.
  2395. X.LI
  2396. XAn optional gate.
  2397. X.LI
  2398. XAn optional body .
  2399. X.LE
  2400. X.\"===============================================================
  2401. X.LI \fItarget\fR
  2402. XThe object of a
  2403. X.IR recipe ,
  2404. Xa thing which is cooked.
  2405. X.\"===============================================================
  2406. X.LI \fItouch\fR
  2407. XUNIX imbues files with several attributes.
  2408. XOne of these is a time-stamp of when the file was last modified.
  2409. XUsually this is when the file was last written to,
  2410. Xhowever it is possible to simply adjust this attribute,
  2411. Xrather than actually writing to the file;
  2412. Xthis is colloquially known as
  2413. X.IR touch ing
  2414. Xa file.
  2415. X.\"===============================================================
  2416. X.LI \fIvariable\fR
  2417. XA variable is a named place holder for a value.
  2418. XThe value may be changed.
  2419. X.\"===============================================================
  2420. X.LE
  2421. END_OF_FILE
  2422. if test 4615 -ne `wc -c <'doc/glossary'`; then
  2423.     echo shar: \"'doc/glossary'\" unpacked with wrong size!
  2424. fi
  2425. # end of 'doc/glossary'
  2426. fi
  2427. if test -f 'doc/intro.aa' -a "${1}" != "-c" ; then 
  2428.   echo shar: Will not clobber existing file \"'doc/intro.aa'\"
  2429. else
  2430. echo shar: Extracting \"'doc/intro.aa'\" \(4207 characters\)
  2431. sed "s/^X//" >'doc/intro.aa' <<'END_OF_FILE'
  2432. X.\"
  2433. X.\"    cook - file construction tool
  2434. X.\"    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2435. X.\"    All rights reserved.
  2436. X.\"
  2437. X.\"    This program is free software; you can redistribute it and/or modify
  2438. X.\"    it under the terms of the GNU General Public License as published by
  2439. X.\"    the Free Software Foundation; either version 2 of the License, or
  2440. X.\"    (at your option) any later version.
  2441. X.\"
  2442. X.\"    This program is distributed in the hope that it will be useful,
  2443. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2444. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2445. X.\"    GNU General Public License for more details.
  2446. X.\"
  2447. X.\"    You should have received a copy of the GNU General Public License
  2448. X.\"    along with this program; if not, write to the Free Software
  2449. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2450. X.\"
  2451. X.\" MANIFEST: Reference Manual, Cook from the Outside
  2452. X.\"    
  2453. X.H 1 "Cook from the Outside"
  2454. XThis chapter is part of the tutorial on how to use the
  2455. X.B cook
  2456. Xprogram.
  2457. XIt focuses on how to use
  2458. X.BR cook ,
  2459. Xwithout needing to know how 
  2460. X.B cook
  2461. Xworks internally.
  2462. X.H 2 "What can cook do for me?"
  2463. XBy far the most common use of cook,
  2464. Xby experts and beginners alike,
  2465. Xis to issue the command
  2466. X.eB
  2467. Xcook
  2468. X.eE
  2469. Xand cook will consult its cookbook to see what needs to be done.
  2470. X.P
  2471. XIn general, 
  2472. X.B cook
  2473. Xis used to take a set of files and chew on them in some way to produce
  2474. Xanother set of files;
  2475. Xsuch as the source files for a program,
  2476. Xand how to turn them into the executable program file.
  2477. XIn order for 
  2478. X.B cook
  2479. Xto do anything useful, 
  2480. Xit nees to know what to do.
  2481. X"What to do" is contained in a file called
  2482. X.IR Howto.cook
  2483. Xin the same directory as the files it is going to work on.
  2484. XYou need to execute the  \f(CWcook\fP command in 
  2485. Xthe same directory as all of the files.
  2486. X.H 2 "What is cook doing?"
  2487. XThe
  2488. X.I Howto.cook
  2489. Xfile was written by the same person who wrote the source files.
  2490. XIt contains a set of recipes;
  2491. Xeach of which, among other things,
  2492. Xcontain commands for how to manipulate the files.
  2493. XThe
  2494. X.B cook
  2495. Xprogram echos each of the commands it is about to execute,
  2496. Xso that you can watch what it is doing as it goes.
  2497. X.P
  2498. XIf the
  2499. X.I Howto.cook
  2500. Xfile contained only commands,
  2501. Xyou would be better off using a shell script.
  2502. XIn addition to the commands is information telling 
  2503. X.B cook
  2504. Xwhich files need to be constructed before other files can be,
  2505. Xand from this information
  2506. X.B cook
  2507. Xdetermines the order in which to execute the commands.
  2508. XAlso,
  2509. X.B cook
  2510. Xexamines other information to determine which commands it need not do,
  2511. Xbecause the associated files are already up-to-date.
  2512. X.H 2 "What can cook always do?"
  2513. XIf you are in a directory with a
  2514. X.I Howto.cook
  2515. Xfile,
  2516. Xyou can expect a few common requests to work
  2517. X.VL 1.5i
  2518. X.LI "cook clobber"
  2519. XThis command can be expected to remove any files from the directory which
  2520. X.B cook
  2521. Xis able to reconstruct.
  2522. X.LI "cook all"
  2523. XThis is the default action,
  2524. Xand so can be obtained by a simple \f(CWcook\fP request.
  2525. XIt causes
  2526. X.B cook
  2527. Xto construct some specific file or set of files.
  2528. X.LI "cook clean"
  2529. XThis is similar to "cook clobber" above, 
  2530. Xbut it only removes intermediate files,
  2531. Xand not not the final file or files which "cook all" constructs.
  2532. X.LE
  2533. X.P
  2534. XIn addition to the above,
  2535. Xmany 
  2536. X.I Howto.cook 
  2537. Xfiles will also define
  2538. X.VL 1.5i
  2539. X.LI "cook install"
  2540. XIf a program or library or document is constructed in the directory,
  2541. Xthe this command will install it into the correct place in the
  2542. Xsystem.
  2543. X.LI "cook uninstall"
  2544. XThe reverse of the above,
  2545. Xit removes something from the system.
  2546. X.LE
  2547. X.H 2 "If something goes wrong"
  2548. XMost errors while 
  2549. X.B cook
  2550. Xis constructing file are caused by errors in the source files,
  2551. Xand not the 
  2552. X.I Howto.cook
  2553. Xfile.
  2554. XIn general,
  2555. Xyou can fix the problems in the source files,
  2556. Xand execute the
  2557. X.B cook
  2558. Xcommand again,
  2559. Xand 
  2560. X.B cook
  2561. Xwill resume from the command which incurred the error.
  2562. X.P
  2563. XTo help you while editing the files with the errors,
  2564. X.B cook
  2565. Xkeeps a listing file of all the commands it executed,
  2566. Xand any output of those commands,
  2567. Xin a file called
  2568. X.I Howto.list
  2569. Xin the current directory.
  2570. X.P
  2571. XYou may want 
  2572. X.B cook
  2573. Xto find all the errors it can before you do any editing,
  2574. Xdo do this,
  2575. Xuse the
  2576. X.B -Continue
  2577. Xoption (it may be abbreviated to 
  2578. X.B -c
  2579. Xfor convenience).
  2580. END_OF_FILE
  2581. if test 4207 -ne `wc -c <'doc/intro.aa'`; then
  2582.     echo shar: \"'doc/intro.aa'\" unpacked with wrong size!
  2583. fi
  2584. # end of 'doc/intro.aa'
  2585. fi
  2586. if test -f 'doc/match' -a "${1}" != "-c" ; then 
  2587.   echo shar: Will not clobber existing file \"'doc/match'\"
  2588. else
  2589. echo shar: Extracting \"'doc/match'\" \(2574 characters\)
  2590. sed "s/^X//" >'doc/match' <<'END_OF_FILE'
  2591. X.\"
  2592. X.\"    cook - file construction tool
  2593. X.\"    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2594. X.\"    All rights reserved.
  2595. X.\"
  2596. X.\"    This program is free software; you can redistribute it and/or modify
  2597. X.\"    it under the terms of the GNU General Public License as published by
  2598. X.\"    the Free Software Foundation; either version 2 of the License, or
  2599. X.\"    (at your option) any later version.
  2600. X.\"
  2601. X.\"    This program is distributed in the hope that it will be useful,
  2602. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2603. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2604. X.\"    GNU General Public License for more details.
  2605. X.\"
  2606. X.\"    You should have received a copy of the GNU General Public License
  2607. X.\"    along with this program; if not, write to the Free Software
  2608. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2609. X.\"
  2610. X.\" MANIFEST: Reference Manual, File name patterns
  2611. X.\"    
  2612. X.H 1 "File name patterns"
  2613. XThe tough part about designing a pattern matcher for something like cook is
  2614. Xthat the patterns must be reversible.
  2615. XThat is,
  2616. Xit must be possible to use
  2617. Xthe same string both as a pattern to be matched against and as a template
  2618. Xfor building a string once a pattern has matched.
  2619. XRather like the
  2620. Xdifference between the left and right sides of an editor search-and-replace
  2621. Xcommand in an editor using the same description for both the search pattern
  2622. Xand the replace template.
  2623. XThis is why classic regular expressions have not been used.
  2624. XThey tend to be slow to match, too.
  2625. X.P
  2626. XThis matcher has eleven match "fields",
  2627. Xreferenced as
  2628. X.B %
  2629. Xand
  2630. X.B %0
  2631. Xto
  2632. X.BR %9 .
  2633. XThe
  2634. X.B %
  2635. Xcharacter can be escaped as
  2636. X.B %% .
  2637. XThe
  2638. X.B %
  2639. Xand
  2640. X.B %1
  2641. Xto
  2642. X.B %9
  2643. Xforms match any character except
  2644. X.BR / .
  2645. XThe
  2646. X.B %0
  2647. Xform matches all characters,
  2648. Xbut must be either empty,
  2649. Xor have whole path components,
  2650. Xincluding the trailing
  2651. X.B /
  2652. Xon each component.
  2653. X.P
  2654. XA few examples will make this clearer:
  2655. X.TS
  2656. Xbox, center, tab(;);
  2657. Xl l.
  2658. Xstring;does not match
  2659. X_
  2660. X%.c;snot/fred.c
  2661. X%1/%2.c;etc/boo/fred.c
  2662. X.TE
  2663. X.TS
  2664. Xbox, center, tab(;);
  2665. Xl l lw(1.5i).
  2666. Xstring;matches;setting
  2667. X_
  2668. X%.c;fred.c;%="fred"
  2669. X%1/%2.c;snot/fred.c;T{
  2670. X%1="snot"
  2671. X.br
  2672. X%2="fred"
  2673. XT}
  2674. X%0%5.c;fred.c;T{
  2675. X%0="" 
  2676. X.br
  2677. X%5="fred"
  2678. XT}
  2679. X%0%6.c;snot/fred.c;T{
  2680. X%0="snot/" 
  2681. X.br
  2682. X%6="fred"
  2683. XT}
  2684. X%0%7.c;etc/boo/fred.c;T{
  2685. X%0="etc/boo/" 
  2686. X.br
  2687. X%7="fred"
  2688. XT}
  2689. X/usr/%1/%1%2/%3.%2%4;/usr/man/man1/fred.1x;T{
  2690. X%1="man"
  2691. X.br
  2692. X%2="1"
  2693. X.br
  2694. X%3="fred" 
  2695. X.br
  2696. X%4="x"
  2697. XT}
  2698. X.TE
  2699. X.P
  2700. XThe
  2701. X.B %0
  2702. Xbehaviour is designed to allow patterns to range over subtrees in a
  2703. Xcontrolled manner.
  2704. XNote that the use of this sort of pattern in a recipe
  2705. Xwill result in deeper searches than the naive recipe designer would expect.
  2706. END_OF_FILE
  2707. if test 2574 -ne `wc -c <'doc/match'`; then
  2708.     echo shar: \"'doc/match'\" unpacked with wrong size!
  2709. fi
  2710. # end of 'doc/match'
  2711. fi
  2712. if test -f 'doc/option' -a "${1}" != "-c" ; then 
  2713.   echo shar: Will not clobber existing file \"'doc/option'\"
  2714. else
  2715. echo shar: Extracting \"'doc/option'\" \(2455 characters\)
  2716. sed "s/^X//" >'doc/option' <<'END_OF_FILE'
  2717. X.\"
  2718. X.\"    cook - file construction tool
  2719. X.\"    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  2720. X.\"    All rights reserved.
  2721. X.\"
  2722. X.\"    This program is free software; you can redistribute it and/or modify
  2723. X.\"    it under the terms of the GNU General Public License as published by
  2724. X.\"    the Free Software Foundation; either version 2 of the License, or
  2725. X.\"    (at your option) any later version.
  2726. X.\"
  2727. X.\"    This program is distributed in the hope that it will be useful,
  2728. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  2729. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2730. X.\"    GNU General Public License for more details.
  2731. X.\"
  2732. X.\"    You should have received a copy of the GNU General Public License
  2733. X.\"    along with this program; if not, write to the Free Software
  2734. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2735. X.\"
  2736. X.\" MANIFEST: Reference Manual, Option Precedence
  2737. X.\"    
  2738. X.H 1 "Option Precedence"
  2739. XAt various points in the description there are a number of flags and options
  2740. Xwith the same,
  2741. Xor similar,
  2742. Xnames.
  2743. XThese are in fact different levels of the same option.
  2744. X.P
  2745. XThe different levels,
  2746. Xfrom highest precedence to lowest,
  2747. Xare as follows.
  2748. X.VL 1i
  2749. X.LI "Error"
  2750. XThis level is used to disable undesirable side effects when an error occurs.
  2751. X.LI "Command Line"
  2752. XOptions specified on the command line override almost everything.
  2753. XThere are some isolated cases where there is no equivalent command line option.
  2754. XThey are in scope for the entire 
  2755. X.B cook
  2756. Xsession.
  2757. X.LI "Execute"
  2758. XWhen a command attached to a recipe is executed,
  2759. Xthe flags in the '\fBset\fP' clause are given this precedence.
  2760. XThey are in scope for the duration of the execution of the command they are
  2761. Xbound to.
  2762. X.LI "Recipe"
  2763. XWhen a recipe is considered for use,
  2764. Xthe flags in the '\fBset\fP' clause are given the precedence.
  2765. XThey are in scope for the evaluation of the ingredients names and the execution of the recipe body;
  2766. Xthey are not in scope while cooking the ingredients.
  2767. X.LI "Cookbook"
  2768. XWhen a '\fBset\fP' statement is encountered in the cookbook,
  2769. Xthe option are given this priority.
  2770. XThey are in scope until the end of the 
  2771. X.B cook
  2772. Xsession.
  2773. X.LI "Environment Variable"
  2774. X.br
  2775. XWhen the  options in the
  2776. X.B COOK
  2777. Xenvironment variable are set,
  2778. Xthey are given this precedence.
  2779. XThey are in scope for the entire
  2780. X.B cook
  2781. Xsession.
  2782. X.LI "Default"
  2783. XAll options have a default setting.
  2784. XThe defaults noted in chapter 3
  2785. Xare given this precedence.
  2786. XThey are in scope for the entire
  2787. X.B cook
  2788. Xsession.
  2789. X.LE
  2790. END_OF_FILE
  2791. if test 2455 -ne `wc -c <'doc/option'`; then
  2792.     echo shar: \"'doc/option'\" unpacked with wrong size!
  2793. fi
  2794. # end of 'doc/option'
  2795. fi
  2796. if test -f 'lib/c' -a "${1}" != "-c" ; then 
  2797.   echo shar: Will not clobber existing file \"'lib/c'\"
  2798. else
  2799. echo shar: Extracting \"'lib/c'\" \(3162 characters\)
  2800. sed "s/^X//" >'lib/c' <<'END_OF_FILE'
  2801. X/*
  2802. X * NAME
  2803. X *    c - the C compiler cookbook
  2804. X *
  2805. X * DESCRIPTION
  2806. X *    This cookbook describes how to work with C files.
  2807. X *    Include file dependencies are automatically determined.
  2808. X *
  2809. X * RECIPES
  2810. X *    %.o: %.c    make object files form C source files
  2811. X *    %.ln: %.c    make lint object files from C source files
  2812. X *    
  2813. X * VARIABLES
  2814. X *    c_incl        The C indude dependency sniffer command.
  2815. X *            Not altered if already defined.
  2816. X *    cc        The C compiler command
  2817. X *            Not altered if already defined.
  2818. X *    lint        The lint command.
  2819. X *            Not altered if already defined.
  2820. X *    cc_flags    options to pass to the C compiler command
  2821. X *            Not altered if already defined.
  2822. X *            The default is "-O".
  2823. X *    cc_include_flags Options passed to the C compiler and c_incl
  2824. X *            controlling include file searching.
  2825. X *            Not altered if already defined.
  2826. X *            The default is empty.
  2827. X *    cc_link_flags    Options passed to the C compiler when linking,
  2828. X *            these are typically library search paths and libraries.
  2829. X *            Not altered if already defined.
  2830. X *            The default is empty.
  2831. X *    cc_src        C source files in the current directory.
  2832. X *    dot_src        Source files constructable in the current directory
  2833. X *            (unioned with existing setting, if necessary).
  2834. X *    dot_obj        Object files constructable in the current directory
  2835. X *            (unioned with existing setting, if necessary).
  2836. X *    dot_clean    Files which may be removed from the current directory
  2837. X *            in a clean target.            
  2838. X *    dot_lint_obj    Lint object files constructable in the current directory
  2839. X *            (unioned with existing setting, if necessary).
  2840. X *
  2841. X * MANIFEST: cookbook for using C
  2842. X */
  2843. X
  2844. X#pragma once 
  2845. X
  2846. Xif [not [defined c_incl]] then
  2847. X    c_incl = [find_command c_incl];
  2848. Xif [not [defined cc]] then
  2849. X    cc = cc;
  2850. Xif [not [defined cc_flags]] then
  2851. X    cc_flags = -O;
  2852. Xif [not [defined cc_include_flags]] then
  2853. X    cc_include_flags = ;
  2854. Xif [not [defined cc_link_flags]] then
  2855. X    cc_link_flags = ;
  2856. Xif [not [defined lint]] then
  2857. X    lint = lint;
  2858. Xcc_src = [glob *.c];
  2859. Xif [not [defined dot_src]] then
  2860. X    dot_src = ;
  2861. Xdot_src = [stringset [dot_src] [cc_src] - [fromto %.c %.s [cc_src]]];
  2862. Xif [not [defined dot_obj]] then
  2863. X    dot_obj = ;
  2864. Xdot_obj = [stringset [dot_obj] [fromto %.c %.o [cc_src]]];
  2865. Xif [not [defined dot_clean]] then
  2866. X    dot_clean = ;
  2867. Xdot_clean =
  2868. X    [stringset
  2869. X    [dot_clean]
  2870. X    [fromto %.c %.o [cc_src]]
  2871. X    [fromto %.c %.ln [cc_src]]
  2872. X    [fromto %.c %.s [cc_src]]
  2873. X    ];
  2874. Xif [not [defined dot_lint_obj]] then
  2875. X    dot_lint_obj = ;
  2876. Xdot_lint_obj = [stringset [dot_lint_obj] [fromto %.c %.ln [cc_src]]];
  2877. X
  2878. Xif [c_incl] then
  2879. X{
  2880. X    /*
  2881. X     * if the c_incl command is available, then check dependencies
  2882. X     */
  2883. X    %.o: %.c: [collect [c_incl] [cc_include_flags] %.c]
  2884. X        {
  2885. X            [cc] [cc_include_flags] [cc_flags] -c %.c;
  2886. X        }
  2887. X    %.ln: %.c: [collect [c_incl] [cc_include_flags] %.c]
  2888. X        {
  2889. X            [lint] [cc_include_flags] [cc_flags] -c %.c;
  2890. X        }
  2891. X}
  2892. Xelse
  2893. X{
  2894. X    /*
  2895. X     * if the c_incl command is not available
  2896. X     * (hopefully only when c_incl itself is being built)
  2897. X     * the don't check dependencies
  2898. X     */
  2899. X    %.o: %.c
  2900. X        {
  2901. X            [cc] [cc_include_flags] [cc_flags] -c %.c;
  2902. X        }
  2903. X    %.ln: %.c
  2904. X        {
  2905. X            [lint] [cc_include_flags] [cc_flags] -c %.c;
  2906. X        }
  2907. X}
  2908. END_OF_FILE
  2909. if test 3162 -ne `wc -c <'lib/c'`; then
  2910.     echo shar: \"'lib/c'\" unpacked with wrong size!
  2911. fi
  2912. # end of 'lib/c'
  2913. fi
  2914. if test -f 'lib/library' -a "${1}" != "-c" ; then 
  2915.   echo shar: Will not clobber existing file \"'lib/library'\"
  2916. else
  2917. echo shar: Extracting \"'lib/library'\" \(2534 characters\)
  2918. sed "s/^X//" >'lib/library' <<'END_OF_FILE'
  2919. X/*
  2920. X * NAME
  2921. X *    library - construct a library
  2922. X *
  2923. X * DESCRIPTION
  2924. X *    This cookbook defines how to construct a library.
  2925. X *
  2926. X *    If an include file (or files) are defined for this file,
  2927. X *    you will have to append them to [install] in your Howto.cook file.
  2928. X *
  2929. X * VARIABLES
  2930. X *    all        targets of the all recipe
  2931. X *    install        targets of the install recipe
  2932. X *    me        the name of the library to be constructed.
  2933. X *            Defaults to the last component of the pathname
  2934. X *            of the current directory.
  2935. X *    ar        The archive command.
  2936. X *    install        targets of the install command.
  2937. X *
  2938. X * RECIPES
  2939. X *    all:        construct the targets defined in [all].
  2940. X *    clean:        remove the files named in [dot_clean].
  2941. X *    clobber:    remove the files name in [dot_clean] and [all].
  2942. X *
  2943. X * If the [lib] variable is defined
  2944. X *    install:    construct the files named in [install].
  2945. X *    uninstall:    remove the files named in [install].
  2946. X *
  2947. X * MANIFEST: cookbook for constructing libraries
  2948. X */
  2949. X
  2950. X#pragma once
  2951. X
  2952. Xif [not [defined dot_obj]] then
  2953. X{
  2954. X    echo "The [dot_obj] variable is not set." set silent;
  2955. X    echo "You probably want to use the "c" cookbook" set silent;
  2956. X    echo "before you use the "library" cookbook." set silent;
  2957. X    fail;
  2958. X}
  2959. X
  2960. Xif [not [defined ar]] then
  2961. X    ar = [find_command ar];
  2962. Xif [not [defined ranlib]] then
  2963. X    ranlib = [find_command ranlib];
  2964. Xif [not [defined me]] then
  2965. X    me = [entryname [dir [pathname x]]];
  2966. X
  2967. Xall = lib[me].a;
  2968. Xif [defined dot_lint_obj] then
  2969. X    all = [all] llib-l[me].ln;
  2970. X
  2971. Xall: [all];
  2972. X
  2973. Xclean:
  2974. X    {
  2975. X    rm -f [dot_clean]
  2976. X        set clearstat;
  2977. X    }
  2978. X
  2979. Xclobber: clean
  2980. X    {
  2981. X    rm -f [all]
  2982. X        set clearstat;
  2983. X    }
  2984. X
  2985. Xif [defined lib] then
  2986. X{
  2987. X    if [not [defined install]] then
  2988. X        install = ;
  2989. X    install = [install] [lib]/lib[me].a;
  2990. X    if [defined dot_lint_obj] then
  2991. X    install = [install] [lib]/llib-l[me].ln;
  2992. X
  2993. X    [lib]/%: %
  2994. X        {
  2995. X            cp -p % [lib]/%;
  2996. X            chmod og-w [lib]/%;
  2997. X        }
  2998. X}
  2999. X
  3000. Xif [defined include] then
  3001. X{
  3002. X    if [not [defined install]] then
  3003. X        install = ;
  3004. X    install = [install] [include]/[me].h;
  3005. X
  3006. X    [include]/%: %
  3007. X        {
  3008. X            cp -p % [include]/%;
  3009. X            chmod og-w [include]/%;
  3010. X        }
  3011. X}
  3012. X
  3013. Xif [defined install] then
  3014. X{
  3015. X    install: [install];
  3016. X
  3017. X    uninstall:
  3018. X        {
  3019. X            rm -f [install]
  3020. X        set clearstat;
  3021. X        }
  3022. X}
  3023. X
  3024. X
  3025. Xlib[me].a: [dot_obj]
  3026. X    {
  3027. X    if [exists [target]] then
  3028. X        rm -f [target]
  3029. X            set clearstat;
  3030. X    [ar] r [target] [dot_obj];
  3031. X    if [ranlib] then
  3032. X        [ranlib] [target];
  3033. X    }
  3034. X
  3035. Xif [defined dot_lint_obj] then
  3036. X{
  3037. X    llib-l[me].ln: [dot_lint_obj]
  3038. X        {
  3039. X        [lint] [dot_lint_obj] -o [me];
  3040. X        }
  3041. X}
  3042. END_OF_FILE
  3043. if test 2534 -ne `wc -c <'lib/library'`; then
  3044.     echo shar: \"'lib/library'\" unpacked with wrong size!
  3045. fi
  3046. # end of 'lib/library'
  3047. fi
  3048. if test -f 'lib/program' -a "${1}" != "-c" ; then 
  3049.   echo shar: Will not clobber existing file \"'lib/program'\"
  3050. else
  3051. echo shar: Extracting \"'lib/program'\" \(2207 characters\)
  3052. sed "s/^X//" >'lib/program' <<'END_OF_FILE'
  3053. X/*
  3054. X * NAME
  3055. X *    program - construct a program
  3056. X *
  3057. X * DESCRIPTION
  3058. X *    This cookbook defines how to construct a program.
  3059. X *
  3060. X *    If you program uses any libraries, you will have to append
  3061. X *    them to cc_link_flags in your Howto.cook file.
  3062. X *
  3063. X * VARIABLES
  3064. X *    all        targets of the all recipe
  3065. X *    install        targets of the install recipe
  3066. X *    me        the name of the program to be constructed.
  3067. X *            Defaults to the last component of the pathname
  3068. X *            of the current directory.
  3069. X *    install        targets of the install command.
  3070. X *
  3071. X * RECIPES
  3072. X *    all:        construct the targets defined in [all].
  3073. X *    clean:        remove the files named in [dot_clean].
  3074. X *    clobber:    remove the files name in [dot_clean] and [all].
  3075. X *
  3076. X * If the [lib] variable is defined
  3077. X *    install:    construct the files named in [install].
  3078. X *    uninstall:    remove the files named in [install].
  3079. X *
  3080. X * MANIFEST: cookbook for constructing programs
  3081. X */
  3082. X
  3083. X#pragma once
  3084. X
  3085. Xif [not [defined me]] then
  3086. X    me = [entryname [dir [pathname x]]];
  3087. X
  3088. Xall = [me];
  3089. Xif [defined dot_lint_obj] then
  3090. X    all = [all] [me].lint;
  3091. Xdot_clean = [dot_clean] [me]~;
  3092. X
  3093. Xall: [all];
  3094. X
  3095. Xclean:
  3096. X    {
  3097. X    rm -f [dot_clean]
  3098. X        set clearstat;
  3099. X    }
  3100. X
  3101. Xclobber: clean
  3102. X    {
  3103. X    rm -f [all]
  3104. X        set clearstat;
  3105. X    }
  3106. X
  3107. Xif [defined bin] then
  3108. X{
  3109. X    install = [bin]/[me];
  3110. X
  3111. X    install: [install];
  3112. X
  3113. X    uninstall:
  3114. X        {
  3115. X            rm -f [install]
  3116. X        set clearstat;
  3117. X        }
  3118. X
  3119. X    [bin]/%: %
  3120. X        {
  3121. X            cp % [bin]/%;
  3122. X            chmod og-w [bin]/%;
  3123. X        }
  3124. X
  3125. X    [lib]/%: %
  3126. X        {
  3127. X            cp % [lib]/%;
  3128. X            chmod og-w [lib]/%;
  3129. X        }
  3130. X}
  3131. X
  3132. Xfind_libs = [find_command find_libs];
  3133. X
  3134. Xif [find_libs] then
  3135. X{
  3136. X    [me]: [dot_obj] [collect [find_libs] [cc_link_flags]]
  3137. X        {
  3138. X        if [exists [me]~] then
  3139. X        rm -f [me]~
  3140. X            set clearstat;
  3141. X        if [exists [me]] then
  3142. X        mv [me] [me]~
  3143. X            set clearstat;
  3144. X            [cc] [dot_obj] [cc_link_flags] -o [me];
  3145. X        }
  3146. X}
  3147. Xelse
  3148. X{
  3149. X    [me]: [dot_obj]
  3150. X        {
  3151. X        if [exists [me]~] then
  3152. X        rm -f [me]~
  3153. X            set clearstat;
  3154. X        if [exists [me]] then
  3155. X        mv [me] [me]~
  3156. X            set clearstat;
  3157. X            [cc] [dot_obj] [cc_link_flags] -o [me];
  3158. X        }
  3159. X}
  3160. X
  3161. Xif [defined dot_lint_obj] then
  3162. X{
  3163. X    [me].lint: [dot_lint_obj]
  3164. X        {
  3165. X        [lint] [dot_lint_obj] [cc_link_flags];
  3166. X        }
  3167. X}
  3168. END_OF_FILE
  3169. if test 2207 -ne `wc -c <'lib/program'`; then
  3170.     echo shar: \"'lib/program'\" unpacked with wrong size!
  3171. fi
  3172. # end of 'lib/program'
  3173. fi
  3174. if test -f 'lib/yacc' -a "${1}" != "-c" ; then 
  3175.   echo shar: Will not clobber existing file \"'lib/yacc'\"
  3176. else
  3177. echo shar: Extracting \"'lib/yacc'\" \(2216 characters\)
  3178. sed "s/^X//" >'lib/yacc' <<'END_OF_FILE'
  3179. X/*
  3180. X * NAME
  3181. X *    yacc - how to use yacc
  3182. X *
  3183. X * DESCRIPTION
  3184. X *    This cookbook describes how to use yacc.
  3185. X *
  3186. X *    You will have to add "-d" to the [yacc_flags] variable
  3187. X *    if you want %.h files generated.
  3188. X *
  3189. X *    If a y.output file is constructed, it will be moved to %.list
  3190. X *
  3191. X * RECIPES
  3192. X *    %.c %.h: %.y    applied if -d in [yacc_flags]
  3193. X *    %.c: %.y    applied if -d not in [yacc_flags]
  3194. X *
  3195. X * VARIABLES
  3196. X *    yacc_src    Yacc source files in the current directory.
  3197. X *    dot_src        Source files constructable in the current directory
  3198. X *            (unioned with existing setting, if necessary).
  3199. X *    dot_obj        Object files constructable in the current directory
  3200. X *            (unioned with existing setting, if necessary).
  3201. X *    dot_clean    Files which may be removed from the current directory
  3202. X *            in a clean target.            
  3203. X *    dot_lint_obj    Lint object files constructable in the current directory
  3204. X *            (unioned with existing setting, if necessary).
  3205. X *
  3206. X * MANIFEST: cookbook for using yacc
  3207. X */
  3208. X
  3209. X#pragma once
  3210. X
  3211. X#include "c"
  3212. X
  3213. Xif [not [defined yacc]] then
  3214. X    yacc = yacc;
  3215. Xif [not [defined yacc_flags]] then
  3216. X    yacc_flags = ;
  3217. Xyacc_src = [glob *.y];
  3218. Xcc_src = [stringset [cc_src] - [fromto %.y %.c [yacc_src]]];
  3219. Xdot_src =
  3220. X    [stringset
  3221. X        [dot_src] [yacc_src]
  3222. X    -
  3223. X        [fromto %.y %.c [yacc_src]] [fromto %.y %.s [yacc_src]]
  3224. X    ];
  3225. Xdot_obj = [stringset [dot_obj] [fromto %.y %.o [yacc_src]]];
  3226. Xdot_clean =
  3227. X    [stringset
  3228. X    [dot_clean]
  3229. X    [fromto %.y %.o [yacc_src]]
  3230. X    [fromto %.y %.c [yacc_src]]
  3231. X    [fromto %.y %.list [yacc_src]]
  3232. X    [fromto %.y %.ln [yacc_src]]
  3233. X    [fromto %.y %.s [yacc_src]]
  3234. X    y.tab.c y.tab.h y.output
  3235. X    ];
  3236. Xdot_lint_obj = [stringset [dot_lint_obj] [fromto %.y %.ln [yacc_src]]];
  3237. X
  3238. X%.c %.h: %.y if [in -d [yacc_flags]]
  3239. X    {
  3240. X    if [exists %.list] then
  3241. X        rm -f %.list
  3242. X        set clearstat;
  3243. X    if [exists y.output] then
  3244. X        rm -f y.output
  3245. X        set clearstat;
  3246. X    [yacc] [yacc_flags] %.y;
  3247. X    mv y.tab.c %.c;
  3248. X    mv y.tab.h %.h;
  3249. X    if [exists y.output] then
  3250. X        mv y.output %.list
  3251. X        set clearstat;
  3252. X    }
  3253. X
  3254. X%.c: %.y if [not [in -d [yacc_flags]]]
  3255. X    {
  3256. X    if [exists %.list] then
  3257. X        rm -f %.list
  3258. X        set clearstat;
  3259. X    if [exists y.output] then
  3260. X        rm -f y.output
  3261. X        set clearstat;
  3262. X    [yacc] [yacc_flags] %.y;
  3263. X    mv y.tab.c %.c;
  3264. X    if [exists y.output] then
  3265. X        mv y.output %.list
  3266. X        set clearstat;
  3267. X    }
  3268. END_OF_FILE
  3269. if test 2216 -ne `wc -c <'lib/yacc'`; then
  3270.     echo shar: \"'lib/yacc'\" unpacked with wrong size!
  3271. fi
  3272. # end of 'lib/yacc'
  3273. fi
  3274. if test -f 'lib/yacc_many' -a "${1}" != "-c" ; then 
  3275.   echo shar: Will not clobber existing file \"'lib/yacc_many'\"
  3276. else
  3277. echo shar: Extracting \"'lib/yacc_many'\" \(2622 characters\)
  3278. sed "s/^X//" >'lib/yacc_many' <<'END_OF_FILE'
  3279. X/*
  3280. X * NAME
  3281. X *    yacc_many - how to use yacc several times in the same directory
  3282. X *
  3283. X * DESCRIPTION
  3284. X *    This cookbook describes how to use yacc.
  3285. X *    The difference with the "yacc" cookbook is that this cookbook
  3286. X *    allows you to have more that one yacc generated parser in the same
  3287. X *    program, by using the classic sed(1) hack of the output.
  3288. X *
  3289. X *    You will have to add "-d" to the [yacc_flags] variable
  3290. X *    if you want %.h files generated.
  3291. X *
  3292. X *    If a y.output file is constructed, it will be moved to %.list
  3293. X *
  3294. X * RECIPES
  3295. X *    %.c %.h: %.y    applied if -d in [yacc_flags]
  3296. X *    %.c: %.y    applied if -d not in [yacc_flags]
  3297. X *
  3298. X * VARIABLES
  3299. X *    yacc_src    Yacc source files in the current directory.
  3300. X *    dot_src        Source files constructable in the current directory
  3301. X *            (unioned with existing setting, if necessary).
  3302. X *    dot_obj        Object files constructable in the current directory
  3303. X *            (unioned with existing setting, if necessary).
  3304. X *    dot_clean    Files which may be removed from the current directory
  3305. X *            in a clean target.            
  3306. X *    dot_lint_obj    Lint object files constructable in the current directory
  3307. X *            (unioned with existing setting, if necessary).
  3308. X *
  3309. X * MANIFEST: cookbook for using yacc more than once in same program
  3310. X */
  3311. X
  3312. X#pragma once
  3313. X
  3314. X#include "c"
  3315. X
  3316. Xif [not [defined yacc]] then
  3317. X    yacc = yacc;
  3318. Xif [not [defined yacc_flags]] then
  3319. X    yacc_flags = ;
  3320. Xyacc_src = [glob *.y];
  3321. Xcc_src = [stringset [cc_src] - [fromto %.y %.c [yacc_src]]];
  3322. Xdot_src =
  3323. X    [stringset
  3324. X        [dot_src] [yacc_src]
  3325. X    -
  3326. X        [fromto %.y %.c [yacc_src]] [fromto %.y %.s [yacc_src]]
  3327. X    ];
  3328. Xdot_obj = [stringset [dot_obj] [fromto %.y %.o [yacc_src]]];
  3329. Xdot_clean =
  3330. X    [stringset
  3331. X    [dot_clean]
  3332. X    [fromto %.y %.o [yacc_src]]
  3333. X    [fromto %.y %.c [yacc_src]]
  3334. X    [fromto %.y %.list [yacc_src]]
  3335. X    [fromto %.y %.ln [yacc_src]]
  3336. X    [fromto %.y %.s [yacc_src]]
  3337. X    y.tab.c y.tab.h y.output
  3338. X    ];
  3339. Xdot_lint_obj = [stringset [dot_lint_obj] [fromto %.y %.ln [yacc_src]]];
  3340. X
  3341. X
  3342. X%.c %.h: %.y if [in -d [yacc_flags]]
  3343. X    {
  3344. X    if [exists %.list] then
  3345. X        rm -f %.list
  3346. X        set clearstat;
  3347. X    if [exists y.output] then
  3348. X        rm -f y.output
  3349. X        set clearstat;
  3350. X    [yacc] [yacc_flags] %.y;
  3351. X    sed -e \'s/\[yY\]\[yY\]/%_/g\' y.tab.c > %.c;
  3352. X    rm -f y.tab.c;
  3353. X    sed -e \'s/\[yY\]\[yY\]/%_/g\' y.tab.h > %.h;
  3354. X    rm -f y.tab.h;
  3355. X    if [exists y.output] then
  3356. X        mv y.output %.list
  3357. X        set clearstat;
  3358. X    }
  3359. X
  3360. X%.c: %.y if [not [in -d [yacc_flags]]]
  3361. X    {
  3362. X    if [exists %.list] then
  3363. X        rm -f %.list
  3364. X        set clearstat;
  3365. X    if [exists y.output] then
  3366. X        rm -f y.output
  3367. X        set clearstat;
  3368. X    [yacc] [yacc_flags] %.y;
  3369. X    sed -e \'s/\[yY\]\[yY\]/%_/g\' y.tab.c > %.c;
  3370. X    rm -f y.tab.c;
  3371. X    if [exists y.output] then
  3372. X        mv y.output %.list
  3373. X        set clearstat;
  3374. X    }
  3375. END_OF_FILE
  3376. if test 2622 -ne `wc -c <'lib/yacc_many'`; then
  3377.     echo shar: \"'lib/yacc_many'\" unpacked with wrong size!
  3378. fi
  3379. # end of 'lib/yacc_many'
  3380. fi
  3381. if test -f 'man1/c_incl.1' -a "${1}" != "-c" ; then 
  3382.   echo shar: Will not clobber existing file \"'man1/c_incl.1'\"
  3383. else
  3384. echo shar: Extracting \"'man1/c_incl.1'\" \(4489 characters\)
  3385. sed "s/^X//" >'man1/c_incl.1' <<'END_OF_FILE'
  3386. X'\" t
  3387. X.\"    cook - file construction tool
  3388. X.\"    Copyright (C) 1991, 1992, 1993 Peter Miller.
  3389. X.\"    All rights reserved.
  3390. X.\"
  3391. X.\"    This program is free software; you can redistribute it and/or modify
  3392. X.\"    it under the terms of the GNU General Public License as published by
  3393. X.\"    the Free Software Foundation; either version 2 of the License, or
  3394. X.\"    (at your option) any later version.
  3395. X.\"
  3396. X.\"    This program is distributed in the hope that it will be useful,
  3397. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  3398. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3399. X.\"    GNU General Public License for more details.
  3400. X.\"
  3401. X.\"    You should have received a copy of the GNU General Public License
  3402. X.\"    along with this program; if not, write to the Free Software
  3403. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3404. X.\"
  3405. X.\" MANIFEST: manual entry for c_incl
  3406. X.\" 
  3407. X.TH C_INCL 1
  3408. X.ds n) c_incl
  3409. X.if n .ad l
  3410. X.if n .hy 0
  3411. X.if n .nr IN 8n
  3412. X.SH NAME
  3413. X\*(n) - determine dependencies
  3414. X.SH SYNOPSIS
  3415. X.B \*(n)
  3416. X[
  3417. X.IR option ...
  3418. X]
  3419. X.I filename
  3420. X.br
  3421. X.B \*(n)
  3422. X.B -Help
  3423. X.br
  3424. X.B \*(n)
  3425. X.B -VERSion
  3426. X.SH DESCRIPTION
  3427. XThe
  3428. X.I \*(n)
  3429. Xprogram
  3430. Xis used to traverse source files looking for include dependencies
  3431. Xsuitable for \f(CW[collect]\fPion by cook.
  3432. X.PP
  3433. XSeveral input languages are supported,
  3434. Xsee the options list for details.
  3435. X.br
  3436. X.ne 1i
  3437. X.SH OPTIONS
  3438. XThe following options are understood.
  3439. X.TP 8n
  3440. X.B -C
  3441. X.br
  3442. XThe source file is a C source file.
  3443. XIt is assumed that it will have the dependencies resolved
  3444. Xby the
  3445. X.IR cpp (1)
  3446. Xcommand.
  3447. XThe same include semantics as the
  3448. X.IR cpp (1)
  3449. Xcommand will be employed.
  3450. XThis is the default.
  3451. X.TP 8n
  3452. X.B -Roff
  3453. X.br
  3454. XThe source file is a *roff source file.
  3455. XIt is assumed that it will have the dependencies resolved
  3456. Xby the
  3457. X.IR roffpp (1)
  3458. Xcommand.
  3459. XThe same include semantics as the
  3460. X.IR roffpp (1)
  3461. Xcommand will be employed.
  3462. X.TP 8n
  3463. X.B -Verbose
  3464. X.br
  3465. XTell what is happening.
  3466. X.TP 8n
  3467. X.BI -I path
  3468. X.br
  3469. XSpecify include path, a la
  3470. X.IR cc (1).
  3471. X.TP 8n
  3472. X.B -Absent_Local_Ignore
  3473. X.br
  3474. XFor files included using a
  3475. X.I "#include ''filename.h''"
  3476. Xdirective,
  3477. Xignore the file if it cannot be found.
  3478. X.TP 8n
  3479. X.B -Absent_Local_Mention
  3480. X.br
  3481. XFor files included using a
  3482. X.I "#include ''filename.h''"
  3483. Xdirective,
  3484. Xprint the file name even if the file cannot be found.
  3485. XThis is the default (it probably needs to be built).
  3486. X.TP 8n
  3487. X.B -Absent_Local_Error
  3488. X.br
  3489. XFor files included using a
  3490. X.I "#include ''filename.h''"
  3491. Xdirective,
  3492. Xprint a fatal error if the file cannot be found.
  3493. X.TP 8n
  3494. X.B -Absent_System_Ignore
  3495. X.br
  3496. XFor files included with a
  3497. X.I "#include <filename.h>"
  3498. Xdirective,
  3499. Xignore the file if it cannot be found.
  3500. XThis is the default (it was probably ifdef'ed out).
  3501. X.TP 8n
  3502. X.B -Absent_System_Mention
  3503. X.br
  3504. XFor files included with a
  3505. X.I "#include <filename.h>"
  3506. Xdirective,
  3507. Xprint the file name even if the file cannot be found.
  3508. X.TP 8n
  3509. X.B -Absent_System_Error
  3510. X.br
  3511. XFor files included with a
  3512. X.I "#include <filename.h>"
  3513. Xdirective,
  3514. Xprint a fatal error if the file cannot be found.
  3515. X.TP 8n
  3516. X.B -Absent_Program_Ignore
  3517. X.br
  3518. XIf the file named on the command line cannot be found,
  3519. Xbehave as if the file were found, but was empty.
  3520. X.TP 8n
  3521. X.B -Absent_Program_Error
  3522. X.br
  3523. XIf the file named on the command line cannot be found,
  3524. Xprint a fatal error message.
  3525. XThis is the default.
  3526. X.TP 8n
  3527. X.B -Help
  3528. X.br
  3529. XGive information on how to use
  3530. X.IR \*(n) .
  3531. X.TP 8n
  3532. X.B -VERSion
  3533. X.br
  3534. XTell what version of
  3535. X.I \*(n)
  3536. Xis being run.
  3537. X.TP 8n
  3538. X.B -No_System
  3539. X.br
  3540. XDo not search the 
  3541. X.I /usr/include
  3542. Xdirectory.
  3543. XBy default this is searched last.
  3544. X.TP 8n
  3545. X.B -No_Cache
  3546. X.br
  3547. XThis option may be used to turn caching off.
  3548. X.PP
  3549. XAny other options will generate an error.
  3550. X.so o__rules.so
  3551. X.br
  3552. X.ne 1i
  3553. X.SH CACHING
  3554. XThe caching mechanism use by the
  3555. X.I \*(n)
  3556. Xprogram caches the results of searching files
  3557. Xfor include files (in a file called
  3558. X.I .\*(n)rc
  3559. Xin the current directory).
  3560. XThe cache is only refreshed when a file changes.
  3561. X.PP
  3562. XThe use of this cache has been shown to dramatically increase the
  3563. Xperformance of the
  3564. X.I \*(n)
  3565. Xprogram.
  3566. XTypically,
  3567. Xonly a small proportions files in a project change between builds,
  3568. Xresulting in a very high cache hit rate.
  3569. X.PP
  3570. XWhen using caching,
  3571. Xalways use the same command line options,
  3572. Xotherwise weird and wonderful things will happen.
  3573. X.PP
  3574. XThe
  3575. X.I .\*(n)rc
  3576. Xfile is a binary file.
  3577. XIf you wish to rebuild the cache,
  3578. Xsimply delete this file with the
  3579. X.IR rm (1)
  3580. Xcommand.
  3581. XBeing a binary file,
  3582. Xthe
  3583. X.I .\*(n)rc
  3584. Xfile is not portable across machines or operating systems,
  3585. Xso you will need to delete it when you move your sources.
  3586. XIt is a binary file for performance.
  3587. X.so copyright.so
  3588. END_OF_FILE
  3589. if test 4489 -ne `wc -c <'man1/c_incl.1'`; then
  3590.     echo shar: \"'man1/c_incl.1'\" unpacked with wrong size!
  3591. fi
  3592. # end of 'man1/c_incl.1'
  3593. fi
  3594. if test -f 'man1/cooktime.1' -a "${1}" != "-c" ; then 
  3595.   echo shar: Will not clobber existing file \"'man1/cooktime.1'\"
  3596. else
  3597. echo shar: Extracting \"'man1/cooktime.1'\" \(2200 characters\)
  3598. sed "s/^X//" >'man1/cooktime.1' <<'END_OF_FILE'
  3599. X'\" t
  3600. X.\"    cook - file construction tool
  3601. X.\"    Copyright (C) 1991, 1992, 1993 Peter Miller.
  3602. X.\"    All rights reserved.
  3603. X.\"
  3604. X.\"    This program is free software; you can redistribute it and/or modify
  3605. X.\"    it under the terms of the GNU General Public License as published by
  3606. X.\"    the Free Software Foundation; either version 2 of the License, or
  3607. X.\"    (at your option) any later version.
  3608. X.\"
  3609. X.\"    This program is distributed in the hope that it will be useful,
  3610. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  3611. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3612. X.\"    GNU General Public License for more details.
  3613. X.\"
  3614. X.\"    You should have received a copy of the GNU General Public License
  3615. X.\"    along with this program; if not, write to the Free Software
  3616. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3617. X.\"
  3618. X.\" MANIFEST: manual entry for the cooktime command
  3619. X.\" 
  3620. X.TH COOKTIME 1
  3621. X.ds n) cooktime
  3622. X.if n .hy 0
  3623. X.if n .ad l
  3624. X.if n .nr IN 8n
  3625. X.SH NAME
  3626. X\*(n) \- set file times
  3627. X.SH SYNOPSIS
  3628. X.B \*(n)
  3629. X[
  3630. X.IR option \&...
  3631. X]
  3632. X.IR filename \&...
  3633. X.br
  3634. X.B \*(n)
  3635. X.B -Help
  3636. X.br
  3637. X.B \*(n)
  3638. X.B -VERSion
  3639. X.SH DESCRIPTION
  3640. XThe
  3641. X.I \*(n)
  3642. Xprogram is used to
  3643. Xset the modified time or access time of a file.
  3644. XThis can be used to defend against unwanted
  3645. Xlogical dependencies when making "minor" changes to files.
  3646. X.PP
  3647. XIf no option is specified,
  3648. Xthe default action is as if "\fI\-Modify now\fP" was specified.
  3649. X.br
  3650. X.ne 1i
  3651. X.SH OPTIONS
  3652. XThe following options are understood.
  3653. X.TP 8n
  3654. X\fB-Access\fP \fIdate\fP
  3655. X.br
  3656. XThis option may be used to 
  3657. Xset the last-access time of the files.
  3658. XThe date is relatively free-format;
  3659. Xrember to use quotes to insulate spaces from the shell.
  3660. X.TP 8n
  3661. X\fB-Modify\fP \fIdate\fP
  3662. X.br
  3663. XThis option may be used to 
  3664. Xset the last-modify time of the files.
  3665. XThe date is relatively free-format;
  3666. Xrember to use quotes to insulate spaces from the shell.
  3667. X.TP 8n 
  3668. X.B -Report
  3669. X.br
  3670. XWhen use alone,
  3671. Xproduces a listing of access times and modify times for the named files.
  3672. XWhen used with -Access or -Modify,
  3673. Xproduces a listing of the changes made.
  3674. X.TP 8n
  3675. X.B -Help
  3676. X.br
  3677. XGive some information on how to use the
  3678. X.I \*(n)
  3679. Xcommand.
  3680. X.PP
  3681. XAny other option will generate a disgnostic error.
  3682. X.so o__rules.so
  3683. X.so copyright.so
  3684. END_OF_FILE
  3685. if test 2200 -ne `wc -c <'man1/cooktime.1'`; then
  3686.     echo shar: \"'man1/cooktime.1'\" unpacked with wrong size!
  3687. fi
  3688. # end of 'man1/cooktime.1'
  3689. fi
  3690. if test -f 'man1/roffpp.1' -a "${1}" != "-c" ; then 
  3691.   echo shar: Will not clobber existing file \"'man1/roffpp.1'\"
  3692. else
  3693. echo shar: Extracting \"'man1/roffpp.1'\" \(3509 characters\)
  3694. sed "s/^X//" >'man1/roffpp.1' <<'END_OF_FILE'
  3695. X'\" t
  3696. X.\"    cook - file construction tool
  3697. X.\"    Copyright (C) 1991, 1992, 1993 Peter Miller.
  3698. X.\"    All rights reserved.
  3699. X.\"
  3700. X.\"    This program is free software; you can redistribute it and/or modify
  3701. X.\"    it under the terms of the GNU General Public License as published by
  3702. X.\"    the Free Software Foundation; either version 2 of the License, or
  3703. X.\"    (at your option) any later version.
  3704. X.\"
  3705. X.\"    This program is distributed in the hope that it will be useful,
  3706. X.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
  3707. X.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3708. X.\"    GNU General Public License for more details.
  3709. X.\"
  3710. X.\"    You should have received a copy of the GNU General Public License
  3711. X.\"    along with this program; if not, write to the Free Software
  3712. X.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3713. X.\"
  3714. X.\" MANIFEST: manual entry for the roffpp command
  3715. X.\" 
  3716. X.TH ROFFPP 1
  3717. X.ds n) roffpp
  3718. X.if n .ad l
  3719. X.if n .hy 0
  3720. X.if n .nr IN 8n
  3721. X.SH NAME
  3722. X\*(n) \- replace \&.so requests within *roff sources
  3723. X.SH SYNOPSIS
  3724. X.B \*(n)
  3725. X[
  3726. X.IR option ...
  3727. X][
  3728. X.I infile
  3729. X[
  3730. X.I outfile
  3731. X]]
  3732. X.br
  3733. X.B \*(n)
  3734. X.B -Help
  3735. X.br
  3736. X.B \*(n)
  3737. X.B -VERSion
  3738. X.SH DESCRIPTION
  3739. XThe
  3740. X.I \*(n)
  3741. Xcommand may be used to
  3742. Xcopies the input file to the output file,
  3743. Xincluding files named using
  3744. X.I \&.so
  3745. Xdirectives along the way,
  3746. Xand removing the
  3747. X.I \&.so
  3748. Xdirectives.
  3749. X.PP
  3750. XThis is useful when processing large multi-file documents
  3751. Xwith filters such as
  3752. X.IR tbl (1)
  3753. Xor
  3754. X.IR eqn (1)
  3755. Xwhich do not understand the
  3756. X.I .so
  3757. Xdirective.
  3758. XThe
  3759. X.I \&.nx
  3760. Xdirective is not understood.
  3761. XThe
  3762. X.I \*(n)
  3763. Xprogram is not a general *roff interpreter,
  3764. Xso many constructs will be beyond it,
  3765. Xfortunately, most of them have nothing to do with include files.
  3766. XInclude files which cannot be found,
  3767. Xprobably from uninterpreted *roff constructs,
  3768. Xif the files really does exist,
  3769. Xwill simply be passed through unchanged,
  3770. Xfor *roff to interpret at a later time.
  3771. X.PP
  3772. XThe
  3773. X.I \*(n)
  3774. Xprogram also allows the user to specify an include search path.
  3775. XThis allows, for example, common files to be kept in a central location.
  3776. X.PP
  3777. XOnly directives of the form
  3778. X.RS
  3779. X.B \&.so
  3780. X.I filename
  3781. X.RE
  3782. Xare processed.
  3783. XIf the directive is introduced using the single quote form,
  3784. Xor the dot is not the first character of the line,
  3785. Xthe directive will be ignored.
  3786. X.PP
  3787. XAny extra arguments on the line are ignored,
  3788. Xand quoting is not understood.
  3789. XAll characters are interpreted literally.
  3790. X.PP
  3791. XExamples of directives which will be ignored include
  3792. X.RS
  3793. X\&'so /usr/lib/tmac/tmac.an
  3794. X.br
  3795. X\&.if n .so yuck
  3796. X.RE
  3797. XThis list is not exhaustive.
  3798. X.PP
  3799. XThe special file name
  3800. X.RB ` \- '
  3801. Xon the command line
  3802. Xmeans the standard input or standard output,
  3803. Xas appropriate.
  3804. XFiles which are omitted are also assumed to be
  3805. Xthe standard input or standard output,
  3806. Xas appropriate.
  3807. X.PP
  3808. XThe output attempts to keep file names and line numbers in sync
  3809. Xby using the
  3810. X.B \&.lf
  3811. Xdirective.
  3812. XThe
  3813. X.B \&.lf
  3814. Xdirective is also understood as input.
  3815. XThis is compatible with
  3816. X.IR groff (1)
  3817. Xand the other GNU text utilities included in the groff package.
  3818. X.br
  3819. X.ne 1i
  3820. X.SH OPTIONS
  3821. XThe following options are understood.
  3822. X.TP 8n
  3823. X.BI -I path
  3824. X.br
  3825. XSpecify include path, a la
  3826. X.IR cc (1).
  3827. XInclude paths are searched in the order specified.
  3828. XThe include search path defaults to the current directory
  3829. Xif and only if the user does not specify any include search paths.
  3830. X.TP 8n
  3831. X.B -Help
  3832. X.br
  3833. XGive information on how to use
  3834. X.IR \*(n) .
  3835. X.TP 8n
  3836. X.B -VERSion
  3837. X.br
  3838. XTell what version of
  3839. X.I \*(n)
  3840. Xis being run.
  3841. X.PP
  3842. XAny other option will generate a diagnostic error.
  3843. X.so o__rules.so
  3844. X.so copyright.so
  3845. END_OF_FILE
  3846. if test 3509 -ne `wc -c <'man1/roffpp.1'`; then
  3847.     echo shar: \"'man1/roffpp.1'\" unpacked with wrong size!
  3848. fi
  3849. # end of 'man1/roffpp.1'
  3850. fi
  3851. if test -f 'test/00/t0038a.sh' -a "${1}" != "-c" ; then 
  3852.   echo shar: Will not clobber existing file \"'test/00/t0038a.sh'\"
  3853. else
  3854. echo shar: Extracting \"'test/00/t0038a.sh'\" \(2829 characters\)
  3855. sed "s/^X//" >'test/00/t0038a.sh' <<'END_OF_FILE'
  3856. X#! /bin/sh
  3857. X#
  3858. X#    cook - file construction tool
  3859. X#    Copyright (C) 1990, 1991, 1992, 1993 Peter Miller.
  3860. X#    All rights reserved.
  3861. X#
  3862. X#    This program is free software; you can redistribute it and/or modify
  3863. X#    it under the terms of the GNU General Public License as published by
  3864. X#    the Free Software Foundation; either version 2 of the License, or
  3865. X#    (at your option) any later version.
  3866. X#
  3867. X#    This program is distributed in the hope that it will be useful,
  3868. X#    but WITHOUT ANY WARRANTY; without even the implied warranty of
  3869. X#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3870. X#    GNU General Public License for more details.
  3871. X#
  3872. X#    You should have received a copy of the GNU General Public License
  3873. X#    along with this program; if not, write to the Free Software
  3874. X#    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  3875. X#
  3876. X# MANIFEST: test roffpp functionality
  3877. X#
  3878. Xtmp=/tmp/$$
  3879. Xhere=`pwd`
  3880. Xif test $? -ne 0 ; then exit 1; fi
  3881. X
  3882. Xfail()
  3883. X{
  3884. X    echo 'FAILED test of roffpp command' 1>&2
  3885. X    cd $here
  3886. X    rm -rf $tmp
  3887. X    exit 1
  3888. X}
  3889. Xpass()
  3890. X{
  3891. X    cd $here
  3892. X    rm -rf $tmp
  3893. X    exit 0
  3894. X}
  3895. Xtrap "fail" 1 2 3 15
  3896. X
  3897. Xmkdir $tmp
  3898. Xmkdir $tmp/bloggs
  3899. Xcd $tmp
  3900. X
  3901. X#
  3902. X# test the plain-vanilla form
  3903. X#
  3904. Xcat > test.in << 'foobar'
  3905. Xtesting
  3906. X.so test2.in
  3907. Xline three
  3908. Xfoobar
  3909. Xif test $? -ne 0 ; then fail; fi
  3910. X
  3911. Xcat > test2.in << 'foobar'
  3912. Xone
  3913. Xtwo
  3914. Xthree
  3915. Xfoobar
  3916. Xif test $? -ne 0 ; then fail; fi
  3917. X
  3918. Xcat > test.ok << 'foobar'
  3919. X.lf 1 test.in
  3920. Xtesting
  3921. X.lf 1 test2.in
  3922. Xone
  3923. Xtwo
  3924. Xthree
  3925. X.lf 3 test.in
  3926. Xline three
  3927. Xfoobar
  3928. Xif test $? -ne 0 ; then fail; fi
  3929. X
  3930. X$here/bin/roffpp test.in test.out
  3931. Xif test $? -ne 0 ; then fail; fi
  3932. X
  3933. Xdiff test.ok test.out
  3934. Xif test $? -ne 0 ; then fail; fi
  3935. X
  3936. X#
  3937. X# test the .lf directive
  3938. X#
  3939. Xcat > test.in << 'foobar'
  3940. Xtesting
  3941. X.lf 47 granny-smith
  3942. XGranny Smith
  3943. X.so test2.in
  3944. Xline three
  3945. Xfoobar
  3946. Xif test $? -ne 0 ; then fail; fi
  3947. X
  3948. Xcat > test2.in << 'foobar'
  3949. Xone
  3950. Xtwo
  3951. Xthree
  3952. Xfoobar
  3953. Xif test $? -ne 0 ; then fail; fi
  3954. X
  3955. Xcat > test.ok << 'foobar'
  3956. X.lf 1 test.in
  3957. Xtesting
  3958. X.lf 47 granny-smith
  3959. XGranny Smith
  3960. X.lf 1 test2.in
  3961. Xone
  3962. Xtwo
  3963. Xthree
  3964. X.lf 49 granny-smith
  3965. Xline three
  3966. Xfoobar
  3967. Xif test $? -ne 0 ; then fail; fi
  3968. X
  3969. X$here/bin/roffpp test.in test.out
  3970. Xif test $? -ne 0 ; then fail; fi
  3971. X
  3972. Xdiff test.ok test.out
  3973. Xif test $? -ne 0 ; then fail; fi
  3974. X
  3975. X#
  3976. X# test the explicit include path form
  3977. X#
  3978. Xcat > test.in << 'foobar'
  3979. Xtesting
  3980. X.so test2.in
  3981. X.so ../test2.in
  3982. Xline four
  3983. Xfoobar
  3984. Xif test $? -ne 0 ; then fail; fi
  3985. X
  3986. Xcat > bloggs/test2.in << 'foobar'
  3987. XBodgie Rent-a-Wreck
  3988. X-- free --
  3989. Xwith every 200 lb rotweiler sold
  3990. Xfoobar
  3991. Xif test $? -ne 0 ; then fail; fi
  3992. X
  3993. Xcat > test.ok << 'foobar'
  3994. X.lf 1 test.in
  3995. Xtesting
  3996. X.lf 1 bloggs/test2.in
  3997. XBodgie Rent-a-Wreck
  3998. X-- free --
  3999. Xwith every 200 lb rotweiler sold
  4000. X.lf 3 test.in
  4001. X.lf 1 bloggs/../test2.in
  4002. Xone
  4003. Xtwo
  4004. Xthree
  4005. X.lf 4 test.in
  4006. Xline four
  4007. Xfoobar
  4008. Xif test $? -ne 0 ; then fail; fi
  4009. X
  4010. X$here/bin/roffpp -Ibloggs -I. test.in test.out
  4011. Xif test $? -ne 0 ; then fail; fi
  4012. X
  4013. Xdiff test.ok test.out
  4014. Xif test $? -ne 0 ; then fail; fi
  4015. X
  4016. X# probably OK
  4017. Xpass
  4018. END_OF_FILE
  4019. if test 2829 -ne `wc -c <'test/00/t0038a.sh'`; then
  4020.     echo shar: \"'test/00/t0038a.sh'\" unpacked with wrong size!
  4021. fi
  4022. # end of 'test/00/t0038a.sh'
  4023. fi
  4024. if test -f 'test/00/t0041a.sh' -a "${1}" != "-c" ; then 
  4025.   echo shar: Will not clobber existing file \"'test/00/t0041a.sh'\"
  4026. else
  4027. echo shar: Extracting \"'test/00/t0041a.sh'\" \(2246 characters\)
  4028. sed "s/^X//" >'test/00/t0041a.sh' <<'END_OF_FILE'
  4029. X#! /bin/sh
  4030. X#
  4031. X#    cook - file construction tool
  4032. X#    Copyright (C) 1993 Peter Miller.
  4033. X#    All rights reserved.
  4034. X#
  4035. X#    This program is free software; you can redistribute it and/or modify
  4036. X#    it under the terms of the GNU General Public License as published by
  4037. X#    the Free Software Foundation; either version 2 of the License, or
  4038. X#    (at your option) any later version.
  4039. X#
  4040. X#    This program is distributed in the hope that it will be useful,
  4041. X#    but WITHOUT ANY WARRANTY; without even the implied warranty of
  4042. X#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4043. X#    GNU General Public License for more details.
  4044. X#
  4045. X#    You should have received a copy of the GNU General Public License
  4046. X#    along with this program; if not, write to the Free Software
  4047. X#    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  4048. X#
  4049. X# MANIFEST: Test the "resolve" builtin function
  4050. X#
  4051. X
  4052. Xwork=/tmp/$$
  4053. XPAGER=cat
  4054. Xexport PAGER
  4055. X
  4056. Xhere=`pwd`
  4057. Xif test $? -ne 0 ; then exit 1; fi
  4058. X
  4059. Xfail()
  4060. X{
  4061. X    set +x
  4062. X    echo 'FAILED test of the builtin function "resolve"' 1>&2
  4063. X    cd $here
  4064. X    find $work -type d -user $USER -exec chmod u+w {} \;
  4065. X    rm -rf $work
  4066. X    exit 1
  4067. X}
  4068. Xpass()
  4069. X{
  4070. X    set +x
  4071. X    echo PASSED 1>&2
  4072. X    cd $here
  4073. X    find $work -type d -user $USER -exec chmod u+w {} \;
  4074. X    rm -rf $work
  4075. X    exit 0
  4076. X}
  4077. Xtrap "fail" 1 2 3 15
  4078. X
  4079. Xmkdir $work
  4080. Xif test $? -ne 0 ; then exit 1; fi
  4081. Xcd $work
  4082. Xif test $? -ne 0 ; then fail; fi
  4083. X
  4084. X#
  4085. X# test cookbook
  4086. X#
  4087. Xcat > book << 'fubar'
  4088. Xsearch_list  = . bl;
  4089. X%.o: %.c
  4090. X{
  4091. X    cc -O -c [resolve %.c];
  4092. X}
  4093. X
  4094. Xtest: a.o b.o
  4095. X{
  4096. X    cc -o test [resolve a.o b.o];
  4097. X}
  4098. Xfubar
  4099. Xif test $? -ne 0 ; then fail; fi
  4100. X
  4101. X#
  4102. X# the first source file
  4103. X#
  4104. Xcat > a.c << 'fubar'
  4105. Xmain()
  4106. X{
  4107. X    b();
  4108. X    exit(0);
  4109. X}
  4110. Xfubar
  4111. Xif test $? -ne 0 ; then fail; fi
  4112. X
  4113. X#
  4114. X# the second source file
  4115. X#
  4116. Xmkdir bl
  4117. Xif test $? -ne 0 ; then fail; fi
  4118. Xcat > bl/b.c << 'fubar'
  4119. Xb()
  4120. X{
  4121. X    printf("Hello, World!\n");
  4122. X}
  4123. Xfubar
  4124. Xif test $? -ne 0 ; then fail; fi
  4125. X
  4126. X#
  4127. X# try it out
  4128. X#
  4129. Xsleep 1
  4130. X$here/bin/cook -book book -nl
  4131. Xif test $? -ne 0 ; then fail; fi
  4132. X
  4133. X#
  4134. X# make sure works for object in search list, too
  4135. X#
  4136. Xmv b.o bl/b.o
  4137. Xif test $? -ne 0 ; then fail; fi
  4138. Xrm test
  4139. Xif test $? -ne 0 ; then fail; fi
  4140. Xsleep 1
  4141. X$here/bin/cook -book book -nl
  4142. Xif test $? -ne 0 ; then fail; fi
  4143. X
  4144. X#
  4145. X# Only definite negatives are possible.
  4146. X# The functionality exercised by this test appears to work,
  4147. X# no other guarantees are made.
  4148. X#
  4149. Xpass
  4150. END_OF_FILE
  4151. if test 2246 -ne `wc -c <'test/00/t0041a.sh'`; then
  4152.     echo shar: \"'test/00/t0041a.sh'\" unpacked with wrong size!
  4153. fi
  4154. # end of 'test/00/t0041a.sh'
  4155. fi
  4156. echo shar: End of archive 3 \(of 11\).
  4157. cp /dev/null ark3isdone
  4158. MISSING=""
  4159. for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
  4160.     if test ! -f ark${I}isdone ; then
  4161.     MISSING="${MISSING} ${I}"
  4162.     fi
  4163. done
  4164. if test "${MISSING}" = "" ; then
  4165.     echo You have unpacked all 11 archives.
  4166.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  4167. else
  4168.     echo You still need to unpack the following archives:
  4169.     echo "        " ${MISSING}
  4170. fi
  4171. ##  End of shell archive.
  4172. exit 0
  4173.