home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume19 / dmake / part04 < prev    next >
Encoding:
Text File  |  1991-05-10  |  40.1 KB  |  1,309 lines

  1. Newsgroups: comp.sources.misc
  2. From: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  3. Subject:  v19i025:  dmake - dmake version 3.7, Part04/37
  4. Message-ID: <1991May9.192646.23512@sparky.IMD.Sterling.COM>
  5. Date: Thu, 9 May 1991 19:26:46 GMT
  6. Approved: kent@sparky.imd.sterling.com
  7.  
  8. Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  9. Posting-number: Volume 19, Issue 25
  10. Archive-name: dmake/part04
  11. Supersedes: dmake-3.6: Volume 15, Issue 52-77
  12.  
  13. ---- Cut Here and feed the following to sh ----
  14. #!/bin/sh
  15. # this is dmake.shar.04 (part 4 of a multipart archive)
  16. # do not concatenate these parts, unpack them in order with /bin/sh
  17. # file dmake/dbug/dbug/dbug.p continued
  18. #
  19. if test ! -r _shar_seq_.tmp; then
  20.     echo 'Please unpack part 1 first!'
  21.     exit 1
  22. fi
  23. (read Scheck
  24.  if test "$Scheck" != 4; then
  25.     echo Please unpack part "$Scheck" next!
  26.     exit 1
  27.  else
  28.     exit 0
  29.  fi
  30. ) < _shar_seq_.tmp || exit 1
  31. if test -f _shar_wnt_.tmp; then
  32. sed 's/^X//' << 'SHAR_EOF' >> 'dmake/dbug/dbug/dbug.p' &&
  33. X
  34. X
  35. X
  36. X
  37. X
  38. X            Function  level  tracing  is  enabled  by  passing  the
  39. X       debugger the 't' flag in the debug control string.  Figure 7
  40. X       is  the  output  resulting  from  the  command  "factorial -
  41. X       #t:o 3 2".
  42. X
  43. X
  44. X
  45. X
  46. X
  47. X
  48. X
  49. X
  50. X
  51. X
  52. X
  53. X
  54. X
  55. X
  56. X
  57. X
  58. X
  59. X
  60. X
  61. X
  62. X
  63. X                                  - 9 -
  64. X
  65. X
  66. X
  67. X
  68. X
  69. X
  70. X
  71. X       DBUG User Manual                            October 29, 1986
  72. X
  73. X
  74. X
  75. X
  76. X
  77. X                 |   >factorial
  78. X                 |   |   >factorial
  79. X                 |   |   <factorial
  80. X                 |   <factorial
  81. X                 2
  82. X                 |   >factorial
  83. X                 |   |   >factorial
  84. X                 |   |   |   >factorial
  85. X                 |   |   |   <factorial
  86. X                 |   |   <factorial
  87. X                 |   <factorial
  88. X                 6
  89. X                 <main
  90. X
  91. X
  92. X                                   Figure 7
  93. X                              factorial -#t:o 3 2
  94. X
  95. X
  96. X
  97. X
  98. X
  99. X            Each entry to or return from a function is indicated by
  100. X       '>'  for  the  entry  point  and  '<'  for  the  exit point,
  101. X       connected by vertical bars to allow matching  points  to  be
  102. X       easily found when separated by large distances.
  103. X
  104. X
  105. X            This trace output indicates that there was  an  initial
  106. X       call  to  factorial from main (to compute 2!), followed by a
  107. X       single recursive call to factorial to compute 1!.  The  main
  108. X       program  then  output  the  result  for  2!  and  called the
  109. X       factorial  function  again  with  the  second  argument,  3.
  110. X       Factorial  called  itself  recursively to compute 2! and 1!,
  111. X       then returned control to main, which output the value for 3!
  112. X       and exited.
  113. X
  114. X
  115. X            Note that there is no matching entry point "main>"  for
  116. X       the  return point "<main" because at the time the DDDDBBBBUUUUGGGG____EEEENNNNTTTTEEEERRRR
  117. X       macro was reached in main, tracing was not enabled yet.   It
  118. X       was  only  after  the  macro  DDDDBBBBUUUUGGGG____PPPPUUUUSSSSHHHH  was  executing that
  119. X       tracing became enabled.  This implies that the argument list
  120. X       should  be  processed  as  early  as possible since all code
  121. X       preceding  the  first  call  to  DDDDBBBBUUUUGGGG____PPPPUUUUSSSSHHHH  is   essentially
  122. X       invisible  to ddddbbbbuuuugggg (this can be worked around by inserting a
  123. X       temporary   DDDDBBBBUUUUGGGG____PPPPUUUUSSSSHHHH((((aaaarrrrggggvvvv[[[[1111]]]]))))   immediately    after    the
  124. X       DDDDBBBBUUUUGGGG____EEEENNNNTTTTEEEERRRR((((""""mmmmaaaaiiiinnnn"""")))) macro.
  125. X
  126. X
  127. X
  128. X
  129. X                                  - 10 -
  130. X
  131. X
  132. X
  133. X
  134. X
  135. X
  136. X
  137. X       DBUG User Manual                            October 29, 1986
  138. X
  139. X
  140. X
  141. X            One last note, the trace output normally comes  out  on
  142. X       the  standard error.  Since the factorial program prints its
  143. X       result on the standard output, there is the  possibility  of
  144. X       the  output  on  the  terminal  being  scrambled  if the two
  145. X       streams are not synchronized.  Thus the debugger is told  to
  146. X       write its output on the standard output instead, via the 'o'
  147. X       flag character.   Note  that  no  'o'  implies  the  default
  148. X       (standard  error),  a  'o'  with no arguments means standard
  149. X       output, and a 'o' with an  argument  means  used  the  named
  150. X       file.   I.E,  "factorial -#t:o,logfile 3 2"  would write the
  151. X       trace output in "logfile".  Because of  UUUUNNNNIIIIXXXX  implementation
  152. X       details,  programs usually run faster when writing to stdout
  153. X       rather than stderr, though this is not a prime consideration
  154. X       in this example.
  155. X
  156. X
  157. X
  158. X
  159. X
  160. X
  161. X
  162. X
  163. X
  164. X
  165. X
  166. X
  167. X
  168. X
  169. X
  170. X
  171. X
  172. X
  173. X
  174. X
  175. X
  176. X
  177. X
  178. X
  179. X
  180. X
  181. X
  182. X
  183. X
  184. X
  185. X
  186. X
  187. X
  188. X
  189. X
  190. X
  191. X
  192. X
  193. X
  194. X
  195. X                                  - 11 -
  196. X
  197. X
  198. X
  199. X
  200. X
  201. X
  202. X
  203. X       DBUG User Manual                            October 29, 1986
  204. X
  205. X
  206. X
  207. X       UUUUSSSSEEEE OOOOFFFF DDDDBBBBUUUUGGGG____PPPPRRRRIIIINNNNTTTT MMMMAAAACCCCRRRROOOO
  208. X
  209. X
  210. X            The mechanism used to produce "printf" style output  is
  211. X       the DDDDBBBBUUUUGGGG____PPPPRRRRIIIINNNNTTTT macro.
  212. X
  213. X
  214. X            To allow selection of output from specific macros,  the
  215. X       first  argument to every DDDDBBBBUUUUGGGG____PPPPRRRRIIIINNNNTTTT macro is a _d_b_u_g keyword.
  216. X       When this keyword appears in the argument list  of  the  'd'
  217. X       flag    in    a    debug    control   string,   as   in   "-
  218. X       #d,keyword1,keyword2,...:t", output from  the  corresponding
  219. X       macro  is enabled.  The default when there is no 'd' flag in
  220. X       the control string is to enable output from  all  DDDDBBBBUUUUGGGG____PPPPRRRRIIIINNNNTTTT
  221. X       macros.
  222. X
  223. X
  224. X            Typically, a program will be run once, with no keywords
  225. X       specified,  to  determine  what keywords are significant for
  226. X       the current problem (the keywords are printed in  the  macro
  227. X       output  line).  Then the program will be run again, with the
  228. X       desired  keywords,  to  examine  only  specific   areas   of
  229. X       interest.
  230. X
  231. X
  232. X            The second argument to a DDDDBBBBUUUUGGGG____PPPPRRRRIIIINNNNTTTT macro is a standard
  233. X       printf  style  format  string  and  one or more arguments to
  234. X       print, all enclosed in parenthesis so that they collectively
  235. X       become  a  single  macro  argument.   This  is  how variable
  236. X       numbers of printf arguments are supported.  Also  note  that
  237. X       no  explicit  newline  is  required at the end of the format
  238. X       string.  As a matter of style, two or three small DDDDBBBBUUUUGGGG____PPPPRRRRIIIINNNNTTTT
  239. X       macros  are  preferable to a single macro with a huge format
  240. X       string.  Figure 8 shows the output for default  tracing  and
  241. X       debug.
  242. X
  243. X
  244. X
  245. X
  246. X
  247. X
  248. X
  249. X
  250. X
  251. X
  252. X
  253. X
  254. X
  255. X
  256. X
  257. X
  258. X
  259. X
  260. X
  261. X                                  - 12 -
  262. X
  263. X
  264. X
  265. X
  266. X
  267. X
  268. X
  269. X       DBUG User Manual                            October 29, 1986
  270. X
  271. X
  272. X
  273. X
  274. X
  275. X                 |   args: argv[2] = 3
  276. X                 |   >factorial
  277. X                 |   |   find: find 3 factorial
  278. X                 |   |   >factorial
  279. X                 |   |   |   find: find 2 factorial
  280. X                 |   |   |   >factorial
  281. X                 |   |   |   |   find: find 1 factorial
  282. X                 |   |   |   |   result: result is 1
  283. X                 |   |   |   <factorial
  284. X                 |   |   |   result: result is 2
  285. X                 |   |   <factorial
  286. X                 |   |   result: result is 6
  287. X                 |   <factorial
  288. X                 6
  289. X                 <main
  290. X
  291. X
  292. X                                   Figure 8
  293. X                              factorial -#d:t:o 3
  294. X
  295. X
  296. X
  297. X
  298. X
  299. X            The output from the DDDDBBBBUUUUGGGG____PPPPRRRRIIIINNNNTTTT  macro  is  indented  to
  300. X       match  the  trace output for the function in which the macro
  301. X       occurs.  When debugging  is  enabled,  but  not  trace,  the
  302. X       output starts at the left margin, without indentation.
  303. X
  304. X
  305. X            To demonstrate selection of specific macros for output,
  306. X       figure  9  shows  the  result  when the factorial program is
  307. X       invoked with the debug control string "-#d,result:o".
  308. X
  309. X
  310. X
  311. X                 factorial: result: result is 1
  312. X                 factorial: result: result is 2
  313. X                 factorial: result: result is 6
  314. X                 factorial: result: result is 24
  315. X                 24
  316. X
  317. X
  318. X                                   Figure 9
  319. X                           factorial -#d,result:o 4
  320. X
  321. X
  322. X
  323. X
  324. X
  325. X
  326. X
  327. X                                  - 13 -
  328. X
  329. X
  330. X
  331. X
  332. X
  333. X
  334. X
  335. X       DBUG User Manual                            October 29, 1986
  336. X
  337. X
  338. X
  339. X            It is sometimes desirable  to  restrict  debugging  and
  340. X       trace  actions  to a specific function or list of functions.
  341. X       This is accomplished with the  'f'  flag  character  in  the
  342. X       debug  control  string.   Figure  10  is  the  output of the
  343. X       factorial program  when  run  with  the  control  string  "-
  344. X       #d:f,factorial:F:L:o".  The 'F' flag enables printing of the
  345. X       source file name and the 'L' flag enables  printing  of  the
  346. X       source file line number.
  347. X
  348. X
  349. X
  350. X                    factorial.c:     9: factorial: find: find 3 factorial
  351. X                    factorial.c:     9: factorial: find: find 2 factorial
  352. X                    factorial.c:     9: factorial: find: find 1 factorial
  353. X                    factorial.c:    13: factorial: result: result is 1
  354. X                    factorial.c:    13: factorial: result: result is 2
  355. X                    factorial.c:    13: factorial: result: result is 6
  356. X                 6
  357. X
  358. X
  359. X                                   Figure 10
  360. X                       factorial -#d:f,factorial:F:L:o 3
  361. X
  362. X
  363. X
  364. X
  365. X
  366. X            The output in figure 10 shows that the "find" macro  is
  367. X       in  file  "factorial.c"  at  source  line 8 and the "result"
  368. X       macro is in the same file at source line 12.
  369. X
  370. X
  371. X
  372. X
  373. X
  374. X
  375. X
  376. X
  377. X
  378. X
  379. X
  380. X
  381. X
  382. X
  383. X
  384. X
  385. X
  386. X
  387. X
  388. X
  389. X
  390. X
  391. X
  392. X
  393. X                                  - 14 -
  394. X
  395. X
  396. X
  397. X
  398. X
  399. X
  400. X
  401. X       DBUG User Manual                            October 29, 1986
  402. X
  403. X
  404. X
  405. X       SSSSUUUUMMMMMMMMAAAARRRRYYYY OOOOFFFF MMMMAAAACCCCRRRROOOOSSSS
  406. X
  407. X
  408. X            This section summarizes  the  usage  of  all  currently
  409. X       defined  macros in the _d_b_u_g package.  The macros definitions
  410. X       are found in the user include file ddddbbbbuuuugggg....hhhh from the  standard
  411. X       include directory.
  412. X
  413. X
  414. X
  415. X               DBUG_ENTER  Used to tell the runtime support  module
  416. X                           the  name of the function being entered.
  417. X                           The argument must be of type "pointer to
  418. X                           character".   The  DBUG_ENTER macro must
  419. X                           precede  all  executable  lines  in  the
  420. X                           function  just  entered,  and  must come
  421. X                           after  all  local  declarations.    Each
  422. X                           DBUG_ENTER  macro  must  have a matching
  423. X                           DBUG_RETURN or DBUG_VOID_RETURN macro at
  424. X                           the  function  exit  points.  DBUG_ENTER
  425. X                           macros   used   without    a    matching
  426. X                           DBUG_RETURN  or  DBUG_VOID_RETURN  macro
  427. X                           will cause  warning  messages  from  the
  428. X                           _d_b_u_g package runtime support module.
  429. X
  430. X                           EX: DBUG_ENTER ("main");
  431. X
  432. X              DBUG_RETURN  Used at each exit point  of  a  function
  433. X                           containing  a  DBUG_ENTER  macro  at the
  434. X                           entry point.  The argument is the  value
  435. X                           to  return.   Functions  which return no
  436. X                           value    (void)    should    use     the
  437. X                           DBUG_VOID_RETURN  macro.  It is an error
  438. X                           to     have     a     DBUG_RETURN     or
  439. X                           DBUG_VOID_RETURN  macro  in  a  function
  440. X                           which has no matching DBUG_ENTER  macro,
  441. X                           and  the  compiler  will complain if the
  442. X                           macros are actually used (expanded).
  443. X
  444. X                           EX: DBUG_RETURN (value);
  445. X                           EX: DBUG_VOID_RETURN;
  446. X
  447. X             DBUG_PROCESS  Used to name the current  process  being
  448. X                           executed.   A  typical argument for this
  449. X                           macro is "argv[0]", though  it  will  be
  450. X                           perfectly happy with any other string.
  451. X
  452. X                           EX: DBUG_PROCESS (argv[0]);
  453. X
  454. X                DBUG_PUSH  Sets a new debugger state by pushing the
  455. X                           current  ddddbbbbuuuugggg  state  onto  an  internal
  456. X
  457. X
  458. X
  459. X                                  - 15 -
  460. X
  461. X
  462. X
  463. X
  464. X
  465. X
  466. X
  467. X       DBUG User Manual                            October 29, 1986
  468. X
  469. X
  470. X
  471. X                           stack and setting up the new state using
  472. X                           the  debug  control string passed as the
  473. X                           macro argument.  The most  common  usage
  474. X                           is to set the state specified by a debug
  475. X                           control  string   retrieved   from   the
  476. X                           argument  list.   Note  that the leading
  477. X                           "-#" in a debug control string specified
  478. X                           as  a  command line argument must nnnnooootttt be
  479. X                           passed as part of  the  macro  argument.
  480. X                           The proper usage is to pass a pointer to
  481. X                           the  first  character  aaaafffftttteeeerrrr  the   "-#"
  482. X                           string.
  483. X
  484. X                           EX: DBUG_PUSH ((argv[i][2]));
  485. X                           EX: DBUG_PUSH ("d:t");
  486. X                           EX: DBUG_PUSH ("");
  487. X
  488. X                 DBUG_POP  Restores the previous debugger state  by
  489. X                           popping  the state stack.  Attempting to
  490. X                           pop more  states  than  pushed  will  be
  491. X                           ignored  and  no  warning will be given.
  492. X                           The DBUG_POP macro has no arguments.
  493. X
  494. X                           EX: DBUG_POP ();
  495. X
  496. X                DBUG_FILE  The  DBUG_FILE  macro  is  used  to   do
  497. X                           explicit I/O on the debug output stream.
  498. X                           It is used in the  same  manner  as  the
  499. X                           symbols  "stdout"  and  "stderr"  in the
  500. X                           standard I/O package.
  501. X
  502. X                           EX: fprintf (DBUG_FILE, "Doing  my   own
  503. X                           I/O!0);
  504. X
  505. X             DBUG_EXECUTE  The  DBUG_EXECUTE  macro  is   used   to
  506. X                           execute any arbitrary C code.  The first
  507. X                           argument is the debug keyword,  used  to
  508. X                           trigger  execution of the code specified
  509. X                           as the second argument.  This macro must
  510. X                           be  used  cautiously  because,  like the
  511. X                           DBUG_PRINT macro,  it  is  automatically
  512. X                           selected  by  default  whenever  the 'd'
  513. X                           flag has no argument list  (I.E.,  a  "-
  514. X                           #d:t" control string).
  515. X
  516. X                           EX: DBUG_EXECUTE ("abort", abort ());
  517. X
  518. X                   DBUG_N  These macros, where N is  in  the  range
  519. X                           2-5,  are currently obsolete and will be
  520. X                           removed in a future  release.   Use  the
  521. X                           new DBUG_PRINT macro.
  522. X
  523. X
  524. X
  525. X                                  - 16 -
  526. X
  527. X
  528. X
  529. X
  530. X
  531. X
  532. X
  533. X       DBUG User Manual                            October 29, 1986
  534. X
  535. X
  536. X
  537. X               DBUG_PRINT  Used to do printing  via  the  "fprintf"
  538. X                           library  function  on  the current debug
  539. X                           stream, DBUG_FILE.  The  first  argument
  540. X                           is  a  debug  keyword,  the  second is a
  541. X                           format  string  and  the   corresponding
  542. X                           argument  list.   Note  that  the format
  543. X                           string and argument  list  are  all  one
  544. X                           macro  argument  and mmmmuuuusssstttt be enclosed in
  545. X                           parenthesis.
  546. X
  547. X                           EX: DBUG_PRINT ("eof", ("end of file found"));
  548. X                           EX: DBUG_PRINT ("type", ("type is %x",
  549. X                           type));
  550. X                           EX: DBUG_PRINT ("stp", ("%x -> %s", stp,
  551. X                           stp -> name));
  552. X
  553. X              DBUG_SETJMP  Used in place of the  setjmp()  function
  554. X                           to first save the current debugger state
  555. X                           and then  execute  the  standard  setjmp
  556. X                           call.   This  allows  to the debugger to
  557. X                           restore it's state when the DBUG_LONGJMP
  558. X                           macro  is  used  to  invoke the standard
  559. X                           longjmp() call.  Currently all instances
  560. X                           of  DBUG_SETJMP  must  occur  within the
  561. X                           same function and at the  same  function
  562. X                           nesting level.
  563. X
  564. X                           EX: DBUG_SETJMP (env);
  565. X
  566. X             DBUG_LONGJMP  Used in place of the longjmp()  function
  567. X                           to  first  restore the previous debugger
  568. X                           state  at   the   time   of   the   last
  569. X                           DBUG_SETJMP   and   then   execute   the
  570. X                           standard  longjmp()  call.   Note   that
  571. X                           currently    all   DBUG_LONGJMP   macros
  572. X                           restore the state at  the  time  of  the
  573. X                           last  DBUG_SETJMP.  It would be possible
  574. X                           to  maintain  separate  DBUG_SETJMP  and
  575. X                           DBUG_LONGJMP   pairs   by   having   the
  576. X                           debugger runtime support module use  the
  577. X                           first   argument  to  differentiate  the
  578. X                           pairs.
  579. X
  580. X                           EX: DBUG_LONGJMP (env,val);
  581. X
  582. X
  583. X
  584. X
  585. X
  586. X
  587. X
  588. X
  589. X
  590. X
  591. X                                  - 17 -
  592. X
  593. X
  594. X
  595. X
  596. X
  597. X
  598. X
  599. X       DBUG User Manual                            October 29, 1986
  600. X
  601. X
  602. X
  603. X       DDDDEEEEBBBBUUUUGGGG CCCCOOOONNNNTTTTRRRROOOOLLLL SSSSTTTTRRRRIIIINNNNGGGG
  604. X
  605. X
  606. X            The debug control string is used to set  the  state  of
  607. X       the   debugger   via  the  DDDDBBBBUUUUGGGG____PPPPUUUUSSSSHHHH  macro.   This  section
  608. X       summarizes the currently available debugger options and  the
  609. X       flag  characters  which  enable  or  disable them.  Argument
  610. X       lists enclosed in '[' and ']' are optional.
  611. X
  612. X
  613. X                d[,keywords] Enable   output   from   macros   with
  614. X                             specified  keywords.   A  null list of
  615. X                             keywords implies that all keywords are
  616. X                             selected.
  617. X
  618. X                    D[,time] Delay for specified  time  after  each
  619. X                             output  line,  to  let  output  drain.
  620. X                             Time is given in tenths  of  a  second
  621. X                             (value  of 10 is one second).  Default
  622. X                             is zero.
  623. X
  624. X               f[,functions] Limit   debugger   actions   to    the
  625. X                             specified  list  of functions.  A null
  626. X                             list of  functions  implies  that  all
  627. X                             functions are selected.
  628. X
  629. X                           F Mark each debugger  output  line  with
  630. X                             the name of the source file containing
  631. X                             the macro causing the output.
  632. X
  633. X                           L Mark each debugger  output  line  with
  634. X                             the  source  file  line  number of the
  635. X                             macro causing the output.
  636. X
  637. X                           n Mark each debugger  output  line  with
  638. X                             the current function nesting depth.
  639. X
  640. X                           N Sequentially  number   each   debugger
  641. X                             output  line  starting  at 1.  This is
  642. X                             useful  for  reference  purposes  when
  643. X                             debugger  output  is interspersed with
  644. X                             program output.
  645. X
  646. X                    o[,file] Redirect the debugger output stream to
  647. X                             the   specified   file.   The  default
  648. X                             output  stream  is  stderr.   A   null
  649. X                             argument  list  causes  output  to  be
  650. X                             redirected to stdout.
  651. X
  652. X               p[,processes] Limit   debugger   actions   to    the
  653. X                             specified   processes.   A  null  list
  654. X
  655. X
  656. X
  657. X                                  - 18 -
  658. X
  659. X
  660. X
  661. X
  662. X
  663. X
  664. X
  665. X       DBUG User Manual                            October 29, 1986
  666. X
  667. X
  668. X
  669. X                             implies all processes.  This is useful
  670. X                             for    processes   which   run   child
  671. X                             processes.  Note  that  each  debugger
  672. X                             output  line  can  be  marked with the
  673. X                             name of the current  process  via  the
  674. X                             'P' flag.  The process name must match
  675. X                             the    argument    passed    to    the
  676. X                             DDDDBBBBUUUUGGGG____PPPPRRRROOOOCCCCEEEESSSSSSSS macro.
  677. X
  678. X                           P Mark each debugger  output  line  with
  679. X                             the name of the current process.  Most
  680. X                             useful when used with a process  which
  681. X                             runs  child  processes  that  are also
  682. X                             being debugged.  Note that the  parent
  683. X                             process  must arrange for the debugger
  684. X                             control string to  be  passed  to  the
  685. X                             child processes.
  686. X
  687. X                           r Used in conjunction with the DDDDBBBBUUUUGGGG____PPPPUUUUSSSSHHHH
  688. X                             macro to reset the current indentation
  689. X                             level back to zero.  Most useful  with
  690. X                             DDDDBBBBUUUUGGGG____PPPPUUUUSSSSHHHH  macros  used to temporarily
  691. X                             alter the debugger state.
  692. X
  693. X                       t[,N] Enable function control flow  tracing.
  694. X                             The maximum nesting depth is specified
  695. X                             by N, and defaults to 200.
  696. X
  697. X
  698. X
  699. X
  700. X
  701. X
  702. X
  703. X
  704. X
  705. X
  706. X
  707. X
  708. X
  709. X
  710. X
  711. X
  712. X
  713. X
  714. X
  715. X
  716. X
  717. X
  718. X
  719. X
  720. X
  721. X
  722. X
  723. X                                  - 19 -
  724. X
  725. X
  726. X
  727. X
  728. X
  729. X
  730. X
  731. X       DBUG User Manual                            October 29, 1986
  732. X
  733. X
  734. X
  735. X       HHHHIIIINNNNTTTTSSSS AAAANNNNDDDD MMMMIIIISSSSCCCCEEEELLLLLLLLAAAANNNNEEEEOOOOUUUUSSSS
  736. X
  737. X
  738. X            One of the most useful capabilities of the _d_b_u_g package
  739. X       is  to  compare  the  executions  of  a given program in two
  740. X       different environments.  This is typically done by executing
  741. X       the program in the environment where it behaves properly and
  742. X       saving the debugger output in a reference file.  The program
  743. X       is  then  run with identical inputs in the environment where
  744. X       it  misbehaves  and  the  output  is  again  captured  in  a
  745. X       reference  file.   The  two  reference  files  can  then  be
  746. X       differentially compared to determine exactly where execution
  747. X       of the two processes diverges.
  748. X
  749. X
  750. X            A  related  usage  is  regression  testing  where   the
  751. X       execution   of   a   current  version  is  compared  against
  752. X       executions of previous versions.  This is most  useful  when
  753. X       there are only minor changes.
  754. X
  755. X
  756. X            It is not difficult to modify an existing  compiler  to
  757. X       implement  some  of  the  functionality  of the _d_b_u_g package
  758. X       automatically, without source code changes  to  the  program
  759. X       being debugged.  In fact, such changes were implemented in a
  760. X       version of the Portable C Compiler by  the  author  in  less
  761. X       than  a  day.   However,  it is strongly encouraged that all
  762. X       newly developed code continue to use the debugger macros for
  763. X       the   portability   reasons  noted  earlier.   The  modified
  764. X       compiler should be used only for testing existing programs.
  765. X
  766. X
  767. X
  768. X
  769. X
  770. X
  771. X
  772. X
  773. X
  774. X
  775. X
  776. X
  777. X
  778. X
  779. X
  780. X
  781. X
  782. X
  783. X
  784. X
  785. X
  786. X
  787. X
  788. X
  789. X                                  - 20 -
  790. X
  791. X
  792. X
  793. X
  794. X
  795. X
  796. X
  797. X       DBUG User Manual                            October 29, 1986
  798. X
  799. X
  800. X
  801. X       CCCCAAAAVVVVEEEEAAAATTTTSSSS
  802. X
  803. X
  804. X            The _d_b_u_g package works best with  programs  which  have
  805. X       "line oriented"  output,  such  as  text processors, general
  806. X       purpose utilities, etc.  It can be  interfaced  with  screen
  807. X       oriented  programs  such as visual editors by redefining the
  808. X       appropriate macros to call special functions for  displaying
  809. X       the  debugger  results.   Of  course,  this  caveat  is  not
  810. X       applicable if the debugger output is simply  dumped  into  a
  811. X       file for post-execution examination.
  812. X
  813. X
  814. X            Programs which use memory  allocation  functions  other
  815. X       than  mmmmaaaalllllllloooocccc  will  usually have problems using the standard
  816. X       _d_b_u_g package.  The most common problem is multiply allocated
  817. X       memory.
  818. X
  819. X
  820. SHAR_EOF
  821. chmod 0650 dmake/dbug/dbug/dbug.p ||
  822. echo 'restore of dmake/dbug/dbug/dbug.p failed'
  823. Wc_c="`wc -c < 'dmake/dbug/dbug/dbug.p'`"
  824. test 42891 -eq "$Wc_c" ||
  825.     echo 'dmake/dbug/dbug/dbug.p: original size 42891, current size' "$Wc_c"
  826. rm -f _shar_wnt_.tmp
  827. fi
  828. # ============= dmake/dbug/getwd.c ==============
  829. if test -f 'dmake/dbug/getwd.c' -a X"$1" != X"-c"; then
  830.     echo 'x - skipping dmake/dbug/getwd.c (File already exists)'
  831.     rm -f _shar_wnt_.tmp
  832. else
  833. > _shar_wnt_.tmp
  834. sed 's/^X//' << 'SHAR_EOF' > 'dmake/dbug/getwd.c' &&
  835. char *
  836. getwd(pathname)
  837. char *pathname;
  838. {
  839. X   return("delete this code if your getwd.c works correctly");
  840. }
  841. SHAR_EOF
  842. chmod 0640 dmake/dbug/getwd.c ||
  843. echo 'restore of dmake/dbug/getwd.c failed'
  844. Wc_c="`wc -c < 'dmake/dbug/getwd.c'`"
  845. test 106 -eq "$Wc_c" ||
  846.     echo 'dmake/dbug/getwd.c: original size 106, current size' "$Wc_c"
  847. rm -f _shar_wnt_.tmp
  848. fi
  849. # ============= dmake/dbug/malloc/Makefile ==============
  850. if test ! -d 'dmake/dbug/malloc'; then
  851.     mkdir 'dmake/dbug/malloc'
  852. fi
  853. if test -f 'dmake/dbug/malloc/Makefile' -a X"$1" != X"-c"; then
  854.     echo 'x - skipping dmake/dbug/malloc/Makefile (File already exists)'
  855.     rm -f _shar_wnt_.tmp
  856. else
  857. > _shar_wnt_.tmp
  858. sed 's/^X//' << 'SHAR_EOF' > 'dmake/dbug/malloc/Makefile' &&
  859. #
  860. # (c) Copyright 1990 Conor P. Cahill (uunet!virtech!cpcahil).  
  861. # You may copy, distribute, and use this software as long as this
  862. # copyright statement is not removed.
  863. #
  864. #
  865. # This is the Makefile for the malloc debugging library
  866. #
  867. # $Id: Makefile,v 1.5 90/08/29 22:34:27 cpcahil Exp $
  868. #
  869. CC=cc
  870. # for System V systems use this CFLAGS
  871. #CFLAGS=-g -DSYS5
  872. # else for BSD use:
  873. #CFLAGS=-g
  874. LINT=lint
  875. SHARCMD=shar -o mallocshar -l50 -x -a -n Malloclib
  876. SHELL=/bin/sh
  877. X
  878. LIB=libmalloc.a
  879. X
  880. SRCS=    malloc.c    \
  881. X    free.c        \
  882. X    realloc.c    \
  883. X    calloc.c    \
  884. X    string.c    \
  885. X    mlc_chk.c    \
  886. X    mlc_chn.c    \
  887. X    memory.c    \
  888. X    tostring.c    \
  889. X    m_perror.c    \
  890. X    m_init.c    \
  891. X    mallopt.c    \
  892. X    dump.c
  893. X
  894. OBJS=    malloc.o    \
  895. X    free.o        \
  896. X    realloc.o    \
  897. X    calloc.o    \
  898. X    string.o    \
  899. X    mlc_chk.o    \
  900. X    mlc_chn.o    \
  901. X    memory.o    \
  902. X    tostring.o    \
  903. X    m_perror.o    \
  904. X    m_init.o    \
  905. X    mallopt.o    \
  906. X    dump.o
  907. X
  908. TESTS=testmlc testmem
  909. X
  910. all:    $(LIB) $(TESTS)
  911. X
  912. clean:  
  913. X    rm -f $(TESTS) pgm $(LIB) *.o *.ln
  914. X
  915. sharfile:
  916. X    $(SHARCMD) Makefile README patchlevel *.[ch3] 
  917. X    
  918. $(LIB): $(OBJS)
  919. X    ar ru $(LIB) $(OBJS)
  920. X    -if test -s /bin/ranlib; then /bin/ranlib $(LIB); else exit 0; fi
  921. X    -if test -s /usr/bin/ranlib; then /usr/bin/ranlib $(LIB); else exit 0; fi
  922. X
  923. testmlc:    $(LIB) testmlc.o
  924. X    $(CC) -o $@ testmlc.o $(LIB)
  925. X
  926. testmem:    $(LIB) testmem.o
  927. X    $(CC) -o $@ testmem.o $(LIB)
  928. X
  929. lint:    
  930. X    $(LINT) $(CFLAGS) $(SRCS) testmlc.c testmem.c
  931. X
  932. X
  933. $(OBJS):    malloc.h
  934. X
  935. tostring.o malloc.o dump.o:    tostring.h
  936. SHAR_EOF
  937. chmod 0640 dmake/dbug/malloc/Makefile ||
  938. echo 'restore of dmake/dbug/malloc/Makefile failed'
  939. Wc_c="`wc -c < 'dmake/dbug/malloc/Makefile'`"
  940. test 1365 -eq "$Wc_c" ||
  941.     echo 'dmake/dbug/malloc/Makefile: original size 1365, current size' "$Wc_c"
  942. rm -f _shar_wnt_.tmp
  943. fi
  944. # ============= dmake/dbug/malloc/_changes ==============
  945. if test -f 'dmake/dbug/malloc/_changes' -a X"$1" != X"-c"; then
  946.     echo 'x - skipping dmake/dbug/malloc/_changes (File already exists)'
  947.     rm -f _shar_wnt_.tmp
  948. else
  949. > _shar_wnt_.tmp
  950. sed 's/^X//' << 'SHAR_EOF' > 'dmake/dbug/malloc/_changes' &&
  951. I made the following changes to the malloc package as found in
  952. comp.sources.unix:
  953. X
  954. X    1. created this file _changes.
  955. X    2. moved README to _readme (facilitates transfer to DOS and back to
  956. X       unix)
  957. X    3. renamed testmalloc.c, malloc_chk.c, and malloc_chn.c to testmlc.c,
  958. X       mlc_chk.c, and mlc_chn.c respectively.  Again DOS has trouble with
  959. X       long basenames in filenames.
  960. SHAR_EOF
  961. chmod 0640 dmake/dbug/malloc/_changes ||
  962. echo 'restore of dmake/dbug/malloc/_changes failed'
  963. Wc_c="`wc -c < 'dmake/dbug/malloc/_changes'`"
  964. test 369 -eq "$Wc_c" ||
  965.     echo 'dmake/dbug/malloc/_changes: original size 369, current size' "$Wc_c"
  966. rm -f _shar_wnt_.tmp
  967. fi
  968. # ============= dmake/dbug/malloc/_readme ==============
  969. if test -f 'dmake/dbug/malloc/_readme' -a X"$1" != X"-c"; then
  970.     echo 'x - skipping dmake/dbug/malloc/_readme (File already exists)'
  971.     rm -f _shar_wnt_.tmp
  972. else
  973. > _shar_wnt_.tmp
  974. sed 's/^X//' << 'SHAR_EOF' > 'dmake/dbug/malloc/_readme' &&
  975. # (c) Copyright 1990 Conor P. Cahill. (uunet!virtech!cpcahil) 
  976. # You may copy, distribute, and use this software as long as this
  977. # copyright statement is not removed.
  978. X
  979. This package is a collection of routines which are a drop-in replacement
  980. for the malloc(3), memory(3), string(3), and bstring(3) library functions.
  981. X
  982. The purpose of these programs is to aid the development and/or debugging
  983. of programs using these functions by providing a high level of consistancy
  984. checking whenever a malloc pointer is used.  Due to this increased 
  985. level of consistancy checking, these functions have a considerably larger
  986. overhead than the standard functions, but the extra checking should be
  987. well worth it in a development environment.
  988. X
  989. To use these functions all you need to do is compile the library and
  990. include it on your loader command line.  You do not need to recompile
  991. your code, only a relink is necessary.  
  992. X
  993. Features of this library:
  994. X
  995. X 1. The malloced area returned from each call to malloc is filled with
  996. X    non-null bytes.  This should catch any use of uninitialized malloc
  997. X    area.  The fill pattern for malloced area is 0x01.
  998. X
  999. X 2. When free is called numerous validity checks are made on the 
  1000. X    pointer it is passed.  In addition, the data in the malloc block
  1001. X    beyound the size requested on the initial malloc is checked to 
  1002. X    verify that it is still filled with the original fill characters.
  1003. X
  1004. X    This is usefull for catching things like:
  1005. X
  1006. X        ptr = malloc(5);
  1007. X        ptr[5] = '\0';
  1008. X
  1009. X        /*
  1010. X         * You should not that this will be caught when it is
  1011. X         * freed not when it is done
  1012. X         */
  1013. X
  1014. X    And finally, the freed block is filled with a different fill pattern
  1015. X    so that you can easily determine if you are still using free'd space.
  1016. X    The fill pattern for free'd areas is 0x02.
  1017. X
  1018. X    This is usefull for catching things like:
  1019. X
  1020. X        ptr = malloc(20);
  1021. X
  1022. X        bptr = ptr+10;
  1023. X
  1024. X        /* do something usefule with bptr */
  1025. X
  1026. X        free(ptr);
  1027. X
  1028. X        /* 
  1029. X         * now try to do something useful with bptr, it should
  1030. X         * be trashed enough that it would cause real problems
  1031. X         * and when you went to debug the problem it would be
  1032. X         * filled with 0x02's and you would then know to look 
  1033. X         * for something free'ing what bptr points to.
  1034. X         */
  1035. X        
  1036. X
  1037. X 3. Whenever a bstring(3)/string(3)/memory(3) function is called, it's 
  1038. X    parameters are checked as follows:
  1039. X
  1040. X    If they point somewhere in the malloc arena
  1041. X        If the operation goes beyond requested malloc space
  1042. X            call malloc_warning()
  1043. X
  1044. X    This is usefull for catching things like:
  1045. X
  1046. X        ptr = malloc(5);
  1047. X        strcpy(ptr,"abcde");
  1048. X            
  1049. X    
  1050. X 4. Malloc_warning() and malloc_fatal() are used when an error condition
  1051. X    is detected.  If the error is severe, malloc_fatal is called.  
  1052. X    Malloc_warning is used otherwise.  The decision about what is fatal
  1053. X    and what is a warning was made somewhat arbitrarily.
  1054. X
  1055. X    Warning messages include:
  1056. X
  1057. X    Calling free with a bad pointer
  1058. X        Calling a bstring/string/memory (3) function which will go beyond
  1059. X        the end of a malloc block (Note that the library function is
  1060. X            not modified to refuse the operation.  If malloc warnings are
  1061. X        in the default IGNORE case, the operation will continue and 
  1062. X        at some point cause a real problem).
  1063. X
  1064. X    Fatal errors are:
  1065. X
  1066. X    Detectable corruption to the malloc chain.
  1067. X    
  1068. X
  1069. X 5. The operations to perform when an error is detected are specified at
  1070. X    run time by the use of environment variables.
  1071. X
  1072. X    MALLOC_WARN - specifies the warning error message handling
  1073. X    MALLOC_FATAL - specifies the fatal error handling
  1074. X
  1075. X
  1076. X    When one of these error conditions occur you will get an error
  1077. X    message and the handler will execute based upon what setting
  1078. X    is in the environment variables.  Currently understood settings
  1079. X    are as follows:
  1080. X
  1081. X          0 - continue operations
  1082. X          1 - drop core and exit
  1083. X          2 - just exit
  1084. X          3 - drop core, but continue executing.  Core files will
  1085. X             be placed into core.[PID].[counter] i.e: core.00123.001
  1086. X        128 - dump malloc chain and continue
  1087. X        129 - dump malloc chain, dump core, and exit
  1088. X        130 - dump malloc chain, exit
  1089. X        131 - dump malloc chain, dump core, continue processing
  1090. X        
  1091. X
  1092. X    There is an additional environment variable MALLOC_ERRFILE which
  1093. X    is used to indicate the name of the file for error message output.
  1094. X
  1095. X    For example, to set up the session to generate a core file for
  1096. X    every malloc warning, to drop core and exit on a malloc fatal, and 
  1097. X    to log all messages to the file "malloc_log" do the following:
  1098. X
  1099. X        MALLOC_WARN=131
  1100. X        MALLOC_FATAL=1
  1101. X        MALLOC_ERRFILE=malloc_log
  1102. X
  1103. X        export MALLOC_WARN MALLOC_FATAL MALLOC_ERRFILE
  1104. X
  1105. X 6. The function malloc_dump() is available to dump the malloc chain whenever
  1106. X    you might want.  It's only argument is a file descriptor to use to write
  1107. X    the data.  Review the code if you need to know what data is printed.
  1108. SHAR_EOF
  1109. chmod 0640 dmake/dbug/malloc/_readme ||
  1110. echo 'restore of dmake/dbug/malloc/_readme failed'
  1111. Wc_c="`wc -c < 'dmake/dbug/malloc/_readme'`"
  1112. test 4758 -eq "$Wc_c" ||
  1113.     echo 'dmake/dbug/malloc/_readme: original size 4758, current size' "$Wc_c"
  1114. rm -f _shar_wnt_.tmp
  1115. fi
  1116. # ============= dmake/dbug/malloc/calloc.c ==============
  1117. if test -f 'dmake/dbug/malloc/calloc.c' -a X"$1" != X"-c"; then
  1118.     echo 'x - skipping dmake/dbug/malloc/calloc.c (File already exists)'
  1119.     rm -f _shar_wnt_.tmp
  1120. else
  1121. > _shar_wnt_.tmp
  1122. sed 's/^X//' << 'SHAR_EOF' > 'dmake/dbug/malloc/calloc.c' &&
  1123. /*
  1124. X * (c) Copyright 1990 Conor P. Cahill (uunet!virtech!cpcahil).  
  1125. X * You may copy, distribute, and use this software as long as this
  1126. X * copyright statement is not removed.
  1127. X */
  1128. #include <stdio.h>
  1129. X
  1130. /*
  1131. X * Function:    calloc()
  1132. X *
  1133. X * Purpose:    to allocate and nullify a data area
  1134. X *
  1135. X * Arguments:    nelem    - number of elements
  1136. X *        elsize    - size of each element
  1137. X *
  1138. X * Returns:    NULL    - if malloc fails
  1139. X *        or pointer to allocated space
  1140. X *
  1141. X * Narrative:    determine size of area to malloc
  1142. X *        malloc area.
  1143. X *        if malloc succeeds
  1144. X *            fill area with nulls
  1145. X *        return ptr to malloc'd region
  1146. X */
  1147. #ifndef lint
  1148. static char rcs_header[] = "$Id: calloc.c,v 1.6 90/05/11 00:13:07 cpcahil Exp $";
  1149. #endif
  1150. X
  1151. char *
  1152. calloc(nelem,elsize)
  1153. X    unsigned int       nelem;
  1154. X    unsigned int       elsize;
  1155. {
  1156. X    char        * malloc();
  1157. X    char        * memset();
  1158. X    char        * ptr;
  1159. X    unsigned int      size;
  1160. X
  1161. X    size = elsize * nelem;
  1162. X
  1163. X    if( (ptr = malloc(size)) != NULL)
  1164. X    {
  1165. X        (void) memset(ptr,'\0',(int)size);
  1166. X    }
  1167. X
  1168. X    return(ptr);
  1169. }
  1170. X
  1171. X
  1172. /*
  1173. X * $Log:    calloc.c,v $
  1174. X * Revision 1.6  90/05/11  00:13:07  cpcahil
  1175. X * added copyright statment
  1176. X * 
  1177. X * Revision 1.5  90/02/24  20:41:57  cpcahil
  1178. X * lint changes.
  1179. X * 
  1180. X * Revision 1.4  90/02/24  17:25:47  cpcahil
  1181. X * changed $header to $id so full path isn't included.
  1182. X * 
  1183. X * Revision 1.3  90/02/24  13:32:24  cpcahil
  1184. X * added function header.  moved log to end of file.
  1185. X * 
  1186. X * Revision 1.2  90/02/22  23:08:26  cpcahil
  1187. X * fixed rcs_header line
  1188. X * 
  1189. X * Revision 1.1  90/02/22  23:07:38  cpcahil
  1190. X * Initial revision
  1191. X * 
  1192. X */
  1193. SHAR_EOF
  1194. chmod 0640 dmake/dbug/malloc/calloc.c ||
  1195. echo 'restore of dmake/dbug/malloc/calloc.c failed'
  1196. Wc_c="`wc -c < 'dmake/dbug/malloc/calloc.c'`"
  1197. test 1481 -eq "$Wc_c" ||
  1198.     echo 'dmake/dbug/malloc/calloc.c: original size 1481, current size' "$Wc_c"
  1199. rm -f _shar_wnt_.tmp
  1200. fi
  1201. # ============= dmake/dbug/malloc/debug.h ==============
  1202. if test -f 'dmake/dbug/malloc/debug.h' -a X"$1" != X"-c"; then
  1203.     echo 'x - skipping dmake/dbug/malloc/debug.h (File already exists)'
  1204.     rm -f _shar_wnt_.tmp
  1205. else
  1206. > _shar_wnt_.tmp
  1207. sed 's/^X//' << 'SHAR_EOF' > 'dmake/dbug/malloc/debug.h' &&
  1208. /*
  1209. X * (c) Copyright 1990 Conor P. Cahill (uunet!virtech!cpcahil).  
  1210. X * You may copy, distribute, and use this software as long as this
  1211. X * copyright statement is not removed.
  1212. X */
  1213. /************************************************************************/
  1214. /*                                    */
  1215. /* this include sets up some macro functions which can be used while    */
  1216. /* debugging the program, and then left in the code, but turned of by    */
  1217. /* just not defining "DEBUG".  This way your production version of     */
  1218. /* the program will not be filled with bunches of debugging junk    */
  1219. /*                                    */
  1220. /************************************************************************/
  1221. /*
  1222. X * $Id: debug.h,v 1.2 90/05/11 00:13:08 cpcahil Exp $
  1223. X */
  1224. X
  1225. #ifdef DEBUG
  1226. X
  1227. #if DEBUG == 1            /* if default level            */
  1228. #undef DEBUG
  1229. #define DEBUG    100        /*   use level 100            */
  1230. #endif
  1231. X
  1232. #include <stdio.h>
  1233. X
  1234. #define DEBUG0(val,str)\
  1235. X                {\
  1236. X                  if( DEBUG > val ) \
  1237. X                    fprintf(stderr,"%s(%d): %s\n",\
  1238. X                        __FILE__,__LINE__,str);\
  1239. X                }
  1240. #define DEBUG1(val,str,a1)\
  1241. X                    {\
  1242. X                  char _debugbuf[100];\
  1243. X                  if( DEBUG > val )\
  1244. X                   {\
  1245. X                    sprintf(_debugbuf,str,a1);\
  1246. X                    fprintf(stderr,"%s(%d): %s\n",\
  1247. X                        __FILE__,__LINE__,_debugbuf);\
  1248. X                   }\
  1249. X                       }
  1250. X
  1251. #define DEBUG2(val,str,a1,a2)\
  1252. X                    {\
  1253. X                 char _debugbuf[100];\
  1254. X                  if( DEBUG > val )\
  1255. X                   {\
  1256. X                    sprintf(_debugbuf,str,a1,a2);\
  1257. X                    fprintf(stderr,"%s(%d): %s\n",\
  1258. X                        __FILE__,__LINE__,_debugbuf);\
  1259. X                   }\
  1260. X                       }
  1261. X
  1262. #define DEBUG3(val,str,a1,a2,a3)\
  1263. X                    {\
  1264. X                  char _debugbuf[100];\
  1265. X                  if( DEBUG > val )\
  1266. X                   {\
  1267. X                    sprintf(_debugbuf,str,a1,a2,a3);\
  1268. X                    fprintf(stderr,"%s(%d): %s\n",\
  1269. X                        __FILE__,__LINE__,_debugbuf);\
  1270. X                   }\
  1271. X                       }
  1272. X
  1273. #define DEBUG4(val,str,a1,a2,a3,a4)\
  1274. X                     {\
  1275. X                  char _debugbuf[100];\
  1276. X                  if( DEBUG > val )\
  1277. X                   {\
  1278. X                    sprintf(_debugbuf,str,a1,a2,a3,a4);\
  1279. X                    fprintf(stderr,"%s(%d): %s\n",\
  1280. X                        __FILE__,__LINE__,_debugbuf);\
  1281. X                   }\
  1282. X                       }
  1283. X
  1284. #define DEBUG5(val,str,a1,a2,a3,a4,a5)\
  1285. X                     {\
  1286. X                  char _debugbuf[100];\
  1287. X                  if( DEBUG > val )\
  1288. X                   {\
  1289. X                    sprintf(_debugbuf,str,a1,a2,a3,a4,a5);\
  1290. X                    fprintf(stderr,"%s(%d): %s\n",\
  1291. X                        __FILE__,__LINE__,_debugbuf);\
  1292. X                   }\
  1293. X                       }
  1294. X
  1295. #else
  1296. SHAR_EOF
  1297. true || echo 'restore of dmake/dbug/malloc/debug.h failed'
  1298. fi
  1299. echo 'End of part 4, continue with part 5'
  1300. echo 5 > _shar_seq_.tmp
  1301. exit 0
  1302.  
  1303. exit 0 # Just in case...
  1304. -- 
  1305. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1306. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1307. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1308. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1309.