home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume15 / dmake-3.6 / part24 < prev    next >
Text File  |  1990-10-14  |  40KB  |  1,621 lines

  1. Newsgroups: comp.sources.misc
  2. X-UNIX-From: dvadura@watdragon.waterloo.edu
  3. subject: v15i076: dmake version 3.6 (part 24/25)
  4. from: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  5. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  6.  
  7. Posting-number: Volume 15, Issue 76
  8. Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  9. Archive-name: dmake-3.6/part24
  10.  
  11. #!/bin/sh
  12. # this is part 24 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file common/dbug.c continued
  15. #
  16. CurArch=24
  17. if test ! -r s2_seq_.tmp
  18. then echo "Please unpack part 1 first!"
  19.      exit 1; fi
  20. ( read Scheck
  21.   if test "$Scheck" != $CurArch
  22.   then echo "Please unpack part $Scheck next!"
  23.        exit 1;
  24.   else exit 0; fi
  25. ) < s2_seq_.tmp || exit 1
  26. echo "x - Continuing file common/dbug.c"
  27. sed 's/^X//' << 'SHAR_EOF' >> common/dbug.c
  28. X    if (discard != NULL && discard -> next_state != NULL) {
  29. X    stack = discard -> next_state;
  30. X    _db_fp_ = stack -> out_file;
  31. X    _db_pfp_ = stack -> prof_file;
  32. X    if (discard -> keywords != NULL) {
  33. X        FreeList (discard -> keywords);
  34. X    }
  35. X    if (discard -> functions != NULL) {
  36. X        FreeList (discard -> functions);
  37. X    }
  38. X    if (discard -> processes != NULL) {
  39. X        FreeList (discard -> processes);
  40. X    }
  41. X    if (discard -> p_functions != NULL) {
  42. X        FreeList (discard -> p_functions);
  43. X    }
  44. X    CloseFile (discard -> out_file);
  45. X    CloseFile (discard -> prof_file);
  46. X    free ((char *) discard);
  47. X    }
  48. X}
  49. X
  50. X
  51. X/*
  52. X *  FUNCTION
  53. X *
  54. X *    _db_enter_    process entry point to user function
  55. X *
  56. X *  SYNOPSIS
  57. X *
  58. X *    VOID _db_enter_ (_func_, _file_, _line_, _sfunc_, _sfile_, _slevel_)
  59. X *    char *_func_;        points to current function name
  60. X *    char *_file_;        points to current file name
  61. X *    int _line_;        called from source line number
  62. X *    char **_sfunc_;        save previous _func_
  63. X *    char **_sfile_;        save previous _file_
  64. X *    int *_slevel_;        save previous nesting level
  65. X *
  66. X *  DESCRIPTION
  67. X *
  68. X *    Called at the beginning of each user function to tell
  69. X *    the debugger that a new function has been entered.
  70. X *    Note that the pointers to the previous user function
  71. X *    name and previous user file name are stored on the
  72. X *    caller's stack (this is why the ENTER macro must be
  73. X *    the first "executable" code in a function, since it
  74. X *    allocates these storage locations).  The previous nesting
  75. X *    level is also stored on the callers stack for internal
  76. X *    self consistency checks.
  77. X *
  78. X *    Also prints a trace line if tracing is enabled and
  79. X *    increments the current function nesting depth.
  80. X *
  81. X *    Note that this mechanism allows the debugger to know
  82. X *    what the current user function is at all times, without
  83. X *    maintaining an internal stack for the function names.
  84. X *
  85. X */
  86. X
  87. XVOID _db_enter_ (_func_, _file_, _line_, _sfunc_, _sfile_, _slevel_)
  88. Xchar *_func_;
  89. Xchar *_file_;
  90. Xint _line_;
  91. Xchar **_sfunc_;
  92. Xchar **_sfile_;
  93. Xint *_slevel_;
  94. X{
  95. X    if (!init_done) {
  96. X    _db_push_ ("");
  97. X    }
  98. X    *_sfunc_ = func;
  99. X    *_sfile_ = file;
  100. X    func = _func_;
  101. X    file = BaseName (_file_);
  102. X    stack -> level++;
  103. X    *_slevel_ = stack -> level;
  104. X    if (DoProfile ()) {
  105. X    (VOID) fprintf (_db_pfp_, "%s\tE\t%ld\n",func, Clock());
  106. X    (VOID) fflush (_db_pfp_);
  107. X    }
  108. X    if (DoTrace ()) {
  109. X    DoPrefix (_line_);
  110. X    Indent (stack -> level);
  111. X    (VOID) fprintf (_db_fp_, ">%s\n", func);
  112. X    (VOID) fflush (_db_fp_);
  113. X    (VOID) XDelay (stack -> delay);
  114. X    }
  115. X}
  116. X
  117. X
  118. X/*
  119. X *  FUNCTION
  120. X *
  121. X *    _db_return_    process exit from user function
  122. X *
  123. X *  SYNOPSIS
  124. X *
  125. X *    VOID _db_return_ (_line_, _sfunc_, _sfile_, _slevel_)
  126. X *    int _line_;        current source line number
  127. X *    char **_sfunc_;        where previous _func_ is to be retrieved
  128. X *    char **_sfile_;        where previous _file_ is to be retrieved
  129. X *    int *_slevel_;        where previous level was stashed
  130. X *
  131. X *  DESCRIPTION
  132. X *
  133. X *    Called just before user function executes an explicit or implicit
  134. X *    return.  Prints a trace line if trace is enabled, decrements
  135. X *    the current nesting level, and restores the current function and
  136. X *    file names from the defunct function's stack.
  137. X *
  138. X */
  139. X
  140. XVOID _db_return_ (_line_, _sfunc_, _sfile_, _slevel_)
  141. Xint _line_;
  142. Xchar **_sfunc_;
  143. Xchar **_sfile_;
  144. Xint *_slevel_;
  145. X{
  146. X    if (!init_done) {
  147. X    _db_push_ ("");
  148. X    }
  149. X    if (stack -> level != *_slevel_ && (TRACING || DEBUGGING || PROFILING)) {
  150. X    (VOID) fprintf (_db_fp_, ERR_MISSING_RETURN, _db_process_, func);
  151. X        (VOID) XDelay (stack -> delay);
  152. X    } else if (DoProfile ()) {
  153. X    (VOID) fprintf (_db_pfp_, "%s\tX\t%ld\n", func, Clock());
  154. X        (VOID) XDelay (stack -> delay);
  155. X    } else if (DoTrace ()) {
  156. X    DoPrefix (_line_);
  157. X    Indent (stack -> level);
  158. X    (VOID) fprintf (_db_fp_, "<%s\n", func);
  159. X        (VOID) XDelay (stack -> delay);
  160. X    }
  161. X    (VOID) fflush (_db_fp_);
  162. X    stack -> level = *_slevel_ - 1;
  163. X    func = *_sfunc_;
  164. X    file = *_sfile_;
  165. X}
  166. X
  167. X
  168. X/*
  169. X *  FUNCTION
  170. X *
  171. X *    _db_pargs_    log arguments for subsequent use by _db_doprnt_()
  172. X *
  173. X *  SYNOPSIS
  174. X *
  175. X *    VOID _db_pargs_ (_line_, keyword)
  176. X *    int _line_;
  177. X *    char *keyword;
  178. X *
  179. X *  DESCRIPTION
  180. X *
  181. X *    The new universal printing macro DBUG_PRINT, which replaces
  182. X *    all forms of the DBUG_N macros, needs two calls to runtime
  183. X *    support routines.  The first, this function, remembers arguments
  184. X *    that are used by the subsequent call to _db_doprnt_().
  185. X*
  186. X */
  187. X
  188. XVOID _db_pargs_ (_line_, keyword)
  189. Xint _line_;
  190. Xchar *keyword;
  191. X{
  192. X    u_line = _line_;
  193. X    u_keyword = keyword;
  194. X}
  195. X
  196. X
  197. X/*
  198. X *  FUNCTION
  199. X *
  200. X *    _db_doprnt_    handle print of debug lines
  201. X *
  202. X *  SYNOPSIS
  203. X *
  204. X *    VOID _db_doprnt_ (format, ARGLIST)
  205. X *    char *format;
  206. X *    long ARGLIST;
  207. X *
  208. X *  DESCRIPTION
  209. X *
  210. X *    When invoked via one of the DBUG macros, tests the current keyword
  211. X *    set by calling _db_pargs_() to see if that macro has been selected
  212. X *    for processing via the debugger control string, and if so, handles
  213. X *    printing of the arguments via the format string.  The line number
  214. X *    of the DBUG macro in the source is found in u_line.
  215. X *
  216. X *    Note that the format string SHOULD NOT include a terminating
  217. X *    newline, this is supplied automatically.
  218. X *
  219. X *  NOTES
  220. X *
  221. X *    This runtime support routine replaces the older _db_printf_()
  222. X *    routine which is temporarily kept around for compatibility.
  223. X *
  224. X *    The rather ugly argument declaration is to handle some
  225. X *    magic with respect to the number of arguments passed
  226. X *    via the DBUG macros.  The current maximum is 3 arguments
  227. X *    (not including the keyword and format strings).
  228. X *
  229. X *    The new <varargs.h> facility is not yet common enough to
  230. X *    convert to it quite yet...
  231. X *
  232. X */
  233. X
  234. X/*VARARGS1*/
  235. XVOID _db_doprnt_ (format, ARGLIST)
  236. Xchar *format;
  237. Xlong ARGLIST;
  238. X{
  239. X    if (_db_keyword_ (u_keyword)) {
  240. X    DoPrefix (u_line);
  241. X    if (TRACING) {
  242. X        Indent (stack -> level + 1);
  243. X    } else {
  244. X        (VOID) fprintf (_db_fp_, "%s: ", func);
  245. X    }
  246. X    (VOID) fprintf (_db_fp_, "%s: ", u_keyword);
  247. X    (VOID) fprintf (_db_fp_, format, ARGLIST);
  248. X    (VOID) fprintf (_db_fp_, "\n");
  249. X    (VOID) fflush (_db_fp_);
  250. X    (VOID) XDelay (stack -> delay);
  251. X    }
  252. X}
  253. X
  254. X/*
  255. X *    The following routine is kept around temporarily for compatibility
  256. X *    with older objects that were compiled with the DBUG_N macro form
  257. X *    of the print routine.  It will print a warning message on first
  258. X *    usage.  It will go away in subsequent releases...
  259. X */
  260. X
  261. X/*VARARGS3*/
  262. XVOID _db_printf_ (_line_, keyword, format, ARGLIST)
  263. Xint _line_;
  264. Xchar *keyword,  *format;
  265. Xlong ARGLIST;
  266. X{
  267. X    static BOOLEAN firsttime = TRUE;
  268. X
  269. X    if (firsttime) {
  270. X    (VOID) fprintf (stderr, ERR_PRINTF, _db_process_, file);
  271. X    firsttime = FALSE;
  272. X    }
  273. X    _db_pargs_ (_line_, keyword);
  274. X    _db_doprnt_ (format, ARGLIST);
  275. X}
  276. X
  277. X
  278. X/*
  279. X *  FUNCTION
  280. X *
  281. X *    ListParse    parse list of modifiers in debug control string
  282. X *
  283. X *  SYNOPSIS
  284. X *
  285. X *    LOCAL struct link *ListParse (ctlp)
  286. X *    char *ctlp;
  287. X *
  288. X *  DESCRIPTION
  289. X *
  290. X *    Given pointer to a comma separated list of strings in "cltp",
  291. X *    parses the list, building a list and returning a pointer to it.
  292. X *    The original comma separated list is destroyed in the process of
  293. X *    building the linked list, thus it had better be a duplicate
  294. X *    if it is important.
  295. X *
  296. X *    Note that since each link is added at the head of the list,
  297. X *    the final list will be in "reverse order", which is not
  298. X *    significant for our usage here.
  299. X *
  300. X */
  301. X
  302. XLOCAL struct link *ListParse (ctlp)
  303. Xchar *ctlp;
  304. X{
  305. X    REGISTER char *start;
  306. X    REGISTER struct link *new;
  307. X    REGISTER struct link *head;
  308. X
  309. X    head = NULL;
  310. X    while (*ctlp != EOS) {
  311. X    start = ctlp;
  312. X    while (*ctlp != EOS && *ctlp != ',') {
  313. X        ctlp++;
  314. X    }
  315. X    if (*ctlp == ',') {
  316. X        *ctlp++ = EOS;
  317. X    }
  318. X    new = (struct link *) DbugMalloc (sizeof (struct link));
  319. X    new -> string = StrDup (start);
  320. X    new -> next_link = head;
  321. X    head = new;
  322. X    }
  323. X    return (head);
  324. X}
  325. X
  326. X
  327. X/*
  328. X *  FUNCTION
  329. X *
  330. X *    InList    test a given string for member of a given list
  331. X *
  332. X *  SYNOPSIS
  333. X *
  334. X *    LOCAL BOOLEAN InList (linkp, cp)
  335. X *    struct link *linkp;
  336. X *    char *cp;
  337. X *
  338. X *  DESCRIPTION
  339. X *
  340. X *    Tests the string pointed to by "cp" to determine if it is in
  341. X *    the list pointed to by "linkp".  Linkp points to the first
  342. X *    link in the list.  If linkp is NULL then the string is treated
  343. X *    as if it is in the list (I.E all strings are in the null list).
  344. X *    This may seem rather strange at first but leads to the desired
  345. X *    operation if no list is given.  The net effect is that all
  346. X *    strings will be accepted when there is no list, and when there
  347. X *    is a list, only those strings in the list will be accepted.
  348. X *
  349. X */
  350. X
  351. XLOCAL BOOLEAN InList (linkp, cp)
  352. Xstruct link *linkp;
  353. Xchar *cp;
  354. X{
  355. X    REGISTER struct link *scan;
  356. X    REGISTER BOOLEAN accept;
  357. X
  358. X    if (linkp == NULL) {
  359. X    accept = TRUE;
  360. X    } else {
  361. X    accept = FALSE;
  362. X    for (scan = linkp; scan != NULL; scan = scan -> next_link) {
  363. X        if (STREQ (scan -> string, cp)) {
  364. X        accept = TRUE;
  365. X        break;
  366. X        }
  367. X    }
  368. X    }
  369. X    return (accept);
  370. X}
  371. X
  372. X
  373. X/*
  374. X *  FUNCTION
  375. X *
  376. X *    PushState    push current state onto stack and set up new one
  377. X *
  378. X *  SYNOPSIS
  379. X *
  380. X *    LOCAL VOID PushState ()
  381. X *
  382. X *  DESCRIPTION
  383. X *
  384. X *    Pushes the current state on the state stack, and initializes
  385. X *    a new state.  The only parameter inherited from the previous
  386. X *    state is the function nesting level.  This action can be
  387. X *    inhibited if desired, via the "r" flag.
  388. X *
  389. X *    The state stack is a linked list of states, with the new
  390. X *    state added at the head.  This allows the stack to grow
  391. X *    to the limits of memory if necessary.
  392. X *
  393. X */
  394. X
  395. XLOCAL VOID PushState ()
  396. X{
  397. X    REGISTER struct state *new;
  398. X
  399. X    new = (struct state *) DbugMalloc (sizeof (struct state));
  400. X    new -> flags = 0;
  401. X    new -> delay = 0;
  402. X    new -> maxdepth = MAXDEPTH;
  403. X    if (stack != NULL) {
  404. X    new -> level = stack -> level;
  405. X    } else {
  406. X    new -> level = 0;
  407. X    }
  408. X    new -> out_file = stderr;
  409. X    new -> functions = NULL;
  410. X    new -> p_functions = NULL;
  411. X    new -> keywords = NULL;
  412. X    new -> processes = NULL;
  413. X    new -> next_state = stack;
  414. X    stack = new;
  415. X    init_done = TRUE;
  416. X}
  417. X
  418. X
  419. X/*
  420. X *  FUNCTION
  421. X *
  422. X *    DoTrace    check to see if tracing is current enabled
  423. X *
  424. X *  SYNOPSIS
  425. X *
  426. X *    LOCAL BOOLEAN DoTrace ()
  427. X *
  428. X *  DESCRIPTION
  429. X *
  430. X *    Checks to see if tracing is enabled based on whether the
  431. X *    user has specified tracing, the maximum trace depth has
  432. X *    not yet been reached, the current function is selected,
  433. X *    and the current process is selected.  Returns TRUE if
  434. X *    tracing is enabled, FALSE otherwise.
  435. X *
  436. X */
  437. X
  438. XLOCAL BOOLEAN DoTrace ()
  439. X{
  440. X    REGISTER BOOLEAN trace;
  441. X
  442. X    trace = FALSE;
  443. X    if (TRACING) {
  444. X    if (stack -> level <= stack -> maxdepth) {
  445. X        if (InList (stack -> functions, func)) {
  446. X        if (InList (stack -> processes, _db_process_)) {
  447. X            trace = TRUE;
  448. X        }
  449. X        }
  450. X    }
  451. X    }
  452. X    return (trace);
  453. X}
  454. X
  455. X
  456. X/*
  457. X *  FUNCTION
  458. X *
  459. X *    DoProfile    check to see if profiling is current enabled
  460. X *
  461. X *  SYNOPSIS
  462. X *
  463. X *    LOCAL BOOLEAN DoProfile ()
  464. X *
  465. X *  DESCRIPTION
  466. X *
  467. X *    Checks to see if profiling is enabled based on whether the
  468. X *    user has specified profiling, the maximum trace depth has
  469. X *    not yet been reached, the current function is selected,
  470. X *    and the current process is selected.  Returns TRUE if
  471. X *    profiling is enabled, FALSE otherwise.
  472. X *
  473. X */
  474. X
  475. XLOCAL BOOLEAN DoProfile ()
  476. X{
  477. X    REGISTER BOOLEAN profile;
  478. X
  479. X    profile = FALSE;
  480. X    if (PROFILING) {
  481. X    if (stack -> level <= stack -> maxdepth) {
  482. X        if (InList (stack -> p_functions, func)) {
  483. X        if (InList (stack -> processes, _db_process_)) {
  484. X            profile = TRUE;
  485. X        }
  486. X        }
  487. X    }
  488. X    }
  489. X    return (profile);
  490. X}
  491. X
  492. X
  493. X/*
  494. X *  FUNCTION
  495. X *
  496. X *    _db_keyword_    test keyword for member of keyword list
  497. X *
  498. X *  SYNOPSIS
  499. X *
  500. X *    BOOLEAN _db_keyword_ (keyword)
  501. X *    char *keyword;
  502. X *
  503. X *  DESCRIPTION
  504. X *
  505. X *    Test a keyword to determine if it is in the currently active
  506. X *    keyword list.  As with the function list, a keyword is accepted
  507. X *    if the list is null, otherwise it must match one of the list
  508. X *    members.  When debugging is not on, no keywords are accepted.
  509. X *    After the maximum trace level is exceeded, no keywords are
  510. X *    accepted (this behavior subject to change).  Additionally,
  511. X *    the current function and process must be accepted based on
  512. X *    their respective lists.
  513. X *
  514. X *    Returns TRUE if keyword accepted, FALSE otherwise.
  515. X *
  516. X */
  517. X
  518. XBOOLEAN _db_keyword_ (keyword)
  519. Xchar *keyword;
  520. X{
  521. X    REGISTER BOOLEAN accept;
  522. X
  523. X    if (!init_done) {
  524. X    _db_push_ ("");
  525. X    }
  526. X    accept = FALSE;
  527. X    if (DEBUGGING) {
  528. X    if (stack -> level <= stack -> maxdepth) {
  529. X        if (InList (stack -> functions, func)) {
  530. X        if (InList (stack -> keywords, keyword)) {
  531. X            if (InList (stack -> processes, _db_process_)) {
  532. X            accept = TRUE;
  533. X            }
  534. X        }
  535. X        }
  536. X    }
  537. X    }
  538. X    return (accept);
  539. X}
  540. X
  541. X
  542. X/*
  543. X *  FUNCTION
  544. X *
  545. X *    Indent    indent a line to the given indentation level
  546. X *
  547. X *  SYNOPSIS
  548. X *
  549. X *    LOCAL VOID Indent (indent)
  550. X *    int indent;
  551. X *
  552. X *  DESCRIPTION
  553. X *
  554. X *    Indent a line to the given level.  Note that this is
  555. X *    a simple minded but portable implementation.
  556. X *    There are better ways.
  557. X *
  558. X *    Also, the indent must be scaled by the compile time option
  559. X *    of character positions per nesting level.
  560. X *
  561. X */
  562. X
  563. XLOCAL VOID Indent (indent)
  564. Xint indent;
  565. X{
  566. X    REGISTER int count;
  567. X    AUTO char buffer[PRINTBUF];
  568. X
  569. X    indent *= INDENT;
  570. X    for (count = 0; (count < (indent - INDENT)) && (count < (PRINTBUF - 1)); count++) {
  571. X    if ((count % INDENT) == 0) {
  572. X        buffer[count] = '|';
  573. X    } else {
  574. X        buffer[count] = ' ';
  575. X    }
  576. X    }
  577. X    buffer[count] = EOS;
  578. X    (VOID) fprintf (_db_fp_, buffer);
  579. X    (VOID) fflush (_db_fp_);
  580. X}
  581. X
  582. X
  583. X/*
  584. X *  FUNCTION
  585. X *
  586. X *    FreeList    free all memory associated with a linked list
  587. X *
  588. X *  SYNOPSIS
  589. X *
  590. X *    LOCAL VOID FreeList (linkp)
  591. X *    struct link *linkp;
  592. X *
  593. X *  DESCRIPTION
  594. X *
  595. X *    Given pointer to the head of a linked list, frees all
  596. X *    memory held by the list and the members of the list.
  597. X *
  598. X */
  599. X
  600. XLOCAL VOID FreeList (linkp)
  601. Xstruct link *linkp;
  602. X{
  603. X    REGISTER struct link *old;
  604. X
  605. X    while (linkp != NULL) {
  606. X    old = linkp;
  607. X    linkp = linkp -> next_link;
  608. X    if (old -> string != NULL) {
  609. X        free (old -> string);
  610. X    }
  611. X    free ((char *) old);
  612. X    }
  613. X}
  614. X
  615. X
  616. X/*
  617. X *  FUNCTION
  618. X *
  619. X *    StrDup   make a duplicate of a string in new memory
  620. X *
  621. X *  SYNOPSIS
  622. X *
  623. X *    LOCAL char *StrDup (string)
  624. X *    char *string;
  625. X *
  626. X *  DESCRIPTION
  627. X *
  628. X *    Given pointer to a string, allocates sufficient memory to make
  629. X *    a duplicate copy, and copies the string to the newly allocated
  630. X *    memory.  Failure to allocated sufficient memory is immediately
  631. X *    fatal.
  632. X *
  633. X */
  634. X
  635. X
  636. XLOCAL char *StrDup (string)
  637. Xchar *string;
  638. X{
  639. X    REGISTER char *new;
  640. X
  641. X    new = DbugMalloc (strlen (string) + 1);
  642. X    (VOID) strcpy (new, string);
  643. X    return (new);
  644. X}
  645. X
  646. X
  647. X/*
  648. X *  FUNCTION
  649. X *
  650. X *    DoPrefix    print debugger line prefix prior to indentation
  651. X *
  652. X *  SYNOPSIS
  653. X *
  654. X *    LOCAL VOID DoPrefix (_line_)
  655. X *    int _line_;
  656. X *
  657. X *  DESCRIPTION
  658. X *
  659. X *    Print prefix common to all debugger output lines, prior to
  660. X *    doing indentation if necessary.  Print such information as
  661. X *    current process name, current source file name and line number,
  662. X *    and current function nesting depth.
  663. X *
  664. X */
  665. X  
  666. XLOCAL VOID DoPrefix (_line_)
  667. Xint _line_;
  668. X{
  669. X    lineno++;
  670. X    if (stack -> flags & NUMBER_ON) {
  671. X    (VOID) fprintf (_db_fp_, "%5d: ", lineno);
  672. X    }
  673. X    if (stack -> flags & PROCESS_ON) {
  674. X    (VOID) fprintf (_db_fp_, "%s: ", _db_process_);
  675. X    }
  676. X    if (stack -> flags & FILE_ON) {
  677. X    (VOID) fprintf (_db_fp_, "%14s: ", file);
  678. X    }
  679. X    if (stack -> flags & LINE_ON) {
  680. X    (VOID) fprintf (_db_fp_, "%5d: ", _line_);
  681. X    }
  682. X    if (stack -> flags & DEPTH_ON) {
  683. X    (VOID) fprintf (_db_fp_, "%4d: ", stack -> level);
  684. X    }
  685. X    (VOID) fflush (_db_fp_);
  686. X}
  687. X
  688. X
  689. X/*
  690. X *  FUNCTION
  691. X *
  692. X *    OpenFile    open new output stream for debugger output
  693. X *
  694. X *  SYNOPSIS
  695. X *
  696. X *    LOCAL VOID OpenFile (name)
  697. X *    char *name;
  698. X *
  699. X *  DESCRIPTION
  700. X *
  701. X *    Given name of a new file (or "-" for stdout) opens the file
  702. X *    and sets the output stream to the new file.
  703. X *
  704. X */
  705. X
  706. XLOCAL VOID OpenFile (name)
  707. Xchar *name;
  708. X{
  709. X    REGISTER FILE *fp;
  710. X    REGISTER BOOLEAN newfile;
  711. X
  712. X    if (name != NULL) {
  713. X    if (strcmp (name, "-") == 0) {
  714. X        _db_fp_ = stdout;
  715. X        stack -> out_file = _db_fp_;
  716. X    } else {
  717. X        if (!Writable (name)) {
  718. X        (VOID) fprintf (_db_fp_, ERR_OPEN, _db_process_, name);
  719. X        perror ("");
  720. X        (VOID) fflush (_db_fp_);
  721. X        (VOID) XDelay (stack -> delay);
  722. X        } else {
  723. X        if (EXISTS (name)) {
  724. X            newfile = FALSE;
  725. X        } else {
  726. X            newfile = TRUE;
  727. X        }
  728. X        fp = fopen (name, "a");
  729. X        if (fp == NULL) {
  730. X             (VOID) fprintf (_db_fp_, ERR_OPEN, _db_process_, name);
  731. X            perror ("");
  732. X            (VOID) fflush (_db_fp_);
  733. X            (VOID) XDelay (stack -> delay);
  734. X        } else {
  735. X            _db_fp_ = fp;
  736. X            stack -> out_file = fp;
  737. X            if (newfile) {
  738. X            ChangeOwner (name);
  739. X            }
  740. X        }
  741. X        }
  742. X    }
  743. X    }
  744. X}
  745. X
  746. X
  747. X/*
  748. X *  FUNCTION
  749. X *
  750. X *    OpenProfile    open new output stream for profiler output
  751. X *
  752. X *  SYNOPSIS
  753. X *
  754. X *    LOCAL VOID OpenProfile (name)
  755. X *    char *name;
  756. X *
  757. X *  DESCRIPTION
  758. X *
  759. X *    Given name of a new file, opens the file
  760. X *    and sets the profiler output stream to the new file.
  761. X *
  762. X *    It is currently unclear whether the prefered behavior is
  763. X *    to truncate any existing file, or simply append to it.
  764. X *    The latter behavior would be desirable for collecting
  765. X *    accumulated runtime history over a number of separate
  766. X *    runs.  It might take some changes to the analyzer program
  767. X *    though, and the notes that Binayak sent with the profiling
  768. X *    diffs indicated that append was the normal mode, but this
  769. X *    does not appear to agree with the actual code. I haven't
  770. X *    investigated at this time [fnf; 24-Jul-87].
  771. X */
  772. X
  773. XLOCAL VOID OpenProfile (name)
  774. Xchar *name;
  775. X{
  776. X    REGISTER FILE *fp;
  777. X    REGISTER BOOLEAN newfile;
  778. X
  779. X    if (name != NULL) {
  780. X    if (!Writable (name)) {
  781. X        (VOID) fprintf (_db_fp_, ERR_OPEN, _db_process_, name);
  782. X        perror ("");
  783. X        (VOID) fflush (_db_fp_);
  784. X        (VOID) XDelay (stack -> delay);
  785. X    } else {
  786. X        if (EXISTS (name)) {
  787. X        newfile = FALSE;
  788. X        } else {
  789. X        newfile = TRUE;
  790. X        }
  791. X        fp = fopen (name, "w");
  792. X        if (fp == NULL) {
  793. X        (VOID) fprintf (_db_fp_, ERR_OPEN, _db_process_, name);
  794. X        perror ("");
  795. X        (VOID) fflush (_db_fp_);
  796. X        (VOID) XDelay (stack -> delay);
  797. X        } else {
  798. X        _db_pfp_ = fp;
  799. X        stack -> prof_file = fp;
  800. X        if (newfile) {
  801. X            ChangeOwner (name);
  802. X        }
  803. X        }
  804. X    }
  805. X    }
  806. X}
  807. X
  808. X
  809. X/*
  810. X *  FUNCTION
  811. X *
  812. X *    CloseFile    close the debug output stream
  813. X *
  814. X *  SYNOPSIS
  815. X *
  816. X *    LOCAL VOID CloseFile (fp)
  817. X *    FILE *fp;
  818. X *
  819. X *  DESCRIPTION
  820. X *
  821. X *    Closes the debug output stream unless it is standard output
  822. X *    or standard error.
  823. X *
  824. X */
  825. X
  826. XLOCAL VOID CloseFile (fp)
  827. XFILE *fp;
  828. X{
  829. X    if (fp != stderr && fp != stdout) {
  830. X    if (fclose (fp) == EOF) {
  831. X        (VOID) fprintf (stderr, ERR_CLOSE, _db_process_);
  832. X        perror ("");
  833. X        (VOID) fflush (stderr);
  834. X        (VOID) XDelay (stack -> delay);
  835. X    }
  836. X    }
  837. X}
  838. X
  839. X
  840. X/*
  841. X *  FUNCTION
  842. X *
  843. X *    DbugExit    print error message and exit
  844. X *
  845. X *  SYNOPSIS
  846. X *
  847. X *    LOCAL VOID DbugExit (why)
  848. X *    char *why;
  849. X *
  850. X *  DESCRIPTION
  851. X *
  852. X *    Prints error message using current process name, the reason for
  853. X *    aborting (typically out of memory), and exits with status 1.
  854. X *    This should probably be changed to use a status code
  855. X *    defined in the user's debugger include file.
  856. X *
  857. X */
  858. XLOCAL VOID DbugExit (why)
  859. Xchar *why;
  860. X{
  861. X    (VOID) fprintf (stderr, ERR_ABORT, _db_process_, why);
  862. X    (VOID) fflush (stderr);
  863. X    (VOID) XDelay (stack -> delay);
  864. X    exit (1);
  865. X}
  866. X
  867. X
  868. X/*
  869. X *  FUNCTION
  870. X *
  871. X *    DbugMalloc    allocate memory for debugger runtime support
  872. X *
  873. X *  SYNOPSIS
  874. X *
  875. X *    LOCAL char *DbugMalloc (size)
  876. X *    int size;
  877. X *
  878. X *  DESCRIPTION
  879. X *
  880. X *    Allocate more memory for debugger runtime support functions.
  881. X *    Failure to to allocate the requested number of bytes is
  882. X *    immediately fatal to the current process.  This may be
  883. X *    rather unfriendly behavior.  It might be better to simply
  884. X *    print a warning message, freeze the current debugger state,
  885. X *    and continue execution.
  886. X *
  887. X */
  888. XLOCAL char *DbugMalloc (size)
  889. Xint size;
  890. X{
  891. X    register char *new;
  892. X
  893. X    new = malloc ( size );
  894. X    if (new == NULL) {
  895. X    DbugExit ("out of memory");
  896. X    }
  897. X    return (new);
  898. X}
  899. X
  900. X
  901. X/*
  902. X *    This function may be eliminated when strtok is available
  903. X *    in the runtime environment (missing from BSD4.1).
  904. X */
  905. X
  906. XLOCAL char *strtok (s1, s2)
  907. Xchar *s1, *s2;
  908. X{
  909. X    static char *end = NULL;
  910. X    REGISTER char *rtnval;
  911. X
  912. X    rtnval = NULL;
  913. X    if (s2 != NULL) {
  914. X    if (s1 != NULL) {
  915. X        end = s1;
  916. X        rtnval = strtok ((char *) NULL, s2);
  917. X    } else if (end != NULL) {
  918. X        if (*end != EOS) {
  919. X        rtnval = end;
  920. X        while (*end != *s2 && *end != EOS) {end++;}
  921. X        if (*end != EOS) {
  922. X            *end++ = EOS;
  923. X        }
  924. X        }
  925. X    }
  926. X    }
  927. X    return (rtnval);
  928. X}
  929. X
  930. X
  931. X/*
  932. X *  FUNCTION
  933. X *
  934. X *    BaseName    strip leading pathname components from name
  935. X *
  936. X *  SYNOPSIS
  937. X *
  938. X *    LOCAL char *BaseName (pathname)
  939. X *    char *pathname;
  940. X *
  941. X *  DESCRIPTION
  942. X *
  943. X *    Given pointer to a complete pathname, locates the base file
  944. X *    name at the end of the pathname and returns a pointer to
  945. X *    it.
  946. X *
  947. X */
  948. X
  949. XLOCAL char *BaseName (pathname)
  950. Xchar *pathname;
  951. X{
  952. X    register char *base;
  953. X
  954. X    base = strrchr (pathname, '/');
  955. X    if (base++ == NULL) {
  956. X    base = pathname;
  957. X    }
  958. X    return (base);
  959. X}
  960. X
  961. X
  962. X/*
  963. X *  FUNCTION
  964. X *
  965. X *    Writable    test to see if a pathname is writable/creatable
  966. X *
  967. X *  SYNOPSIS
  968. X *
  969. X *    LOCAL BOOLEAN Writable (pathname)
  970. X *    char *pathname;
  971. X *
  972. X *  DESCRIPTION
  973. X *
  974. X *    Because the debugger might be linked in with a program that
  975. X *    runs with the set-uid-bit (suid) set, we have to be careful
  976. X *    about opening a user named file for debug output.  This consists
  977. X *    of checking the file for write access with the real user id,
  978. X *    or checking the directory where the file will be created.
  979. X *
  980. X *    Returns TRUE if the user would normally be allowed write or
  981. X *    create access to the named file.  Returns FALSE otherwise.
  982. X *
  983. X */
  984. X
  985. XLOCAL BOOLEAN Writable (pathname)
  986. Xchar *pathname;
  987. X{
  988. X    REGISTER BOOLEAN granted;
  989. X#ifdef unix
  990. X    REGISTER char *lastslash;
  991. X#endif
  992. X
  993. X#ifndef unix
  994. X    granted = TRUE;
  995. X#else
  996. X    granted = FALSE;
  997. X    if (EXISTS (pathname)) {
  998. X    if (WRITABLE (pathname)) {
  999. X        granted = TRUE;
  1000. X    }
  1001. X    } else {
  1002. X    lastslash = strrchr (pathname, '/');
  1003. X    if (lastslash != NULL) {
  1004. X        *lastslash = EOS;
  1005. X    } else {
  1006. X        pathname = ".";
  1007. X    }
  1008. X    if (WRITABLE (pathname)) {
  1009. X        granted = TRUE;
  1010. X    }
  1011. X    if (lastslash != NULL) {
  1012. X        *lastslash = '/';
  1013. X    }
  1014. X    }
  1015. X#endif
  1016. X    return (granted);
  1017. X}
  1018. X
  1019. X
  1020. X/*
  1021. X *    This function may be eliminated when strrchr is available
  1022. X *    in the runtime environment (missing from BSD4.1).
  1023. X *    Alternately, you can use rindex() on BSD systems.
  1024. X */
  1025. X
  1026. XLOCAL char *strrchr (s, c)
  1027. Xchar *s;
  1028. Xchar c;
  1029. X{
  1030. X    REGISTER char *scan;
  1031. X
  1032. X    for (scan = s; *scan != EOS; scan++) {;}
  1033. X    while (scan > s && *--scan != c) {;}
  1034. X    if (*scan != c) {
  1035. X    scan = NULL;
  1036. X    }
  1037. X    return (scan);
  1038. X}
  1039. X
  1040. X
  1041. X/*
  1042. X *  FUNCTION
  1043. X *
  1044. X *    ChangeOwner    change owner to real user for suid programs
  1045. X *
  1046. X *  SYNOPSIS
  1047. X *
  1048. X *    LOCAL VOID ChangeOwner (pathname)
  1049. X *
  1050. X *  DESCRIPTION
  1051. X *
  1052. X *    For unix systems, change the owner of the newly created debug
  1053. X *    file to the real owner.  This is strictly for the benefit of
  1054. X *    programs that are running with the set-user-id bit set.
  1055. X *
  1056. X *    Note that at this point, the fact that pathname represents
  1057. X *    a newly created file has already been established.  If the
  1058. X *    program that the debugger is linked to is not running with
  1059. X *    the suid bit set, then this operation is redundant (but
  1060. X *    harmless).
  1061. X *
  1062. X */
  1063. X
  1064. XLOCAL VOID ChangeOwner (pathname)
  1065. Xchar *pathname;
  1066. X{
  1067. X#ifdef unix
  1068. X    if (chown (pathname, getuid (), getgid ()) == -1) {
  1069. X    (VOID) fprintf (stderr, ERR_CHOWN, _db_process_, pathname);
  1070. X    perror ("");
  1071. X    (VOID) fflush (stderr);
  1072. X    (VOID) XDelay (stack -> delay);
  1073. X    }
  1074. X#endif
  1075. X}
  1076. X
  1077. X
  1078. X/*
  1079. X *  FUNCTION
  1080. X *
  1081. X *    _db_setjmp_    save debugger environment
  1082. X *
  1083. X *  SYNOPSIS
  1084. X *
  1085. X *    VOID _db_setjmp_ ()
  1086. X *
  1087. X *  DESCRIPTION
  1088. X *
  1089. X *    Invoked as part of the user's DBUG_SETJMP macro to save
  1090. X *    the debugger environment in parallel with saving the user's
  1091. X *    environment.
  1092. X *
  1093. X */
  1094. X
  1095. XVOID _db_setjmp_ ()
  1096. X{
  1097. X   jmplevel = stack -> level;
  1098. X   jmpfunc = func;
  1099. X   jmpfile = file;
  1100. X}
  1101. X
  1102. X
  1103. X/*
  1104. X *  FUNCTION
  1105. X *
  1106. X *    _db_longjmp_    restore previously saved debugger environment
  1107. X *
  1108. X *  SYNOPSIS
  1109. X *
  1110. X *    VOID _db_longjmp_ ()
  1111. X *
  1112. X *  DESCRIPTION
  1113. X *
  1114. X *    Invoked as part of the user's DBUG_LONGJMP macro to restore
  1115. X *    the debugger environment in parallel with restoring the user's
  1116. X *    previously saved environment.
  1117. X *
  1118. X */
  1119. X
  1120. XVOID _db_longjmp_ ()
  1121. X{
  1122. X    stack -> level = jmplevel;
  1123. X    if (jmpfunc) {
  1124. X    func = jmpfunc;
  1125. X    }
  1126. X    if (jmpfile) {
  1127. X    file = jmpfile;
  1128. X    }
  1129. X}
  1130. X
  1131. X
  1132. X/*
  1133. X *  FUNCTION
  1134. X *
  1135. X *    DelayArg   convert D flag argument to appropriate value
  1136. X *
  1137. X *  SYNOPSIS
  1138. X *
  1139. X *    LOCAL int DelayArg (value)
  1140. X *    int value;
  1141. X *
  1142. X *  DESCRIPTION
  1143. X *
  1144. X *    Converts delay argument, given in tenths of a second, to the
  1145. X *    appropriate numerical argument used by the system to delay
  1146. X *    that that many tenths of a second.  For example, on the
  1147. X *    AMIGA, there is a system call "Delay()" which takes an
  1148. X *    argument in ticks (50 per second).  On unix, the sleep
  1149. X *    command takes seconds.  Thus a value of "10", for one
  1150. X *    second of delay, gets converted to 50 on the amiga, and 1
  1151. X *    on unix.  Other systems will need to use a timing loop.
  1152. X *
  1153. X */
  1154. X
  1155. XLOCAL int DelayArg (value)
  1156. Xint value;
  1157. X{
  1158. X    int delayarg = 0;
  1159. X    
  1160. X#ifdef unix
  1161. X    delayarg = value / 10;        /* Delay is in seconds for sleep () */
  1162. X#endif
  1163. X#ifdef AMIGA
  1164. X    delayarg = (HZ * value) / 10;    /* Delay in ticks for XDelay () */
  1165. X#endif
  1166. X    return (delayarg);
  1167. X}
  1168. X
  1169. X
  1170. X/*
  1171. X *    A dummy delay stub for systems that do not support delays.
  1172. X *    With a little work, this can be turned into a timing loop.
  1173. X */
  1174. X
  1175. X#ifndef unix
  1176. X#ifndef AMIGA
  1177. XXDelay ()
  1178. X{
  1179. X}
  1180. X#endif
  1181. X#endif
  1182. X
  1183. X
  1184. X/*
  1185. X *  FUNCTION
  1186. X *
  1187. X *    perror    perror simulation for systems that don't have it
  1188. X *
  1189. X *  SYNOPSIS
  1190. X *
  1191. X *    LOCAL VOID perror (s)
  1192. X *    char *s;
  1193. X *
  1194. X *  DESCRIPTION
  1195. X *
  1196. X *    Perror produces a message on the standard error stream which
  1197. X *    provides more information about the library or system error
  1198. X *    just encountered.  The argument string s is printed, followed
  1199. X *    by a ':', a blank, and then a message and a newline.
  1200. X *
  1201. X *    An undocumented feature of the unix perror is that if the string
  1202. X *    's' is a null string (NOT a NULL pointer!), then the ':' and
  1203. X *    blank are not printed.
  1204. X *
  1205. X *    This version just complains about an "unknown system error".
  1206. X *
  1207. X */
  1208. X
  1209. X#if !unix && !(AMIGA && LATTICE)
  1210. XLOCAL VOID perror (s)
  1211. X#ifdef __STDC__
  1212. Xconst char *s;
  1213. X#else
  1214. Xchar *s;
  1215. X#endif
  1216. X{
  1217. X    if (s && *s != EOS) {
  1218. X    (VOID) fprintf (stderr, "%s: ", s);
  1219. X    }
  1220. X    (VOID) fprintf (stderr, "<unknown system error>\n");
  1221. X}
  1222. X#endif    /* !unix && !(AMIGA && LATTICE) */
  1223. X
  1224. X/*
  1225. X * Here we need the definitions of the clock routine.  Add your
  1226. X * own for whatever system that you have.
  1227. X */
  1228. X
  1229. X#if unix
  1230. X
  1231. X# include <sys/param.h>
  1232. X# if BSD4_3 || sun
  1233. X
  1234. X/*
  1235. X * Definition of the Clock() routine for 4.3 BSD.
  1236. X */
  1237. X
  1238. X#include <sys/time.h>
  1239. X#include <sys/resource.h>
  1240. X
  1241. X/*
  1242. X * Returns the user time in milliseconds used by this process so
  1243. X * far.
  1244. X */
  1245. X
  1246. XLOCAL unsigned long Clock ()
  1247. X{
  1248. X    struct rusage ru;
  1249. X
  1250. X    (VOID) getrusage (RUSAGE_SELF, &ru);
  1251. X    return ((ru.ru_utime.tv_sec * 1000) + (ru.ru_utime.tv_usec / 1000));
  1252. X}
  1253. X
  1254. X#else
  1255. X
  1256. XLOCAL unsigned long Clock ()
  1257. X{
  1258. X    return (0);
  1259. X}
  1260. X
  1261. X# endif
  1262. X
  1263. X#else
  1264. X
  1265. X#if AMIGA
  1266. X
  1267. Xstruct DateStamp {        /* Yes, this is a hack, but doing it right */
  1268. X    long ds_Days;        /* is incredibly ugly without splitting this */
  1269. X    long ds_Minute;        /* off into a separate file */
  1270. X    long ds_Tick;
  1271. X};
  1272. X
  1273. Xstatic int first_clock = TRUE;
  1274. Xstatic struct DateStamp begin;
  1275. Xstatic struct DateStamp elapsed;
  1276. X
  1277. XLOCAL unsigned long Clock ()
  1278. X{
  1279. X    register struct DateStamp *now;
  1280. X    register unsigned long millisec = 0;
  1281. X    extern VOID *AllocMem ();
  1282. X
  1283. X    now = (struct DateStamp *) AllocMem ((long) sizeof (struct DateStamp), 0L);
  1284. X    if (now != NULL) {
  1285. X    if (first_clock == TRUE) {
  1286. X        first_clock = FALSE;
  1287. X        (VOID) DateStamp (now);
  1288. X        begin = *now;
  1289. X    }
  1290. X    (VOID) DateStamp (now);
  1291. X    millisec = 24 * 3600 * (1000 / HZ) * (now -> ds_Days - begin.ds_Days);
  1292. X    millisec += 60 * (1000 / HZ) * (now -> ds_Minute - begin.ds_Minute);
  1293. X    millisec += (1000 / HZ) * (now -> ds_Tick - begin.ds_Tick);
  1294. X    (VOID) FreeMem (now, (long) sizeof (struct DateStamp));
  1295. X    }
  1296. X    return (millisec);
  1297. X}
  1298. X
  1299. X#else
  1300. X
  1301. XLOCAL unsigned long Clock ()
  1302. X{
  1303. X    return (0);
  1304. X}
  1305. X
  1306. X#endif    /* AMIGA */
  1307. X
  1308. X#endif    /* unix */
  1309. X
  1310. X#ifdef AMIGA
  1311. XXDelay(x)
  1312. Xint x;
  1313. X{
  1314. X    if (x) Delay(x);    /* fix Delay bug in AmigaDOS */
  1315. X}
  1316. X#endif
  1317. X
  1318. SHAR_EOF
  1319. echo "File common/dbug.c is complete"
  1320. chmod 0440 common/dbug.c || echo "restore of common/dbug.c fails"
  1321. echo "x - extracting common/db.h (Text)"
  1322. sed 's/^X//' << 'SHAR_EOF' > common/db.h &&
  1323. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/common/RCS/db.h,v 1.1 90/10/06 12:04:41 dvadura Exp $
  1324. X-- SYNOPSIS -- front end to DBUG macros.
  1325. X-- 
  1326. X-- DESCRIPTION
  1327. X--    This is a front end to Fred Fish's DBUG macros.  The intent was
  1328. X--    to provide an interface so that if you don't have the DBUG code
  1329. X--    you can still compile dmake, by undefining DBUG, if you do have
  1330. X--    the code then you can use Fred Fish's DBUG package.  Originally
  1331. X--    the DBUG stuff was copyrighted, it is now in the public domain
  1332. X--    so the need for this is not as apparent.
  1333. X-- 
  1334. X-- AUTHOR
  1335. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  1336. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  1337. X--
  1338. X-- COPYRIGHT
  1339. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  1340. X-- 
  1341. X--      This program is free software; you can redistribute it and/or
  1342. X--      modify it under the terms of the GNU General Public License
  1343. X--      (version 1), as published by the Free Software Foundation, and
  1344. X--      found in the file 'LICENSE' included with this distribution.
  1345. X-- 
  1346. X--      This program is distributed in the hope that it will be useful,
  1347. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  1348. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1349. X--      GNU General Public License for more details.
  1350. X-- 
  1351. X--      You should have received a copy of the GNU General Public License
  1352. X--      along with this program;  if not, write to the Free Software
  1353. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1354. X--
  1355. X-- LOG
  1356. X--     $Log:    db.h,v $
  1357. X * Revision 1.1  90/10/06  12:04:41  dvadura
  1358. X * dmake Release, Version 3.6
  1359. X * 
  1360. X*/
  1361. X
  1362. X#ifndef    DB_h
  1363. X#define    DB_h
  1364. X
  1365. X#ifdef DBUG
  1366. X
  1367. X#  include <stdio.h>
  1368. X#  include <dbug.h>
  1369. X
  1370. X#  define DB_ENTER(a1)                DBUG_ENTER(a1)
  1371. X#  define DB_RETURN(a1)               DBUG_RETURN(a1)
  1372. X#  define DB_VOID_RETURN              DBUG_VOID_RETURN
  1373. X#  define DB_EXECUTE(keyword, a1)     DBUG_EXECUTE(keyword,a1)
  1374. X#  define DB_PRINT(keyword,arglist)   DBUG_PRINT(keyword,arglist)
  1375. X#  define DB_PUSH(a1)                 DBUG_PUSH(a1)
  1376. X#  define DB_POP()                    DBUG_POP()
  1377. X#  define DB_PROCESS(a1)              DBUG_PROCESS(a1)
  1378. X#  define DB_FILE (stderr)            DBUG_FILE(stderr)
  1379. X#  define DB_SETJMP                   DBUG_SETJMP
  1380. X#  define DB_LONGJMP                  DBUG_LONGJMP
  1381. X
  1382. X#else
  1383. X
  1384. X#  define DB_ENTER(a1)
  1385. X#  define DB_RETURN(a1)               return (a1)
  1386. X#  define DB_VOID_RETURN              return
  1387. X#  define DB_EXECUTE(keyword, a1)
  1388. X#  define DB_PRINT(keyword,arglist)
  1389. X#  define DB_PUSH(a1)
  1390. X#  define DB_POP()
  1391. X#  define DB_PROCESS(a1)
  1392. X#  define DB_FILE(stderr)
  1393. X#  define DB_SETJMP                   setjmp
  1394. X#  define DB_LONGJMP                  longjmp
  1395. X
  1396. X#endif
  1397. X#endif
  1398. X
  1399. SHAR_EOF
  1400. chmod 0440 common/db.h || echo "restore of common/db.h fails"
  1401. echo "x - extracting common/alloc.h (Text)"
  1402. sed 's/^X//' << 'SHAR_EOF' > common/alloc.h &&
  1403. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/common/RCS/alloc.h,v 1.1 90/10/06 12:04:39 dvadura Exp $
  1404. X-- SYNOPSIS -- macros for allocating memory.
  1405. X-- 
  1406. X-- DESCRIPTION
  1407. X--    A somewhat nicer interface to malloc and calloc.
  1408. X--    Here we standardise the calling convention with a common macro
  1409. X--    interface.
  1410. X-- 
  1411. X-- AUTHOR
  1412. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  1413. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  1414. X--
  1415. X-- COPYRIGHT
  1416. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  1417. X-- 
  1418. X--      This program is free software; you can redistribute it and/or
  1419. X--      modify it under the terms of the GNU General Public License
  1420. X--      (version 1), as published by the Free Software Foundation, and
  1421. X--      found in the file 'LICENSE' included with this distribution.
  1422. X-- 
  1423. X--      This program is distributed in the hope that it will be useful,
  1424. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  1425. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1426. X--      GNU General Public License for more details.
  1427. X-- 
  1428. X--      You should have received a copy of the GNU General Public License
  1429. X--      along with this program;  if not, write to the Free Software
  1430. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1431. X--
  1432. X-- LOG
  1433. X--     $Log:    alloc.h,v $
  1434. X * Revision 1.1  90/10/06  12:04:39  dvadura
  1435. X * dmake Release, Version 3.6
  1436. X * 
  1437. X*/
  1438. X
  1439. X#ifndef ALLOC_h
  1440. X#define ALLOC_h
  1441. X
  1442. X/* DO NOT CHANGE these!  These are the definitions that the make source
  1443. X * uses for allocating memory.  They must be defined for make to compile
  1444. X * properly.
  1445. X */
  1446. X
  1447. X#if !defined(_TYPES_) && !defined(M_XENIX)
  1448. X#if defined(MSDOS) || defined(__MSDOS__)
  1449. Xtypedef unsigned size_t;
  1450. X#else
  1451. Xtypedef long size_t;
  1452. X#endif
  1453. X#endif
  1454. X
  1455. X#define    usizeof(t)    (size_t)sizeof(t)
  1456. X
  1457. X#ifdef    DBUG
  1458. X#define FREE(p)         My_free((char*)(p), __FILE__, __LINE__)
  1459. X#define MALLOC(n, t)    (t*) My_malloc((n)*usizeof(t),  __FILE__, __LINE__)
  1460. X#define CALLOC(n, t)    (t*) My_calloc((n), usizeof(t), __FILE__, __LINE__)
  1461. X#else
  1462. X#define FREE(p)         free((char*)(p))
  1463. X#define MALLOC(n, t)    (t*) malloc((unsigned int)(n)*usizeof(t))
  1464. X#define CALLOC(n, t)    (t*) calloc((unsigned int)(n), usizeof(t))
  1465. X#endif
  1466. X
  1467. X#define TALLOC(p, n, t)    if ((p = CALLOC(n, t)) == (t*)0) {No_ram();}
  1468. X
  1469. X#endif
  1470. X
  1471. SHAR_EOF
  1472. chmod 0440 common/alloc.h || echo "restore of common/alloc.h fails"
  1473. echo "x - extracting basename.c (Text)"
  1474. sed 's/^X//' << 'SHAR_EOF' > basename.c &&
  1475. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/RCS/basename.c,v 1.1 90/10/06 12:03:31 dvadura Exp $
  1476. X-- SYNOPSIS -- return pointer to last pathname component
  1477. X-- 
  1478. X-- DESCRIPTION
  1479. X--    take a file name like /fred/foo/hoe/mary.k, and return the 'mary.k'
  1480. X--    portion
  1481. X-- 
  1482. X-- AUTHOR
  1483. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  1484. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  1485. X--
  1486. X-- COPYRIGHT
  1487. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  1488. X-- 
  1489. X--      This program is free software; you can redistribute it and/or
  1490. X--      modify it under the terms of the GNU General Public License
  1491. X--      (version 1), as published by the Free Software Foundation, and
  1492. X--      found in the file 'LICENSE' included with this distribution.
  1493. X-- 
  1494. X--      This program is distributed in the hope that it will be useful,
  1495. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  1496. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1497. X--      GNU General Public License for more details.
  1498. X-- 
  1499. X--      You should have received a copy of the GNU General Public License
  1500. X--      along with this program;  if not, write to the Free Software
  1501. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1502. X--
  1503. X-- LOG
  1504. X--     $Log:    basename.c,v $
  1505. X * Revision 1.1  90/10/06  12:03:31  dvadura
  1506. X * dmake Release, Version 3.6
  1507. X * 
  1508. X*/
  1509. X
  1510. X#include <string.h>
  1511. X#include "extern.h"
  1512. X
  1513. Xchar*
  1514. Xbasename( path )
  1515. Xchar *path;
  1516. X{
  1517. X   char *p;
  1518. X   char *q;
  1519. X
  1520. X   if( *(q = path) ) {
  1521. X      for(; *(p=_strpbrk(q, DirBrkStr)) != '\0'; q = p+1 );
  1522. X      if( !*q ) {
  1523. X     for( p=q-1; p != path; --p )
  1524. X        if( strchr( DirBrkStr, *p ) == NIL(char) ) return( p+1 );
  1525. X     return( strchr(DirBrkStr, *p)?path:(p+1) );
  1526. X      }
  1527. X      path = q;
  1528. X   }
  1529. X   return( path );
  1530. X}
  1531. SHAR_EOF
  1532. chmod 0440 basename.c || echo "restore of basename.c fails"
  1533. echo "x - extracting _updctl (Text)"
  1534. sed 's/^X//' << 'SHAR_EOF' > _updctl &&
  1535. SHAR_EOF
  1536. chmod 0640 _updctl || echo "restore of _updctl fails"
  1537. echo "x - extracting _install (Text)"
  1538. sed 's/^X//' << 'SHAR_EOF' > _install &&
  1539. XINSTALLATION INSTRUCTIONS
  1540. X
  1541. XThis file contains the instructions required to install and create the
  1542. Xappropriate version of dmake.
  1543. X
  1544. X
  1545. XMAKING THE PROPER VERSION
  1546. X
  1547. XIn order to use dmake you must first make the correct version.  As shipped
  1548. Xthere exist several versions that you can make:
  1549. X
  1550. X    bsd43       - Generic BSD 4.3 (eg, true BSD, apollo, sun OS4, SGI etc)
  1551. X    bsd43uw       - Generic BSD 4.3 at U of Waterloo
  1552. X    bsd43vf       - Generic BSD with no vfprintf in its library  (use this
  1553. X             target if you are missing vfprintf function in your
  1554. X             C library)
  1555. X    sysvr3       - Generic SysV R3 UNIX
  1556. X    sysvr1       - Generic SysV R1 UNIX
  1557. X    386ix      - 386/ix (SysV R3), not tested
  1558. X    dynix      - Sequent Symmetry dynix
  1559. X    ultrix       - Ultrix 3.0 system
  1560. X    mips       - Any MIPS box
  1561. X        tcc        - DOS with tcc 2.0"
  1562. X        tccswp     - swapping DOS version with tcc 2.0"
  1563. X        msc        - DOS with MSC 4.0 to 5.1"
  1564. X        msc60      - DOS with MSC 6.0"
  1565. X        mscswp     - swapping DOS version with MSC 4.0 to 5.1"
  1566. X        msc60swp   - swapping DOS version with MSC 6.0"
  1567. X
  1568. XThe file 'makefile' understands these targets and runs the appropriate script
  1569. Xto create the correct version.
  1570. X
  1571. XThe source code is organized as follows:
  1572. X
  1573. X            dmake         [source for all common functions]
  1574. X              |
  1575. X              |
  1576. X             -----------
  1577. X             |           |
  1578. X            unix     msdos    [source for OS specific functions]
  1579. X             |         |
  1580. X  ----------------------     -------------
  1581. X  |         |          |     |           |
  1582. X386ix     bsd43    sysvr3  tccdos     mscdos    [source for OSRELEASE specific
  1583. X        |                     functions]
  1584. X    --------
  1585. X    |      |
  1586. X       uw      vf
  1587. X
  1588. X
  1589. XEach of the directories (eg. bsd43, mscdos, tccdos, and sysvr3) contain source
  1590. Xthat is specific to that release of the OS (and possibly C-library)
  1591. XTo make the apropriate versions of dmake, simply type the command
  1592. X
  1593. X    'make system'
  1594. X
  1595. Xwhere system is one of the supplied possibilities.  For a complete list
  1596. Xof the versions you can make, see the comments in the file 'makefile', or
  1597. Xtype 'make'.
  1598. X
  1599. XThe bootstrapping of dmake is accomplished by running a shell script with the
  1600. Xappropriate compile commands hard coded.
  1601. X
  1602. X(NOTE:  If you are using MSDOS then, you will actually be using the make.bat
  1603. X    scriptfile to make the correct version of dmake for MSDOS.  If you
  1604. X    are running a SHELL other than command.com, you may have to perform
  1605. X    some extra work to invoke the batch file.
  1606. X    
  1607. X    Make sure you read the _readme.dos file before attempting to make the
  1608. X    MSDOS version, as it contains important configuration and limitation
  1609. X    information.)
  1610. X
  1611. XThe making of dmake, echoes the commands being executed, and should proceed
  1612. SHAR_EOF
  1613. echo "End of part 24"
  1614. echo "File _install is continued in part 25"
  1615. echo "25" > s2_seq_.tmp
  1616. exit 0
  1617.  
  1618.